科学网

 找回密码
  注册

tag 标签: 文本

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

python 文本读写 及从一个文件写到另一个文件
xiaoairen322 2020-5-25 11:58
with open(C:\\\\Users\\\\Administrator\\\\Desktop\\\\23\\\\56.txt, a, encoding=utf-8) as g: g.write(name,,y,x,h) f= open (C:\\\\Users\\\\Administrator\\\\Desktop\\\\23\\\\sy.txt,r,encoding=utf-8) for line in f.readlines(): with open (C:\\\\Users\\\\Administrator\\\\Desktop\\\\23\\\\56.txt,a,encoding=utf-8) as g: g.write(\\n) g.write(line) g.close() 兴趣点 读写 r w 增加 a 获取所需格式的数据 与pandas 进行联动 写成函数
个人分类: python 语言学习|4141 次阅读|0 个评论
如何用 Python 和正则表达式抽取文本结构化信息?
wshuyi 2019-9-26 07:47
简单、直接、高效地从文本中提炼关键内容。让你体验正则表达式的威力。 痛点 很多人的日常工作,都是要和大量的文本打交道的。 例如学者需要阅读大量的文献材料,从中找到灵感、数据与论据。 学生需要阅读很多教科书和论文,然后写自己的报告或者做幻灯。 财经分析师,需要从大量的新闻报道中,找到行业的发展趋势和目标企业动态的蛛丝马迹。 不是所有的文本处理,都那么新鲜而有趣。 有一项重要但繁琐的工作,就是从大量的文本当中抽取 结构化 的信息。 许多数据分析的场景,都要求输入结构化的信息。 例如在咱们之前介绍过的《 贷还是不贷:如何用 Python 和机器学习帮你决策? 》和《 如何用 Python 和深度神经网络锁定即将流失的客户? 》中,你都看到了,机器模型更喜欢被 结构化 的表格信息来喂养。 然而,结构化的信息,不一定就在那里,静候你来使用。很多时候,它蕴藏在以往生成的非结构化文本中。 你可能早已习惯,人工阅读文本信息,把关键点摘取出来,然后把它们拷贝粘贴放到一个表格中。从原理上讲,这样做无可厚非。但是实际操作里面,效率太低,而且太麻烦。 大部分人,是不愿意从事这种简单重复的枯燥工作的。 一遍遍机械重复鼠标划定文本范围,“Ctrl+C”、切换到表格文档、找准输入位置,再 “Ctrl+V”…… 这种事儿做得太多,对你的肩肘关节,甚至是身心健康,都有可能造成不利影响。 想不想尝试用一种更简单的 自动化 方式, 替你 快速完成这些烦人的操作步骤呢? 读过本文后,希望你能找到答案。 样例 这里,我们举一个 极端简化 的中文文本抽取信息例子。 之所以这样做,是为了 避免 你在解读数据上花费太多时间。 我更希望,你能够 聚焦 于方法,从而掌握新知。 假设一个高中班主任,高考后让班长统计一下学生们的毕业去向。班长很认真地进行了调查,然后做了如下汇报: 张华考上了北京大学 李萍进了中等技术学校 韩梅梅进了百货公司 …… 为了让你对样例足够熟悉,甚至有共鸣,这里我从 1998 年版的新华字典中,“借鉴” 了部分内容。 够贴心吧? 现实生活中,一个班大概不会只有 3 个人,因此你可以想象这是一个长长的句子列表。 但其实班主任有个隐含的意思没有表达出来,即: 我想要一张 表格 ! 所以,看到这一长串的句子,你可以想象他的表情。 班长估计也很难堪: 想要表格你早说啊! 这时候,假设你是班长,怎么办? 信息都在文本里面。但如果需要转换成表格,就得一个个信息点去寻找和处理。 其实,对于四五十人的班级来说,手动操作也不是什么太难的事情。 但是设想一下,如果你需要处理的数据量,是这个例子的十倍、百倍甚至千万倍呢? 继续坚持手动处理? 这不仅麻烦,而且不现实。 我们需要找到一种简单的方法,帮助我们 自动抽取 相应的信息。 此处我们使用的方法,是 正则表达式 。 正则 “正则表达式” 这个名字,初听起来好像很玄妙。实际上,它是从英文 “regular expression” 翻译过来的。 如果译成白话,那就是 “有规律的表述形式”。 这,听起来,是不是就更加接地气了? 但是,给你补一下 “假行家 101” 课程: 说别人听得懂的话,你能唬得住谁? 约定俗成,咱们继续沿用 “正则表达式”,来称呼它好了。 从创生之日起,它就给文本处理带来了高效率。 但是,用它的主要人群,却不是时常跟文字打交道的作家、编辑、学者、文员,而是…… 程序员! 程序员写的代码,是文本;程序员处理的数据,很多也是文本格式。其中便有很多显著的规律可循。 正是靠着正则表达式这种独门秘籍,许多别人做起来,需要昏天黑地一整周的任务,程序员可以半小时搞定,然后喝着咖啡等下班。 即便到了泛人工智能的今天,正则表达式依然有许多令你意想不到的应用。 例如人机对话系统。 你可能看了新闻报道,总以为人机对话都是靠着 知识图谱 或者 深度学习 搞出来的。 不能说这里面,没有上述炫酷技术的参与。但它们充其量,只占其中一部分,或许还只是一小部分。 生产实践里面,大量的对话规则后面,并不是让你倍感神奇深奥的神经网络,而是一堆正则表达式。 你可能会担心,这样高端的应用技术,自己能掌握吗? 答案是: 当然! 正则表达式,并不难学。 尤其是当你把它和 Python 结合到一起,那简直就是 效率神器 了。 我们这就来看看,正则表达式怎么帮我们识别出样例文本里面 “人名” 和 “去向” 信息。 试练 请你开启一个浏览器,键入这个网址( https://regex101.com/ )。 你会看见如下界面。 它可是一个正则表达式实验的利器。我教 INFO 5731 课程时,学生们就是在掌握了这个工具以后,迅速玩儿转了正则表达式。 这么好的工具,一定要价不菲吧? 不,它是 免费 的。你放心大胆使用就好了。 我们首先把左侧的编程语言,从默认的 PHP ,调整为 Python。 之后,把需要进行处理的文本,贴到中间空白的大文本框里面。 下面我们来尝试进行 “ 匹配 ”。 什么叫做匹配呢? 就是你写一个表达式,电脑便拿着鸡毛当令箭,在每一行文本上,都认认真真地找有没有符合该表达式的文本段落。 如有,则会高亮显示出来。 这里我们观察一下,发现每个句子里面,人员去向前面,都有一个 “了” 字。 好,我们就在中部上方小文本框里,把 “了” 字输入进去。 可以看到,三句话里面的 “了”,全都 亮了 。 这就是你接触到的第一种匹配方式 —— 按照字符原本的意思来查找一致的内容。 因为样例文本的规律性,我们可以把 “了” 当成一个定位符,它后面,到句子结束位置,是 “去向” 信息。 咱们需要找的一半结构化信息,不就是这个 “去向” 吗? 我们尝试匹配 “去向”。 怎么匹配呢?这次每一行的字儿都不一样啊? 没关系,正则表达式强大之处,此时就显示出来了。 你可以用一个点号,也就是 . ,表示 任意 字符。 字母、数字、标点…… 甚至是中文,也能涵盖在内。 然后我们继续想想看,去向信息这里,会有 几个字 呢? 不好说。 例子里面这简单的三句话,就有 “4 个字” 或者 “6 个字” 两种情况。 所以,我们无法指定去向信息里面字符的长度。 但这也没关系,我们只需要用一个星号( * ),就可以代表出现次数,从 0 到无穷大 都可以匹配。 当然,实际情况中,是不会真出现无穷大的。 我们在刚才输入的基础上,加上 .* ,结果就成了这个样子: 不错嘛! 不过似乎去向信息和 “了” 字儿都是一样颜色的高亮。那不就混到了一起吗? 我们可不想这样。 怎么办? 请你在 .* 的两侧,尝试加入一对小括号(注意,不要用中文全角符号)试试看。 你会发现,这次 “了” 依然用蓝色表示,而后面的去向信息,已经变成了绿色。 这一对小括号,很重要,它叫做 “分组”,是提取信息的基本单位。 我们的任务已经解决了一半了,是吧? 下面我们来尝试把人名一并抽取出来。 我们来找人名的锚定位置。 细细观察,你不难发现,每个人名的后面,都有个动词跟着。 升学的同学,用的是 “考” 字,而就业的同学,用的是 “进” 字。 我们先尝试一下 “考” 字。 这里我们尝试直接把 “考” 字放在 “了” 字以前。但是你会发现,什么匹配结果也没有。 为什么? 回看数据,你会发现,人家用的原词是 “考上了”。 当然这里我们可以输入 “上” 字。不过你要考虑一下更为通用的情况。 好比说,“考取了” 怎么办?“考入了” 呢? 更好的方式,是继续使用我们刚才学会的 “大招”,在 “考” 和 “了” 之间,插入一个 .* 。 这时候,你的正则表达式的样子是 考.*了(.*) 看,第一行的信息成功匹配了吧? 但是,那后面还有两行没有匹配,怎么办? 我们依样画葫芦,就会发现,使用 进.*了(.*) 就能正确匹配后两行。 问题来了: 匹配第一行的,匹配不了后两行,反之亦然。 这不好。我们希望写的表达式,能够更 通用 。 怎么办? 我们看看正则表达式当中 “或” 关系的表示。 这里,我们可以把两个字符用竖线隔开,旁边用中括号括起来,代表两者任一出现,都算匹配成功。 也就是,把正则表达式,写成这样: .*了(.*) 太棒了,三行的内容都已经匹配成功。 这里,动词词组,和代表时态的 “了” 作为中间锚定信息,我们可以放心大胆,把之前的人名信息,提取出来了。 也就是这样写: (.*) .*了(.*) 注意此时,人名分组是绿色,去向分组是红色的。 我们成功提取了两组信息!庆祝一下! 可是,如果你给班主任看这里的结果,估计他不会满意。 表格,我要表格! 别着急,该 Python 出场了。 下面我们尝试在 Python 把数据正式提取出来。 环境 本文的配套源代码,我放在了 Github 上。 你可以在我的公众号 “玉树芝兰”(nkwangshuyi)后台回复 “regex”,查看完整的代码链接。 如果你对我的教程满意,欢迎在页面右上方的 Star 上点击一下,帮我加一颗星。谢谢! 注意这个页面的中央,有个按钮,写着 “在 Colab 打开”(Open in Colab)。请你点击它。 然后,Google Colab 就会自动开启。 我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。 Colab 为你提供了全套的运行环境。你只需要依次执行代码,就可以复现本教程的运行结果了。 如果你对 Google Colab 不熟悉,没关系。我 这里有一篇教程 ,专门讲解 Google Colab 的特点与使用方式。 为了你能够更为深入地学习与了解代码,我建议你在 Google Colab 中开启一个全新的 Notebook ,并且根据下文,依次输入代码并运行。在此过程中,充分理解代码的含义。 这种看似笨拙的方式,其实是学习的有效路径。 代码 首先,读入 Python 正则表达式包。 import re 然后,我们把数据准备好。注意为了演示代码的通用性,我这里在最后加了一行文字,区别于之前的文字规律,看看我们的代码能否正确处理它。 data= 张华考上了北京大学 李萍进了中等技术学校 韩梅梅进了百货公司 他们都有光明的前途 然后,该写正则表达式了。你真的需要自己手动来写吗? 当然不必。 强大的 regex101 网站,已经帮助我们准备好了。 请你点击上图中红色圈出的按钮,网站会为你准备好一个初始代码的模板,可以匹配你需要的模式。 你不需要完全照搬代码。其中有这样一句,是很重要的,拷贝过来,贴到 Colab Notebook 就好。 regex= r(.*) .*了(.*) 以上就是你的正则表达式,在 Python 里面应有的样子。 我们准备一个空列表,用来接收数据。 mylist= 不错,一个不多,一个不少,恰好是我们需要的。 我们要把它导出成为表格。方法有很多,但是最简便顺手的,是用 Pandas 数据分析软件包。 import pandas as pd 只需要利用 pd.DataFrame 函数,我们就能把上面列表和元组(tuple)组成的一个二维结构,变成数据框。 df=pd.DataFrame(mylist) df.columns= 注意,这里我们还非常细心地修改了表头。 看看你的劳动成果吧: df 有了数据框,转换成为 Excel ,就是一行代码的事情了: df.to_excel( dest.xlsx ,index= False ) 进入 Files 标签页,刷新并且查看一下当前目录下的内容: 这个 dest.xlsx 就是输出的结果了。下载之后我们可以用 Excel 打开查看。 任务完成! 你可以把结果提交给班主任,看他满意的笑容了。 小结 这篇教程里面,咱们谈了如何利用文本字符规律,借助 Python 和正则表达式,来提取结构化信息。 希望你已经掌握了以下本领: 了解正则表达式的功用; 用 regex101 网站尝试正则表达式匹配,并且生成初步的代码; 用 Python 批量提取信息,并且根据需求导出结构化数据为指定格式。 再次强调一下,对于这么简单的样例,使用上述方法,绝对是大炮轰蚊子。 然而,如果你需要处理的数据是海量的,这个方法给你节省下来的时间,会非常可观。 希望你能够举一反三,在自己的工作中灵活运用它。 资源 先别急着走。 由于篇幅所限,教程中我只给你介绍了几项最简单正则语法。肯定会有很多你感兴趣的语法知识,没来得及一一讲给你听。 如果你对于正则表达式很感兴趣,因为科研或者工作目的,需要马上学习,也请不要着急。 我这里刚好有一份 免费的 优秀教程资源分享给你。 我在 UNT 讲授 INFO 5731 课程的时候,就是用这份教程结合翻转教学,让从没听说过正则表达式的学生们,在一两周之内掌握并且熟练应用。相信对你来说,这份教程资源也会很有用。 你可以在我的公众号 “玉树芝兰”(nkwangshuyi)后台回复 “regex”,查看教程链接。 祝学习愉快! 喜欢别忘了 点赞 。 还可以微信关注我的公众号 “玉树芝兰”(nkwangshuyi) 。别忘了 加星标 ,以免错过新推送提示。 如果本文可能对你身边的亲友有帮助,也欢迎你把本文通过微博或朋友圈分享给他们。让他们一起参与到我们的讨论中来。 延伸阅读 你可能也会对以下话题感兴趣。点击链接就可以查看。 学 Python ,能提升你的竞争力吗? 如何高效学 Python ? 《文科生数据科学上手指南》分享 Richard 在 DFW Open Data Day 的分享幻灯 题图: Photo by Tim St. Martin on Unsplash
3533 次阅读|0 个评论
基于多示例学习框架的专利文本分类方法研究
terahertz 2018-11-26 16:43
(本文发表于《情报理论与实践》2018年第11期) 摘要 [目的/意义]为了满足对海量专利数据进行自动分类的需求,提出了一种基于多示 例学习框架的专利文本分类方法。[方法/过程]将专利文本当作包,专利文本的标题和 摘要分别作为两个示例,通过数学建模将专利文本映射成无向图,构建基于无向图的高 斯核函数,运用SVM方法训练分类器,完成对无标记专利文本的预测。[结果/结论]实 验结果表明,该方法相较于传统的SVM、KNN方法能更加有效准确地预测未标记专利文 本的分类,为文本挖掘领域相关方向的研究提供新的视角。[局限]实验样本数量有待 进一步丰富。 关键词 :专利文本分类,多示例学习,分类方法,支持向量机 链接:基于多示例学习框架的专利文本分类方法研究 http://www.itapress.cn/CN/abstract/abstract515.shtml
个人分类: 发表论文|2252 次阅读|0 个评论
学习小组讨论文本记录格式
lixyong 2017-9-30 10:38
1602 第六组全体人员 组长:孙丽丽 成员:施军霞、田小倩、周玮青、赵玉玉、张梦想 小组长:孙丽丽 讨论地点:综105 讨论内容:管理者的道德与素质 孙丽丽 (1)观点: (2)提出的问题: 施军霞(1)观点: (2)提出的问题: 田小倩(1)观点: (2)提出的问题: 周玮青(1)观点: (2)提出的问题: 赵玉玉、张梦想(1)观点: (2)提出的问题: 张梦想(1)观点: (2)提出的问题: 小组总结(1)观点: (2)提出的问题: (3)提出老师: (4)质疑其他同学、老师观点: (5)。。。。。 (6)。。。。。。 汇总给学习委员的内容或观点: (1) (2) (3)。。。。
个人分类: 职业思考|2797 次阅读|0 个评论
在争议中提高自己
热度 9 xin 2017-8-23 12:10
厌恶一个人,喜欢一个人,似乎没有多少道理,都是一种直觉和个人偏好。这叫罗卜白菜各有所爱,也是情人眼里出西施。如果对自己的口味了,就由衷的喜欢。如果不对口味,气场不和,即使百般取悦也不能满足对方。 记得高中的时候,我作文的文风和书法已基本稳定,但不同老师对此评判,差异很大,颇有几分争议。 高一时,语文老师,浪荡形骸,但水平极高,对我文风和书法,嗤之以鼻,难入其法眼。每次最后判分之后,都在卷面上再扣我四分。他甚严厉,从不敢追问为何?偶尔,旁敲侧击,他回答说我不好好的写字。高二和高三时,语文老师是他学生,对我文风和书法似乎赞赏有加,每次卷面分常常加四分。问其原因,说我写的清楚。同样一件事情,不同老师差异甚大。 高一语文老师燃起我的斗志,让我感受语言之美,醉心古文,只可惜教了我一年就去区教委当调研员了。高二高三的语文老师,给我信心,让我感到自己有所不同。评判有正面和负面,都能从中有所裨益。 同理,同样一份基金本子。有的人会赞赏有加,觉得需要资助、甚至优先资助,因为基础好、立意好、对理论和应用有价值,缺点几乎都不提了,就算有也不是事了。但也有的人刚好相反,从大面上说的一无是处,没有一句褒奖之词,然后从文本里面挑出个60°C当死手,做实枪毙之结果。 正面的评价给我们信心,让我们感到人生难得遇到一位知己。负面的评价,让我们看到自己不足,更加严格地要求自己。这都是评议人的权利,我们只有尊重,让自己内心变得强大,平时提高自己学术水平,变得无可挑剔。负气并不解决问题,只是觉得时间蹉跎,大好青春就这样过去了,实在是可惜。 照片是高一语文老师孙春雨先生
4584 次阅读|18 个评论
[转载]使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)
fandos 2017-3-26 23:00
本文转载自: 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) http://www.ilovematlab.cn/thread-872-1-1.html (出处: MATLAB中文论坛) 特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在“txt 文件的读取”上。除了标注了“转”之外,其余心得均出于本人经验之结果,欢迎大家指正、补充。 一. 基本知识: --------------------------------------------------转---------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节(byte) 组成的, 那么文本文件中的每个字节的最高位都是0,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的0和1,但是打开方式不同,对于这些0和1的处理也就不同。如果按照文本方式打开,在打开的时候会进行translate,将每个字节转换成ASCII码,而以按照二进制方式打开的话,则不会进行任何的translate;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节(byte);而对二进制文件进行编辑的话,最小单位则是位(bit),当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为ASCII码文件和二进制码文件两种: ASCII文件也称为文本文件,这种文件在磁盘中存放时每个字符对应一个字节,用于存放对应的ASCII码。例如,数5678的存储形式为: ASCII码: 00110101 00110110 00110111 00111000 ↓  ↓      ↓   ↓ 十进制码: 5     6   7      8 共占用4个字节。ASCII码文件可在屏幕上按字符显示,例如源程序文件就是ASCII文件,用DOS命令TYPE可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数5678的存储形式为:00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。C系统在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。输入输出字符流的开始和结束只由程序控制而不受物理符号(如回车符)的控制。因此也把这种文件称作“流式文件”。 2. 文本模式(textmode)和二进制模式(binarymode)有什么区别? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达255个字符,其中回车/换行将被转换为换行符“\n”,(如果以文本方式打开一个文件,那么在读字符的时候,系统会把所有的\r\n序列转成\n,在写入时把\n转成\r\n )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n一般会操作系统被翻译成行的结束,即LF(Line-Feed) \r会被翻译成回车,即CR(Cariage-Return) 对于文本文件的新行,在UNIX上,一般用\n(LF)来表示,Mac上用\r(CR)来表示, Windows上是用\n\r(CR-LF)来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件(例如图形或字处理文档),或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把“0D 0A”自动变换成“\n”来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是,Unicode/UTF/UCS格式的文件,必须用二进制方式打开和读写。 --------------------------------------------------------------------------------------------------------- 上述基础其实大可以略过,简言之,对用户来说:在 matlab 中存储成为二进制还是文本文件取决于fopen的方式,如果用wt,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用w则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或UltraEdit等工具打开。 二. Matlab的I/O文件操作使用技巧和总结: 1. Matlab 支持的I/O文件(对应“取/存”操作)类型:(所有文件I/O程序不需要特殊的工具箱) http://www.mathworks.com/support/tech-notes/1100/1102.html (注:从上表可以看到,matlab不支持doc格式的文档存取(因为doc文档包含很多格式控制符),请改用txt或者dat格式) 2. Matlab 的I/O文件指南: http://www.mathworks.com/support/tech-notes/1600/1602.html 以下是部分对应的中文译文: --------------------------------------------------------------转---------------------------------------- 本技术支持指南主要处理:ASCII, binary, and MAT files. 要得到MATLAB中可用来读写各种文件格式的完全函数列表,可以键入以下命令: help iofun MATLAB中有两种文件I/O程序:high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件(text file)想导入MATLAB,你可以调用一些low level routines自己写一个函数,或者是简单的用TEXTREAD函数。 使用high level routines的关键是:文件必须是相似的(homogeneous),换句话说,文件必须有一致的格式。下面的段落描述一些high level file I/O routines并给出一些例子帮助理解概念。 LOAD/SAVE 主要的high level file I/O routines 是LOAD 和 SAVE函数。LOAD 可以读MAT-file data或者用空格间隔的格式相似的ASCII data. SAVE可以将MATLAB变量写入MAT-file格式或者空格间隔的ASCII data。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE/UIPUTFILE是基于图形用户界面(GUI)的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。UIGETFILE让你选择一个文件来写(类似Windows ‘另存为’选项?)。用UIGETFILE,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意: UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT是一个功能强大,易于使用的基于GUI的high level routine,用于读complex data files。文件也必须是homogeneous。 IMPORTDATA形成UIIMPORT的功能,不打开GUI。可以将IMPORTDATA用于函数或者脚本中,因为在函数或者脚本中基于GUI的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','') % 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构D的数据和文本域,来看结构D中的真实值,例如输入: data = D.data text = D.textdata 可以用UIIMPORT读同一个文件并得到同样的结构. 注意: 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态high level routine,设计用来读ASCII格式的文本和/或数值数据文件。STRREAD除是从字符串而不是文件读以外,类似于TEXTREAD。 两个函数可以用许多参数来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “两全其美”的方法,因为他们可以用一个命令读入混合的ASCII和数值数据(high level routines的做法),并且你可以改变他们以匹配你特定的应用(如同low level routines做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft.m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers % This command reads in only the numeric data in the file. The % 'headerlines' property is used to move down to the first row % of interest and the first column of text is ignored with the % '*' operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE函数能够读写分隔的ASCII data,而不是用low level routines。他们比low level routines容易使用,Low level routines用几行代码实现的功能可以用DLMREAD/DLMWRITE简化成一行。 CSVREAD用来读分隔符是逗号的文件,是DLMREAD的特殊情况。当读空格和Tab分隔的电子数据表文件时,DLMREAD特别有用。以'sample_file.txt'为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前3列后3行,到矩阵D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意: 保证DLMREAD and DLMWRITE指定范围的指标从0开始,而不是从1开始。 WK1READ/WK1WRITE WK1READ 用来读Lotus123 电子数据表文件的数据;WK1WRITE用来写矩阵到Lotus123 电子数据表文件。 XLSREAD XLSREAD用来读Excel的数值和文本数据。 --------------------------------------------------------------------------------------------------------- 三. 具体例子分析: Matlab网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答:对于这个txt文件,由于各行列数相同,故简单地使用load,importdata均可。 2.字段名(中、英文字段均可)+数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答:由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN),故直接使用 importdata 便可。 3.注释(含有独立的数字串)+数据(列数相同): 问题:这个文件有4列,但前6行是文字说明,4列数字是从第8行开始的.现在我想把这个文件的前2列和文字说明提出来组成一个新的dat文件 源文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答:由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用importdata, load等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: -------------------------------------转 --------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57 %数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串)+数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答:直接用 importdata 便可 注:有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第3种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件: CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: --------------------------------------------转-------------------------------------- CODE: function =distilldata(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中 %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n %判断一行中有没有字符(+-.Ee和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6.各列数据的分离: 源文件: CODE: 0 + 47038.7 1.05 09:26:07 C 2 + 46477.7 1.03 09:28:38 C 4 + 44865.7 1.04 09:28:48 C 6 + 41786.4 1.03 09:28:56 C 8 + 39896.0 0.97 09:29:03 C 10 + 37518.4 0.93 09:29:15 C 12 + 35858.5 0.92 09:29:30 C 14 + 46105.0 1.03 09:30:21 C 16 + 46168.6 6.89 09:30:30 C 18 + 48672.3 4.33 09:30:40 C 20 + 49565.7 0.49 09:30:48 C 22 + 49580.7 0.53 09:30:55 C 24 + 49602.3 0.84 09:31:03 C 26 + 49582.5 1.51 09:31:11 C 28 + 49577.0 1.39 09:31:19 C 30 + 49589.3 0.61 09:31:27 C 32 + 49578.3 1.06 09:31:29 C 34 + 49512.5 1.77 09:31:38 C 解答:直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四. 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取mat文件时可省略) 3. load data.txt和A=load(‘data.txt’)的区别请参阅精华贴: 写给学习 matlab 的新手们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个错误的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32');%把t中的数据全部读出,即s矩阵。 fclose(fid); 此时得到的dd, ll 是错误且无意义的! 五. 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第i个文件的文件名就可以表示为 filename(i).name 文件数量为:length(filename) 方法二: 先在Windows的 MSDOS(命令行)中使用以下命令生成一个list.txt文件: dir path\folder /on /b /s path\list.txt 举例:dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到list细胞矩阵中,最后对filename{i}便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是m*n的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是m*n的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个数组里面去。 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题:可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例1到例5各种情形,不过由于存在自动判断,对某些例子(如例1)效率自然要低一点,而对于另外的例子(如例3、例5)效率估计要高一点(少用了一个循环)。 CODE: function =distilldata_eight(infile) %功能说明: %将保存数据的原始文件中的数值数据读入到一个data变量中(自动判断数据行) %使用说明: % infile——原始数据文件名; % data=数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件(.list) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; %正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高matlab运行速度和节省空间的一点心得(之三))。另外,也可参考《深入浅出MATLAB 7_X混合编程》一书第一章 6. 读取整个txt文件的内容(获得文件中的所有字符): CODE: f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: QUOTE: a1: 123 a2: 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); 相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end fclose(fid); Matlab中文论坛: www.iLoveMatlab.cn
个人分类: 绊脚石系列|1792 次阅读|0 个评论
Python提取网页中的文本
xyzg198891 2016-11-13 16:01
import re import urllib from bs4 import BeautifulSoup url = http://journals.plos.org/plosone/article?id=info%3Adoi/10.1371/journal.pone.0162069 response = urllib.urlopen(url) page = response.read() soup = BeautifulSoup(page, lxml) # kill all script and style elements for script in soup( ): script.extract() # rip it out # get text text = soup.get_text() # break into lines and remove leading and trailing space on each lines = (line.strip() for line in text.splitlines()) # break multi-headlines into a line each chunks = (phrase.strip() for line in lines for phrase in line.split( )) # drop blank lines text = '\n'.join(chunk for chunk in chunks if chunk) #print(text) #This command will create the ouput.txt file for you. output = open(ouput.txt,a+) #The format of text is unicode. output.write(text.encode(utf-8)) output.close()
个人分类: Python|5210 次阅读|0 个评论
基于机器学习的专利文本分类算法研究综述
terahertz 2016-9-5 16:48
(本文发表于《图书情报研究》2016年第3期P79-86) 摘要: 总结国内外专利文本分类情况,简要叙述基于机器学习的专利文本分类的一般框架,介绍专利文本分类的文本预处理、特征提取、文本表示、构建分类器及效果评价等过程。将应用于专利文本分类的机器学习算法分为单一分类算法和组合分类算法着重探讨:单一分类算法主要有 NB 算法、 ANN 算法、 Rocchio 算法、 KNN 算法、 SVM 算法等; 组合分类算法主要有两种组合算法,如 NB-KNN 算法、 Rocchio-KNN 算法、 KNN-SVM 算法, SVM- 其它算法,还有多种组合算法。指出 各种机器学习算法应用在专利文本分类上的优势与不足,从专利文本预处理、特征提取、专利文本表示、分类器的构建、新方法的探索等五个方面对专利文本自动分类技术进行展望。 关键词: 专利文本;自动分类;机器学习;朴素贝叶斯;支持向量机
个人分类: 发表论文|4502 次阅读|0 个评论
Blackberry text readers
smallland 2015-4-23 09:26
Blackberry text reader 古董级的软件,安卓天下,用户越来越少,但总还是有人用。 Word2go,Repligo,Anyview,就不用说了,版面中规中矩。Repligo的reading view,跟纯文本阅读器差不多。Anyview的用户设置也很丰富,但没有模式的快速切换。 Buku Reader也试了一下:安装和运行需要BBM(BBM没法用不要紧,装上就行),白天黑夜两种模式,还有温柔型颜色,还有滑动的翻页,别的纯文本阅读器比不上。但好像,打开后,即使在后台,机器背光不灭。另,不能随意改变阅读进度。 两款国产,一个GBBReader, 一个豆豆。豆豆,配色方案预定了几个,不够选择的。还有,英文排版换行乱套(国产的嘛)。GBBReader,用户设置、快速设置、阅读模式等,超越Anyview,唯一的问题是英文排版不够好,字体难看,尤其是两端对齐,不认字的看起来整齐,但一个单词像拉面一样也不好。 作为纯文本阅读器,如果不考虑模式切换,无疑是Anyview;如果综合考虑,还是用GBBReader。
1896 次阅读|0 个评论
[转载]Cpp读写文本文件、统计文件的行数、读取文件数据到数组
depengchen 2014-12-30 19:51
#include iostream #include fstream #include iomanip using namespace std; int main(int argc,char* argv ; fstream outfile(com.txt,ios::in); coutcom.txt的内容为endl; while(!outfile.eof()) { outfile.getline(buffer,256,'\n'); //getline(char*,int,char)表示该行字符达到256个或者遇到换行就结束。 if(outfile.eof()) break; coutbufferendl; } outfile.close(); // cin.get(); ///////////////////////////////////////// fstream infile01(com.txt,ios::in); char c; while(!infile01.eof()) { infile01c; if(infile01.eof()) break; coutc; } infile01.close(); //当按下^z或回车时,程序读取的值时eof,程序结束 ////////////////////////////////////////////// } // 读取文件某一行内容 : #include iostream #include fstream #include string using namespace std; int CountLines(char* filename) { ifstream ReadFile; int n=0; string tmp; ReadFile.open(filename,ios::in); if(ReadFile.fail())//文件打开失败,返回0 { return 0; } else//文件存在 { while(getline(ReadFile,tmp)) { n++; } coutn = nendl; return n; } ReadFile.close(); } string ReadLine(char *filename,int line) { int lines,i=0; string temp; fstream file; file.open(filename,ios::in); lines=CountLines(filename); if(line=0) return Error 1:行数错误,不能为0或者负数。; if(file.fail()) return Error 2:文件不存在。; while(getline(file,temp)iline-1) { i++; couti = i-:-; } file.close(); return temp; } int main(int argc,char* argv ; coutplease input the filename:endl; cinfilename; cout\n please input the line number wanting to read:endl; cinl; coutReadLine(filename,l)endl; cin.get(); } //////统计文件的行数 #include iostream #include fstream #include string using namespace std; int CountLines(const char* filename) { ifstream ReadFile; int n=0; // char line ; string temp; ReadFile.open(filename,ios::in); if(ReadFile.fail()) { return 0; } else { while(getline(ReadFile,temp)) { if(temp.length()!=0) //加此句,则不包含空白行;不要词句,则含空白行! n++; } return n; } } int main(int argc,char* argv ) { ifstream infile; int lines; char filename ; coutplease input the filenameendl; cinfilename; infile.open(filename,ios::in); while(infile) { lines=CountLines(filename); int* tc=new int ; char* t=new char ; int i=0; while(!infile.eof())//read the data to the array { // if(ilines-1) infiletc t ; // couttc --t endl; i++; } infile.close(); for(int i=0; ilines; i++) couttc \tt endl; delete t; } }
个人分类: 程序设计|3 次阅读|0 个评论
[转载]【软件教程】【常用excel知识】
lcj2212916 2014-5-20 05:35
【名稱】:常用excel知识 【作者】:--- 【大小】:120k 【格式】:pdf 【語言】:簡體中文 【內容簡介】:1.COUNTIF用途:统计某一区域中符合条件的单元格数目。 语法:COUNTIF(range,criteria) 参数:range 为需要统计的符合条件的单元格数目的区域;Criteria 为参与计算的单元格条 件,其形式可以为数字、表达式或文本(如36、160和男等)。其中数字可以直接写入, 表达式和文本必须加引号。 实例:假设A1:A5 区域内存放的文本分别为女、男、女、男、女,则公式“=COUNTIF(A1:A5, 女)”返回3。 2. ....... 【下載載點】: http://www.400gb.com/file/64973766
1099 次阅读|0 个评论
如何在R语言中进行数据的文本型和数字型的互换
热度 2 Bearjazz 2012-12-15 00:21
如何在R语言中进行文本和数字的互换 熊荣川 xiong rongchuan 六盘水师范学院生物信息学实验室 xiongrongchuan@126.com http://blog.sciencenet.cn/u/Bearjazz R语言常常使用导入表格或文本格式的文件作为输入,但是导入的数据类型往往和我们需要的数据类型差强人意,例如如果使用readLines() 函数从文本文件导入的数字往往是文本格式,而使用read.csv()函数从csv格式的表格文件导入的数字常常作为数字型数据。因此在使用之前须进行一定的转化,下面两个函数可以实现数字型和字符型数据之间的转化。 a = "100" #将100作为字符文本 a "100" #查看a b = as.numeric(a) #文本转化为数字,可进行运算 b+1 101 c = as.character(b) #将数字b转化成字符格式,并赋值给c c #查看c "100"
个人分类: 我的研究|45570 次阅读|4 个评论
利用11月21日的方法,对韩新超发来的新浪新闻进行分类的结果
lixiangdong 2012-11-27 16:46
Number of instances: 700 Number of attributes: 5236 === Detailed Accuracy By Class === TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.93 0.002 0.989 0.93 0.959 0.997 体育 0.93 0.01 0.939 0.93 0.935 0.97 城市 0.92 0.023 0.868 0.92 0.893 0.978 娱乐 0.93 0.005 0.969 0.93 0.949 0.991 房产 0.84 0.043 0.764 0.84 0.8 0.954 新闻 0.84 0.018 0.884 0.84 0.862 0.95 科技 0.83 0.028 0.83 0.83 0.83 0.951 财经 Correctly Classified Instances 622 88.8571 % Incorrectly Classified Instances 78 11.1429 % Kappa statistic 0.87 Mean absolute error 0.2064 Root mean squared error 0.3049 Relative absolute error 84.2857 % Root relative squared error 87.1311 % Total Number of Instances 700 === Confusion Matrix === a b c d e f g -- classified as 93 0 1 0 5 1 0 | a = 体育 0 93 1 0 4 0 2 | b = 城市 0 0 92 0 6 2 0 | c = 娱乐 0 1 2 93 0 2 2 | d = 房产 0 2 7 0 84 1 6 | e = 新闻 1 1 2 0 5 84 7 | f = 科技 0 2 1 3 6 5 83 | g = 财经
个人分类: weka|2120 次阅读|0 个评论
采用新的策略,分类的各项指标明显提升
lixiangdong 2012-11-21 19:22
下面是交叉验证的结果: === Detailed Accuracy By Class === TP Rate FP Rate Precision Recall F-Measure ROC Area Class 0.99 0.002 0.98 0.99 0.985 0.999 C11-Space 0.75 0.001 0.923 0.75 0.828 0.979 C15-Energy 0.704 0.001 0.905 0.704 0.792 0.972 C16-Electronics 0.76 0.005 0.731 0.76 0.745 0.978 C17-Communication 0.96 0.002 0.98 0.96 0.97 0.988 C19-Computer 0.697 0.002 0.885 0.697 0.78 0.968 C23-Mine 0.86 0.014 0.731 0.86 0.79 0.978 C29-Transport 0.78 0.017 0.78 0.78 0.78 0.983 C3-Art 0.99 0 1 0.99 0.995 0.999 C31-Enviornment 0.94 0.002 0.979 0.94 0.959 0.997 C32-Agriculture 0.9 0.007 0.909 0.9 0.905 0.968 C34-Economy 0.725 0.004 0.881 0.725 0.796 0.987 C35-Law 0.902 0.009 0.793 0.902 0.844 0.989 C36-Medical 0.946 0.024 0.693 0.946 0.8 0.982 C37-Military 0.89 0.014 0.832 0.89 0.86 0.981 C38-Politics 0.94 0.002 0.979 0.94 0.959 0.979 C39-Sports 0.697 0.003 0.852 0.697 0.767 0.977 C4-Literature 0.797 0.01 0.783 0.797 0.79 0.98 C5-Education 0.614 0.004 0.818 0.614 0.701 0.976 C6-Philosophy 0.73 0.023 0.709 0.73 0.719 0.969 C7-History Correctly Classified Instances 1196 86.2915 % Incorrectly Classified Instances 190 13.7085 % Kappa statistic 0.8542 Mean absolute error 0.0902 Root mean squared error 0.2088 Relative absolute error 95.8409 % Root relative squared error 96.259 % Total Number of Instances 1386 === Confusion Matrix === a b c d e f g h i j k l m n o p q r s t -- classified as 99 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | a = C11-Space 0 24 1 0 0 2 3 0 0 0 0 0 0 2 0 0 0 0 0 0 | b = C15-Energy 0 0 19 5 0 0 2 0 0 0 0 0 0 1 0 0 0 0 0 0 | c = C16-Electronics 0 0 1 19 0 0 4 0 0 0 0 0 0 0 0 0 0 1 0 0 | d = C17-Communication 1 0 0 0 96 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 | e = C19-Computer 0 1 0 2 0 23 4 0 0 0 0 0 1 1 0 0 0 1 0 0 | f = C23-Mine 0 1 0 0 0 1 49 0 0 0 0 1 2 2 0 0 0 1 0 0 | g = C29-Transport 0 0 0 0 0 0 0 78 0 0 0 0 0 0 2 0 0 1 0 19 | h = C3-Art 0 0 0 0 0 0 0 0 99 0 0 1 0 0 0 0 0 0 0 0 | i = C31-Enviornment 0 0 0 0 0 0 0 0 0 94 5 0 0 0 0 0 0 0 0 1 | j = C32-Agriculture 0 0 0 0 0 0 0 0 0 1 90 0 1 0 7 0 0 0 0 1 | k = C34-Economy 0 0 0 0 0 0 0 0 0 0 0 37 1 13 0 0 0 0 0 0 | l = C35-Law 0 0 0 0 0 0 0 0 0 0 0 0 46 4 0 0 0 1 0 0 | m = C36-Medical 1 0 0 0 0 0 0 0 0 0 0 2 1 70 0 0 0 0 0 0 | n = C37-Military 0 0 0 0 0 0 0 0 0 0 2 0 0 1 89 0 0 0 0 8 | o = C38-Politics 0 0 0 0 1 0 0 1 0 0 1 0 0 0 2 94 0 0 0 1 | p = C39-Sports 0 0 0 0 0 0 2 0 0 0 0 1 1 0 0 0 23 3 3 0 | q = C4-Literature 0 0 0 0 0 0 1 0 0 0 0 0 3 4 0 1 0 47 3 0 | r = C5-Education 0 0 0 0 0 0 2 0 0 0 0 0 1 1 3 1 4 5 27 0 | s = C6-Philosophy 0 0 0 0 0 0 0 21 0 1 1 0 0 0 4 0 0 0 0 73 | t = C7-History 可见,只有“艺术”与 “历史”的分类出现了偏差,不到四分之一的实例跑到了对方分类中。但历史与艺术是非常相关的,这样的结果很合理。 今天中午到现在努力的结果。不错。
个人分类: weka|2393 次阅读|0 个评论
[转载]使用文本文件(.txt)进行数据存取的技巧总结 (转)
ChenboBlog 2011-5-12 18:51
由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用 “---- 转 ----” 标注,原作者略去,在此对所有原作者表示感谢! 特别说明:由于大家在 I/O 存取上以 txt 文件为主,且读取比存储更麻烦(存储的话 fwrite, fprintf 基本够用),因此下面的讨论主要集中在 “txt 文件的读取 ” 上。除了标注了 “ 转 ” 之外,其余心得均出于本人经验之 结果 ,欢迎大家指正、补充。 一 . 基本知识: -------------------------------------------------- 转 ---------------------------------------------------- 1. 二进制文件与文本文件的区别: 将文件看作是由一个一个字节 (byte) 组成的, 那么文本文件中的每个字节的最高位都是 0 ,也就是说文本文件使用了一个字节中的七位来表示所有的信息,而二进制文件则是将字节中的所有位都用上了。这就是两者的区别;接着,第二个问题就是文件按照文本方式或者二进制方式打开,两者会有什么不同呢?其实不管是二进制文件也好,还是文本文件也好,都是一连串的 0 和 1 ,但是打开方式不同,对于这些 0 和 1 的处理也就不同。如果按照文本方式打开,在打开的时候会进行 translate ,将每个字节转换成 ASCII 码,而以按照二进制方式打开的话,则不会进行任何的 translate ;最后就是文本文件和二进制文件在编辑的时候,使用的方式也是不同的。譬如,你在记事本中进行文本编辑的时候,你进行编辑的最小单位是字节 (byte) ;而对二进制文件进行编辑的话,最小单位则是位 (bit) ,当然我们都不会直接通过手工的方式对二进制文件进行编辑了。 从文件编码的方式来看,文件可分为 ASCII 码文件和二进制码文件两种: ASCII 文件也称为文本文件,这种文件在磁盘中存放时每个 字符 对应一个字节,用于存放对应的 ASCII 码。例如,数 5678 的存储形式为: ASCII 码:  00110101 00110110 00110111 00111000 ↓   ↓       ↓    ↓ 十进制码: 5       6     7        8 共占用 4 个字节。 ASCII 码文件可在屏幕上按字符显示,例如源 程序 文件就是 ASCII 文件,用 DOS 命令 TYPE 可显示文件的内容。由于是按字符显示,因此能读懂文件内容。 二进制文件是按二进制的编码方式来存放文件的。例如,数 5678 的存储形式为: 00010110 00101110 只占二个字节。二进制文件虽然也可在屏幕上显示,但其内容无法读懂。 C 系统 在处理这些文件时,并不区分类型,都看成是字符流,按字节进行处理。 输入输出 字符流的开始和结束只由程序 控制 而不受物理 符号 ( 如回车符 ) 的控制。因此也把这种文件称作 “ 流式文件 ” 。 2. 文本模式 (textmode) 和二进制模式 (binarymode) 有什么区别 ? 流可以分为两种类型:文本流和二进制流。文本流是解释性的,最长可达 255 个字符,其中回车 / 换行将被转换为换行符 “\n” ,(如果以 " 文本 " 方式打开一个文件,那么在读字符的时候,系统会把所有的 "\r\n" 序列转成 "\n" ,在写入时把 "\n" 转成 "\r\n" )。二进制流是非解释性的,一次处理一个字符,并且不转换字符。 注: \n 一般会操作系统被翻译成 " 行的结束 " ,即 LF(Line-Feed) \r 会被翻译成 " 回车 " ,即 CR(Cariage-Return) 对于文本文件的新行,在 UNIX 上,一般用 \n(LF) 来表示, Mac 上用 \r(CR) 来表示, Windows 上是用 \n\r(CR-LF) 来表示。 通常,文本流用来读写标准的文本文件,或者将字符输出到屏幕或打印机,或者接受键盘的输入;而二进制流用来读写二进制文件 ( 例如 图形 或字处理文档 ) ,或者读取鼠标输入,或者读写调制解调器。如果用文本方式打开二进制文件,会把 “0D 0A” 自动变换成 “\n” 来存在内存中。写入的时候反向处理。而二进制方式打开的话,就不会有这个过程。但是, Unicode/UTF/UCS 格式 的文件,必须用二进制方式打开和读写。 --------------------------------------------------------------------------------------------------------- 上述 基础 其实大可以略过, 简言之,对用户来说: 在 matlab 中存储成为二进制还是文本文件取决于 fopen 的方式,如果用 wt ,则存储为文本文件,这样用记事本打开就可以正常显示了;如果用 w 则存储为二进制文件,这样用记事本打开会出现小黑方块,要正常显示的话,可以用写字板或 UltraEdit 等工具打开。 二 . Matlab 的 I/O 文件操作使用技巧和总结 : 1. Matlab 支持的 I/O 文件(对应 “ 取 / 存 ” 操作)类型: (所有文件 I/O 程序不需要特殊的 工具箱 ) http://www.mathworks.com/support/tech-notes/1100/1102.html (注:从上表可以看到, matlab 不支持 doc 格式的文档存取(因为 doc 文档包含很多格式控制符),请改用 txt 或者 dat 格式) 2. Matlab 的 I/O 文件指南: http://www.mathworks.com/support/tech-notes/1600/1602.html 以下是部分对应的中文译文: -------------------------------------------------------------- 转 ---------------------------------------- 本技术支持指南主要处理: ASCII, binary, and MAT files. 要得到 MATLAB 中可用来读写各种文件格式的完全 函数 列表,可以键入以下命令: help iofun MATLAB 中有两种文件 I/O 程序: high level and low level. High level routines: 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的 编程 。 Low level routines: 可以更加灵活的完成相对特殊的任务,需要较多的额外编程。 High level routines 包括现成的函数,可以用来读写特殊格式的数据,并且只需要少量的编程。 举个例子,如果你有一个包含数值和字母的文本文件( text file )想导入 MATLAB ,你可以 调用 一些 low level routines 自己写一个函数,或者是简单的用 TEXTREAD 函数。 使用 high level routines 的关键是:文件必须是相似的( homogeneous ), 换句话说,文件必须有一致的格式。下面的段落描述一些 high level file I/O routines 并给出一些例子帮助理解概念。 LOAD/SAVE 主要的 high level file I/O routines 是 LOAD 和 SAVE 函数。 LOAD 可以读 MAT-file data 或者用空格间隔的格式相似的 ASCII data. SAVE 可以将 MATLAB 变量 写入 MAT-file 格式或者空格间隔的 ASCII data 。大多数情况下,语法相当简单。下面的例子用到数值由空格间隔的 ASCII file sample_file.txt : 1 5 4 16 8 5 43 2 6 8 6 8 4 32 1 90 7 8 7 6 5 9 81 2 3 Example: 用 LOAD and SAVE 读写数据 CODE: % Load the file to the matrix, M : M = load('sample_file.txt') % Add 5 to M : M = M +5 % Save M to a .mat file called 'sample_file_plus5.mat': save sample_file_plus5 M % Save M to an ASCII .txt file called 'sample_file_plus5.txt' : save sample_file_plus5.txt M -ascii UIGETFILE/UIPUTFILE UIGETFILE / UIPUTFILE 是基于图形用户 界面 ( GUI )的。会弹出对话框,列出当前目录的文件和目录,提示你选择一个文件。 UIGETFILE 让你选择一个文件来写(类似 Windows ‘ 另存为 ’ 选项?)。用 UIGETFILE ,可以选择已存在的文件改写,也可以输入新的文件名。两个函数的返回值是所选文件名和路径。 Example: 用 UIGETFILE 从当前目录选择一个 M-file CODE: % This command lists all the M-files in the current directory and % returns the name and path of the selected file = uigetfile('*.m','Sample Dialog Box') 注意 : UIGETFILE 一次只能选择一个文件。 UIIMPORT/IMPORTDATA UIIMPORT 是一个功能强大,易于使用的基于 GUI 的 high level routine ,用于读 complex data files 。文件也必须是 homogeneous 。 IMPORTDATA 形成 UIIMPORT 的功能,不打开 GUI 。可以将 IMPORTDATA 用于函数或者脚本中,因为在函数或者脚本中基于 GUI 的文件导入机制并不理想。下面的例子用到包含几行文件头和文本、数值数据的文件 'sample_file2.txt' : This is a file header. This is file is an example. col1 col2 col3 col4 A 1 4 612.000 B 1 4 613.000 C 1 4 614.000 D 1 4 615.000 Example: Using IMPORTDATA to read in a file with headers, text, and numeric data CODE: % This reads in the file 'sample_file2.txt' and creates a % structure D that contains both data and text data. % Note the IMPORTDATA command specifies a white space % as the delimiter of the file, but IMPORTDATA can usually % detect this on its own D = importdata('sample_file2.txt','')% 原文有误? D = importdata('sample_file2.txt') 可以通过访问结构 D 的数据和文本域,来看结构 D 中的真实值,例如输入: data = D.data text = D.textdata 可以用 UIIMPORT 读同一个文件并得到同样的结构 . 注意 : 对于 ASCII data, 你必须检验导入向导正确的识别了列分隔符。 TEXTREAD/STRREAD TEXTREAD 是一个强大的动态 high level routine , 设计 用来读 ASCII 格式的文本和 / 或数值数据文件。 STRREAD 除是从字符串而不是文件读以外,类似于 TEXTREAD 。 两个函数可以用许多 参数 来改变其具体的工作方式,他们返回读入指定输出的数据。他们有效的提供给你一个 “ 两全其美 ” 的方法,因为他们可以用一个命令读入混合的 ASCII 和数值数据( high level routines 的做法),并且你可以改变他们以匹配你特定的 应用 (如同 low level routines 做到的)。例子: CODE: Example 1: Using TEXTREAD to read in an entire file into a cell array % This command reads in the file fft .m into the cell array, file file = textread('fft.m','%s','delimiter','\n','whitespace',''); CODE: Example 2: Using STRREAD to read the words in a line % This command uses the cell array created in Example 1 to % read in each word of line 28 in 'file' to a cell array, words words = strread(file{28},'%s','delimiter','') CODE: Example 3: Using TEXTREAD to read in text and numeric data from a file with headers % This command skips the 2 header lines at the top of the file % and reads in each column to the 4 specified outputs = textread('sample_file2.txt','%s %s %s %s','headerlines',2) CODE: Example 4: Using TEXTREAD to read in specific rows of text and numeric data from a file % This command reads in rows B and C of the file. The 'headerlines' % property is used to move down to the desired starting row and the % read operation is performed 2 times = textread('sample_file2.txt',... '%s %s %s %s',2,'headerlines',4) CODE: Example 5: Using TEXTREAD to read in only the numeric data from a file containing text and numbers % This command reads in only the numeric data in the file. The % 'headerlines' property is used to move down to the first row % of interest and the first column of text is ignored with the % '*'operator = textread('sample_file2.txt','%*s %d %d %f','headerlines',3) DLMREAD/DLMWRITE/CSVREAD DLMREAD 和 DLMWRITE 函数能够读写分隔的 ASCII data ,而不是用 low level routines 。他们比 low level routines 容易使用, Low level routines 用几行 代码 实现的功能可以用 DLMREAD/DLMWRITE 简化成一行。 CSVREAD 用来读分隔符是逗号的文件,是 DLMREAD 的特殊情况。当读空格和 Tab 分隔的电子数据表文件时, DLMREAD 特别有用。以 'sample_file.txt' 为例: CODE: Example 1: Using DLMREAD to read in a file with headers, text, and numeric data % This reads in the file 'sample_file2.txt' and creates a matrix, D, % with the numeric data this command specifies a white space as the % delimiter of the file D = dlmread('sample_file.txt','') CODE: Example 2: Using DLMREAD to extract the first 3 columns of the last 3 rows % This reads in the first 3 columns of the last 3 rows of % the data file 'sample_file.txt'into the matrix, D_partial. % 读文件 'sample_file.txt' 前 3 列后 3 行,到 矩阵 D_partial. D_partial = dlmread('sample_file.txt','', ) CODE: Example 3: Using DLMWRITE to write a comma delimited file % This creates a file called 'partialD.txt' that consists of % the first 3 columns of the last 3 rows of data where each % element is separated by a comma dlmwrite('partialD.txt',D_partial,',') 注意 : 保证 DLMREAD and DLMWRITE 指定范围的指标从 0 开始,而不是从 1 开始。 WK1READ/WK1WRITE WK1READ 用来读 Lotus123 电子数据表文件的数据; WK1WRITE 用来写矩阵到 Lotus123 电子数据表文件。 XLSREAD XLSREAD 用来读 Excel 的数值和文本数据。 --------------------------------------------------------------------------------------------------------- 三 . 具体例子分析: Matlab 网站用两个例子非常详尽地介绍了各个命令的基本用法,实际中,面对手头上的数据,如何选用合适的命令呢?以下结合几个示例给出一些总结,大家举一反三就可以了: 1. 纯数据(列数相同): 源文件: CODE: 0 3866.162 2198.938 141.140 1 3741.139 2208.475 141.252 2 3866.200 2198.936 141.156 3 3678.048 2199.191 141.230 4 3685.453 2213.726 141.261 5 3728.769 2212.433 141.277 6 3738.785 2214.381 141.256 7 3728.759 2214.261 141.228 8 3748.886 2214.299 141.243 9 3748.935 2212.417 141.253 10 3733.612 2226.653 141.236 11 3733.583 2229.248 141.223 12 3729.229 2229.118 141.186 解答 :对于这个 txt 文件,由于各行列数相同,故简单地使用 load,importdata 均可。 2. 字段名(中、英文字段均可) + 数据: 源文件: CODE: CH0 CH1 CH2 CH3 0.000123 0.000325 0.000378 0.000598 0.000986 0.000256 0.000245 0.000698 解答 :由于是记录的形式,因此各行列数必相同(缺少部分列时请自行在文件中补上 Inf 或 NaN ),故直接使用 importdata 便可。 3. 注释(含有独立的数字串) + 数据(列数相同): 问题 :这个文件有 4 列 , 但前 6 行是文字说明 ,4 列数字是从第 8 行开始的 . 现在我想把这个文件的前 2 列和文字说明提出来组成一个新的 dat 文件 源文件: CODE: Group 212.02.2006 Limei Samples of datas: 50000 CH0CH1CH2CH3 0.0001230.000325 0.000378 0.000598 0.0009860.000256 0.000245 0.000698 目标文件: CODE: Group 2 12.02.2006 Limei Samples of datas: 50000 CH0 CH1 0.000123 0.000325 0.000986 0.000256 解答 :由于注释中含有独立的数字串,且注释部分没有明显的格式,这时候用 importdata, load 等高级命令直接读取会失败,用 textread, dlmwrite 等格式化命令也不太合适,因此只能使用低级命令进行读取。(当然了,可以跳过注释部分直接用高级命令读取数据,即: = textread(filename,'%f %f %f %f','headerlines',4); )。一个简单的、非通用的包含注释的读取方法如下: ------------------------------------- 转 --------------------------------------------------------------------------------------- CODE: clc;clear; fid = fopen('exp.txt', 'r'); fid_n=fopen('ex.dat','w'); while ~feof(fid) tline=fgetl(fid); if ~isempty(tline) if double(tline(1))=48 double(tline(1))=57% 数值开始 a=strread(tline); a(3:4)= =strread(tline,'%s %s %s %s'); b= ; fprintf(fid_n,'%s\n',b); clear b b1 b2 b3 b4; else fprintf(fid_n,'%s\n',tline); end else fprintf(fid_n,'%s\n',tline); end end fclose(fid); fclose(fid_n); --------------------------------------------------------------------------------- 4. 注释(不含独立的数字串) + 数据(列数相同): 源文件: CODE: 你好 abc 欢迎来到 我们 振动论坛 vib.hit.edu.cn 1 11 111 1111 2 22 222 2222 3 33 333 3333 4 44 444 4444 5 55 555 5555 解答: 直接用 importdata 便可 注: 有时候注释中含有独立的数字串也可以 importdata 成功,不过得到的结果有可能不正确,建议这时候使用第 3 种情形的读取方式。 5. 注释与数据混排: 对此当然只能自己编程,举例: 源文件 : CODE: 1 11 111 1111 你好 2 22 222 2222 欢迎来到 3 33 333 3333 振动论坛 4 44 444 4444 vib.hit.edu.cn 5 55 555 5555 解答: -------------------------------------------- 转 -------------------------------------- CODE: function =distilldata(infile) % 功能说明: % 将 保存 数据的原始文件中的数值数据读入到一个 data 变量中 % 使用说明: % infile—— 原始数据文件名 ; % data= 数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件( .list ) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 =size(tline); flag=1; for i=1:n % 判断一行中有没有字符(+- .Ee 和空格键除外) if ~(tline(i)==' '|tline(i)=='-'|tline(i)=='.'|tline(i)=='E'... |tline(i)=='e'|tline(i)=='+'... |(double(tline(i))=48double(tline(i))=57)) flag=0; break; end end if flag==1 % 如果是数字行,把此行数据写入文件 fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile); --------------------------------------------------------------------------------------------------------- 另外,如果要求不高,也可以使用 textread 函数跳过注释部分进行读取,不过前提是需要事先知道文件内容的结构(即哪行是数据、哪行是注释) 6. 各列数据的分离: 源文件: CODE: 0 +47038.7 1.0509:26:07C 2 +46477.7 1.0309:28:38C 4 +44865.7 1.0409:28:48C 6 +41786.4 1.0309:28:56C 8 +39896.0 0.9709:29:03C 10 +37518.4 0.9309:29:15C 12 +35858.5 0.9209:29:30C 14 +46105.0 1.0309:30:21C 16 +46168.6 6.8909:30:30C 18 +48672.3 4.3309:30:40C 20 +49565.7 0.4909:30:48C 22 +49580.7 0.5309:30:55C 24 +49602.3 0.8409:31:03C 26 +49582.5 1.5109:31:11C 28 +49577.0 1.3909:31:19C 30 +49589.3 0.6109:31:27C 32 +49578.3 1.0609:31:29C 34 +49512.5 1.7709:31:38C 解答: 直接用 =textread(yourfilename,'%d %c %f %f %s %c'); 便可 四 . 注意事项: 1. 请在 matlab 中保持当前路径在该数据文件对应的目录下进行存取,否则,存取时请给出该数据文件的具体路径。 2. 存取时,请给出该数据文件的全称(包括后缀名,读取 mat 文件时可省略) 3. load data.txt 和 A=load(‘data.txt’) 的区别请参阅精华贴: 写给学习 matlab 的新手们 4. 请根据读写需要来打开文件,即根据你的需要来指定 fopen 的 permission 属性为读或写。如果只用 a 进行写入,就不能用 fread 读取。此时应该写完关闭文件,然后用 r 打开读取,或者直接用 a+ 进行同时读写操作。否则,会产生莫名其妙的问题!以下代码是一个 错误 的例子: CODE: filename='e.dat'; fid=fopen(filename,'a'); if fid0 error ('fopen error'); end s= ; fwrite(fid,s,'float32') =fread(fid,inf,'float32'); %把 t 中的数据全部读出,即 s 矩阵。 fclose(fid); 此时得到的 dd, ll 是错误且无意义的! 五 . 其他相关问题: 1. 连续读取多个文件的数据,并存放在一个矩阵中: (1) 首先是如何读取文件名: 方法一: filename=dir(‘*.jpg’); 那么第 i 个文件的文件名就可以表示为 filename(i).name 文件数量为: length(filename) 方法二: 先在 Windows 的 MSDOS (命令行)中使用以下命令生成一个 list.txt 文件: dir path\folder /on /b /s path\list.txt 举例: dir d:\test /on /b /s d:\list.txt 然后在 matlab 中使用: filename = textread(sFileFullName,'%s'); 把所有文件名读取到 list 细胞矩阵中,最后对 filename{i} 便可得到各文件名。 (2) 然后是读取文件名的数据并存储: 假设每个文件对应的数据是 m*n 的,则: CODE: k = length(filename); Data = zeros(m,n,k); for ii = 1:k Data(:,:,ii) = yourreadstyle(filename{ii}); %yourreadstyle 是对应的文件读取方式的函数 end 2. 连续读取多个文件的数据,并存放在多个矩阵(以文件名命名)中: 假设每个文件对应的数据是 m*n 的,则以上述第二种文件名读取方法为例: CODE: k = length(filename); for ii = 1:k D = yourreadstyle(filename{ii}); eval( ); end 3. 文件名命名问题: 文件名为 abc00001,abc00002,... abc00009,abc00010,... abc00099,abc00100,...abc00879. 准备把这些文件名给放到一个 数组 里面去。 解答: CODE: a=cell(879,1); for k=1:879 a{k} = sprintf('%.5d',k); end 4. 上述各种文件格式、类型自动识别问题 :可以利用正则表达式来处理,使之通用性较强。例如使用以下代码可以自动处理上面提到了例 1 到例 5 各种情形,不过由于存在自动判断,对某些例子(如例 1 )效率自然要低一点,而对于另外的例子(如例 3 、例 5 )效率估计要高一点(少用了一个 循环 )。 CODE: function =distilldata_eight(infile) % 功能说明: % 将保存数据的原始文件中的数值数据读入到一个 data 变量中(自动判断数据行) % 使用说明: % infile—— 原始数据文件名 ; % data= 数据变量 tmpfile='tmp2.mat'; fidin=fopen(infile,'r'); % 打开原始数据文件( .list ) fidtmp=fopen(tmpfile,'w'); % 创建保存数据文件(不含说明文字) while ~feof(fidin) % 判断是否为文件末尾 tline=fgetl(fidin); % 从文件读入一行文本(不含回车键) if ~isempty(tline) % 判断是否空行 str = ' '; % 正则表达式为:该行中是否包含除 - . E e 数字 和 空白字符 外的其他字符 start = regexp(tline,str, 'once'); if isempty(start) fprintf(fidtmp,'%s\n',tline); end end end fclose(fidin); fclose(fidtmp); data=textread(tmpfile); delete(tmpfile) 5. 大量数据的读取问题: 可以考虑使用循环分批读取(特别是在各数据是独立的时候),或者使用稀疏矩阵来实现(对此可以参阅本版精华贴: 提高matlab 运行速度和节省空间的一点心得(之三) )。另外,也可参考《深入浅出 MATLAB 7_X 混合编程 》一书第一章 6. 读取整个 txt 文件的内容(获得文件中的所有字符): CODE: f = fopen('yourfilename.txt','rt'); % t 属性根据需要可省略 x = fread(f,'*char'); fclose(f); 7. 把维数不同的矩阵及其变量名保存到一个 txt 文件中,例如 a1 = 123; a2 = ,希望得到的 txt 文件如下: QUOTE: a1 : 123 a2 : 1 2 3 4 5 6 如果写入的时候简单一点,则可以采用以下方式,不过读取的时候比较麻烦: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n %s\n', , mat2str(eval( ))); end fclose(fid); 相反,如果写入的时候复杂一点,则读取的时候会简单一点: CODE: a1=123; a2= ; fid = fopen('myfile.txt', 'wt'); for i=1:2 fprintf(fid, '%s: \n', ); b = eval( ); fprintf(fid, , b'); end fclose(fid);
2226 次阅读|0 个评论
关于discourse的定义及其社会文化维度分析
carldy 2011-4-11 10:51
近段时间在读关于SFL(Systemic Functional Linguistics) 、CDA(Critical Discourse Analysis)、CL(Corpus-linguistics)及其与翻译相关的书籍,发现有很多定义不够明朗。 比如disourse一词,理解就很多种。 这里引述的是“ Key concepts in communication and cultural studies” (2nd edition) by: Montgomery, O’Sullivan, Hartley, Sauders, and Fiske (1994): discourse (adjective = discursive) * A term now quite widely used in a number of different disciplines and schools of thought, often with different purposes. Most uncontroversially, it is used in linguistics to refer to verbal utterances of greater magnitude than the sentence. * Discourse analysis is concerned not only with complex utterances by one speaker, but more frequently with the turn-taking interaction between two or more, and with the linguistic rules and conventions that are taken to be in play and governing such discourses in their given context. However, the concept of discourse has also developed, separately, out of post- structuralism and semiotics . Here it really represents an attempt to fix, within one term, some of the theoretical ground gained in the early days of the structuralist enterprise. To grasp its significance you have to remember that in this early period structuralism/semiotics was above all an oppositional intellectual force, whose proponents were attempting to criticize and transform the inherited habits of thought and analysis about the question of where meaning comes from. Traditionally, and even now most ‘obviously’, meaning was ascribed to objects ‘out there’ in the world, and to the inner essences and feelings of individuals. Structuralism took issue with these ideas, insisting that meaning is an effect of signification , and that signification is a property not of the world out there nor of individual people, but of language . It follows that both the world out there and individual consciousness are themselves comprehensible only as products, not sources, of language/signification. We are what we say, and the world is what we say it is. But the problem with this conclusion is that it is too free-floating and abstract; it gives the impression that – not only in principle but also in practice – the world and the word can mean whatever we like. Life isn’t so simple. The abstract concept of ‘language’ proved inadequate to account for the historical, political and cultural ‘fixing’ of certain meanings, and their constant reproduction and circulation via established kinds of speech, forms of representation, and in particular institutional settings. This is the point at which the concept of discourse began to supplant the now flabby and imprecise notion of ‘language’. Unlike ‘language’, the term discourse itself is both a noun and a verb. So it is easier to retain the sense of discourse as an act, where the noun ‘language’ often seems to refer to a thing. In its established usages, discourse referred both to the interactive process and the end result of thought and communication. Discourse is the social process of making and reproducing sense(s). Once taken up by structuralism, largely through the writings of Michel Foucault, the concept of discourse proved useful to represent both a very general theoretical notion and numbers of specific discourses. The general theoretical notion is that while meaning can be generated only from the langue or abstract system of language, and while we can apprehend the world only through language systems, the fact remains that the resources of language-in-general are and always have been subjected to the historical developments and conflicts of social relations in general. In short, although langue may be abstract, meaning never is. Discourses are the product of social, historical and institutional formations, and meanings are produced by these institutionalized discourses. It follows that the potentially infinite senses any language system is capable of producing are always limited and fixed by the structure of social relations which prevails in a given time and place, and which is itself represented through various discourses. Thus individuals don’t simply learn languages as abstract skills. On the contrary, everyone is predated by established discourses in which various subjectivities are represented already – for instance, those of class , gender , nation, ethnicity, age, family and individuality. We establish and experience our own individuality by ‘inhabiting’ numbers of such discursive subjectivities (some of which confirm each other; others however coexist far from peacefully). The theory of discourse proposes that individuality itself is the site, as it were, on which socially produced and historically established discourses are reproduced and regulated. Once the general theoretical notion of discourse has been achieved, attention turns to specific discourses in which socially established sense is encountered and contested. These range from media discourses like television and news, to institutionalized discourses like medicine, literature and science. Discourses are structured and interrelated; some are more prestigious, legitimated and hence ‘more obvious’ than others, while there are discourses that have an uphill struggle to win any recognition at all. Thus discourses are power relations. It follows that much of the social sense-making we’re subjected to – in the media, at school, in conversation –is the working through of ideological struggle between discourses: a good contemporary example is that between the discourses of (legitimated, naturalized) patriarchy and (emergent, marginalized) feminism. Textual analysis can be employed to follow the moves in this struggle, by showing how particular texts take up elements of different discourses and articulate them (that is, ‘knit them together’). However, though discourses may be traced in texts , and though texts may be the means by which discursive knowledges are circulated, established or suppressed, discourses are not themselves textual. Further reading For discourse analysis in linguistics see Coulthard and Montgomery (eds) (1981) 看来,对discourse的探讨,可以涉及到社会文化维度的分析。 Fowler把话语视为个人有意识进入意识形态、经验和社会组织的语言工具。 (待续)
个人分类: 读书心得体会 Harvest|6480 次阅读|0 个评论
在PDF文件中输入文本及调整格式
热度 4 book 2011-3-2 18:10
同行交流、论文评审或申请签证等时候,会越来越多的使用 PDF 文件。常碰到的一个问题是: 如何在 PDF 文件中输入文本,并调整为理想格式? 由于这几天又碰到这个问题,所以觉得有必要总结备份一下,并与大家分享。这里基于 Adobe Acrobat Professional 7.0 (及以上版本)简体中文版进行一下说明。 Adobe Acrobat 中有两种方法可以选用。 一、 TouchUp 文本工具 1. 选择“ TouchUp 文本工具”。 打开 PDF 文件,在菜单栏中选择“ 工具—高级编辑工具— TouchUp 文本工具 ”。 (可以选择“显示 TouchUp 工具栏”,该工具栏会显示在前端,这样操作比较方便。) 2. 书写框、字体及书写模式。 在要输入文本的大概位置,按住“ Ctrl + 鼠标左键 ”,会弹出一个对话框;“字体”根据需要进行选择,需要注意的是选择英文字体时不支持输入中文(否则会显示乱码),常用的中文字体包括“ AdobeSongStd (宋体)、 YouYuan (幼圆) ”等;文本输入框“模式”根据需要选择“ 横排或竖排 ”。 之后点击确定,会出现 文本输入框 (蓝色框, New Text 提示),在文本框中输入文字即可,符号也可以使用软键盘输入或插入。 3. 调整字体、字号、颜色及文本位置。 按住鼠标左键并拖动光标直接选择需要调整的文本,之后点击鼠标右键,选择“属性”,会弹出“ TouchUp 属性 ”对话框。在文本中可以设置字体、字体大小、字体颜色(即填充)等。 如果需要调整文本的位置,选择 TouchUp 工具栏中的“ TouchUp 对象工具 ”,单击选中文本输入框,可以用鼠标拖动或键盘上的(上下左右)箭头来调整文本的位置。 二、文本框工具 1. 选择“文本框工具”。 打开 PDF 文件,在菜单栏中选择“ 工具—图画标记—文本框工具 ”。之后在需要插入文本的位置点击鼠标左键,即出现文本框,在其中输入中英文字或符号即可。点击 PDF 文件任意位置,即可完成输入。 2. 调整文本框样式和位置。 文本框默认为填充黄色及黑色边框,如果我们只需要输入文本时,需要将颜色和框扔掉。 选中文本框,按“ Ctrl + E ”弹出文本框属性工具条,或鼠标右键选择“属性”。“填充颜色”修改为“无颜色”,“线条颜色”修改为“白色”,这时候你会发现文本框就看不见了。 如果你需要保留文字外面的框,也可以按照你的需求进行填充颜色和边框线条颜色的调整。 鼠标移动到文本框上时,会变为十字箭头的样子,这时候选中文本框,即可以随意用鼠标或键盘上的(上下左右)箭头来挪动其位置。 3. 调整字体、字号、颜色等文本样式。 双击文本框,出现闪动的光标,这时候文本框属性工具条相应的变为 文本框文本属性工具条 。这时候即可以修改文本颜色、在文本框中的对齐方式、字体、字号、上标下标等。
个人分类: 资源共享|38339 次阅读|8 个评论
NotePad++:记事本的替代程序
zjlcas 2010-9-18 16:13
Notepad++是开源的文本程序,是用C++编写的。目前只能在Windows上运行。NotePad++是小巧的编辑器,最新版本5.7.1的安装文件仅为3.88M.但是其功能确是十分强大的,占用系统资源很低而运行速度很快。 这个软件的特点,这里简要介绍一下: 首先,NotePad++支持几十种编程语言的高亮显示,如著名的C,C++,C#,Fortran,Java,Python,Perl,SQL,shell,PHP,javascript,Html,TeX等等。初次接触NotePad++是2009年5月。当时正准备找一个R程序脚本的编辑器,很多人推荐用TinnR,但是TinnR虽然具有R的语法高亮功能,但是编辑风格与记事本有较大不同,我很难适应其风格。后来看到论坛上有人介绍NotePad++与NppToR,不但能实现R的语法高亮功能,也能可以一键将当前脚本输送到R-console中。小巧的软件,完备的功能让人兴奋不已。应大量用户的要求,NotePad++新近增加了R语言的高亮显示,使得R用户能方便得编写R的脚本及程序。 NotePad++的TextFX具有出色的文本编辑和转换功能。TextFX是嵌入到NotePad++中的模块之一,能够十分方便的进行文本的大小写的转换,行转换,编码的转换,删除空白行,删除多余的空格等等,并且支持正则表达式。 NotePad++的Plugins具有扩展功能。其中Aspell模块具有检查拼写的功能,配合GNU的aspell软件,能将拼写错误的单词及时找出,并依据用户的选择作出相应的替换。NppExport能够将高亮显示的结果导出成rtf,html等多种格式。Compare模块可以比较两个文件的异同。如果对新版本的程序进行了修改,想知道修改在哪些地方,又不想用庞大的svn软件,Notepad++是一个不错的选择。 当然,NotePad++还有记录Macro的功能,同时搜寻打开的所有文件中的某一字段功能等,在此不一一列举了。 如果你还没有试过NotePad++,那么可以先试一试,估计大多数人,即使不是程序员,都会喜欢上这个小巧灵活,功能强大的软件。 NotePad++的地址 http://notepad-plus-plus.org/
个人分类: 科研笔记|10970 次阅读|5 个评论
用WinRAR合并MP3与TXT----无需寻找专用工具
kakaymi 2010-7-31 19:48
将多首MP3文件合并,不用专用软件也行。用WinRAR合并MP3 是一个应急的办法,其利用了RAR的合并功能而不要用其压缩操作。 具体使用如下: 1.把要合并的MP3歌曲都放到同一个文件夹中,并按需要的播放顺序排好,因为最终合并完的歌曲会按照这个顺序进行播放。 2.全选所有预合并的歌曲文件,右击并选择WinRAR添加到压缩文件命令。 3.在弹出的窗口中将压缩方式设置为存储一项(就是不压缩的意思,因为歌曲一旦被压缩,它的内部结构就会混乱,此时即使将曲子合并了,播放软件也无法正确播放它),并将压缩文件名一栏的扩展名改为MP3,最后点击确定按钮即可。 ----------------------------------- PS:该方法也适用于合并TXT等文本文件 把要合并的文本选中,然后把它们压缩起来,要特别注意的是,在压缩方式这一栏里,要选为储存(如图),这样才可以保留原来的文本格式。选完后点击确定,等它合并完成后,把合并的文件扩展名改为TXT,完成后打开,把前两排 WinRAR生成的乱码去掉,就合并成功了。
个人分类: 未分类|4376 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-29 01:44

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部