罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

罗兰在MATLAB的艺术已经存档,不会被更新。

介绍字符串数组

古原是今天的帖子。你可能看过古原早先关于文本分析的文章他经常在他的数据分析处理文本。所以他非常兴奋的新字符串在R2016b数组。

R2016b我爱的新特性之一是字符串数组,它给你一个新方法来处理文本在MATLAB除了熟悉字符数组和细胞特征向量的数组。字符串数组是最有帮助的在处理文本数据。在今日的帖子里我走过一些与文本数据实例,演示如何使用字符串数组。

内容

分析婴儿名字的趋势

让我们玩字符串使用婴儿名字的数据集从社会保障管理。数据存储在单独的文本文件的出生年份从1880年到2015年。让我们首先预览其中之一。

如果~ isdir (“名字”)%如果| |名称的文件夹不存在url =“https://www.ssa.gov/oact/babynames/names.zip”;%压缩数据文件的url解压缩(url,“名字”)%数据下载并解压缩到| |文件夹名称结束tbl1880 = readtable (的名字/ yob1880.txt ');%读第一个文件var = {“名字”,“性”,“出生”};%列名tbl1880.Properties。VariableNames = var;%添加列名称disp (tbl1880 (1:5)):%预览5行
姓名性别出生___________ ___ _____“玛丽”“F”7065“安娜”“F”2604“艾玛”“F”2003“伊丽莎白”“F”1939“米妮”“F”1746

字符串连接

而不是每个文件加载到一个单独的表,我们想创建一个表,跨越所有可用的年。文件命名约定:“小无赖”+ +”。txt”,我们可以使用它来生成文件路径。一个字符串数组,我们可以利用阵列扩展生成的文件名列表。

年= 1880:2015;%向量的年的两倍filepaths =字符串(的名字/小无赖)+年+' . txt ';%连接字符串和数字filepaths (1:3)%索引到前3个元素
ans = 1 / yob1880×3字符串数组”的名字。/ yob1881 txt”的名字。txt”“名称/ yob1882.txt”

结合文件创建一个表

让我们创建一个表,跨越所有可用的年。请注意,我们需要使用字符个人文件名字符串转换为使用特征向量readtable。我们将设置readtable参数TextType“字符串”因此文本读取数据到表作为字符串数组。当你预览前五行,注意文本被双引号,而不是单引号包围,这表明他们被表示为字符串数组。

名称=细胞(长度(年),1);%蓄电池2 = 1:长度(年)%为每年名字{2}= readtable (char (filepaths (ii)),%读单个文件“ReadVariableNames”假的,%到单独的表“TextType”,“字符串”);%的文本字符串数组{二}. properties。VariableNames = var;%添加列名称{二}。年= repmat(年(二),%添加| |年列高度({2})名字,1);结束名称= vertcat(名字{:});%连接表disp(名字(1:5,:))%预览5行
姓名性别出生年___________ ___ _____ _____“玛丽”“F”1880“安娜”“F”2604 1880 7065 1880年“艾玛”“F”2003“伊丽莎白”“F”1939年1880年1880年“米妮”“F”1746

字符串比较

让我们情节的名字“杰克”和“艾米丽”随着时间的推移发生了变化。字符串数组,您可以简单地使用= =操作员进行比较。这使得我们的代码清晰而使用比较字符串。我们可以观察到艾米丽近年来人气激增和杰克正在卷土重来。

杰克(names.name = = =的名字“杰克”:);%行只名叫“杰克”艾米丽(names.name = = =的名字“艾米丽”:);%行命名“艾米丽”艾米丽=艾米丽(艾米丽。性= =“F”:);%是女孩杰克=杰克(Jack。性= =“米”:);%是男孩%的新人物情节(杰克。年,Jack.births);%绘制杰克持有%不覆盖情节(艾米丽。年,Emily.births);%绘制艾米丽持有%可以覆盖标题(宝宝的名字受欢迎的);%添加标题包含(“年”);ylabel (“出生”);%添加轴标签传奇(“杰克”,“艾米丽”,“位置”,“西北”)%添加传奇

字符串数组的内存使用和性能与细胞阵列

让我们考虑一下字符串数组在内存使用情况的影响。

namesString = names.name;%这是字符串namesCellAr = cellstr (namesString);%转换为cellstr谁(“namesString”,“namesCellAr”)%检查尺寸和类型
类属性名称大小字节namesCellAr 1858689 x1 231124058细胞namesString 231124058 x1 120288006字符串

字符串数组使用大约一半的内存单元阵列的特征向量。节省内存取决于数组数据和大小和明显的对于有许多这样的元素的数组。

在大多数情况下,你也可以取得更好的性能,当你使用字符串数组的新字符串操作方法。取代是一个新的字符串的方法,你可以经常使用的吗strrep替换子字符串的文本。注意到性能差异:

抽搐,strrep (namesCellAr“乔伊”,“乔”);toc,%的时间strrep操作抽搐、替换(namesString“乔伊”,“乔”);toc,%的时间替换操作
运行时间是0.807283秒。运行时间是0.409385秒。

数据争论的例子

学校的数据主机谷物国土数据收集的一个非政府组织。它是一个典型的混乱的数据集,需要一些清理。

如果存在(“grain.xls”,“文件”)~ = 2%如果文件不存在url =“https://commondatastorage.googleapis.com/ckannet storage/2012 - 08 - 14 - t085537/grain -土地获取交易- 1月- 2012. xls”;websave (“grain.xls”url);从网上%保存文件结束数据= readtable (“grain.xls”,“范围”,“A2: I417”,%加载数据文件“ReadVariableNames”假的,“TextType”,“字符串”);

修复拼写错误或不一致的标签

一个常见的数据清洗问题是处理错误或不一致的标签。让我们看一个例子从表列土地掠夺之,其中包含实体名称。你看到两个拼写变异为同一实体。

实体=字符串(数据。(2));%的实体作为字符串数组实体([18350])%子集
ans = 2×1的字符串数组“Almarai有限公司”“Almarai有限公司”

字符串数组提供各种方法有效地操纵文本值,特别是在处理大量的文本数据。在这里我们将使用endsWith寻找失踪的名字后一段“有限公司”。

isCo = endsWith(实体,“有限公司”);%发现所有以“有限公司”实体(isCo) + (isCo) =实体“。”;%添加时间实体(isCo)%检查结果
ans = 8×1的字符串数组“Almarai有限公司”"Shaanxi Kingbull Livestock Co." "Foras International Investment Co." "Foras International Investment Co." "Foras International Investment Co." "Foras International Investment Co." "Foras International Investment Co." "Foras International Investment Co."

找到并转换子字符串

表列ProjectedInvestment包含金额数百万和数十亿为文本。让我们使用包含成百上千万的方法来找到。

投资=数据。(7);%子集一列投资(1:5)%预览前5行isMillion =包含(投资,“百万”);%找到包含子字符串的行isBillion =包含(投资,“十亿”);%找到包含子字符串的行
ans = 5×1的字符串数组”““7700万美元”““-百万美元”“2亿美元”

让我们使用正则表达式提取数据。当一系列的30到35个百万美元,我们将使用第一个数字。用正则表达式字符串数组的工作就像细胞特征向量的数组。最后,我们将删除逗号取代

模式=‘\ d + \, ? ? \ d *’;%正则表达式模式num = regexp(投资模式,“匹配”,“一次”);%提取第一个匹配num =取代(num,”、“,);%去除commansnum (1:5)%预览前5行
ans = 5×1的字符串数组<失踪>“77”<失踪>“30”“200”

你注意到这个正则表达式调用创建<失踪>当它没有找到匹配值。这是相当于字符串在数字数组。我们不需要用不同的方式来对待这些缺失值因为这些缺失的值将转换为当我们把价值翻倍,这正是我们想要的。套管双后,我们会调整规模的每个值数百万或数十亿。

num =双(num);%转换为双num (isMillion) = num (isMillion) * 10 ^ 5;%调整单元num (isBillion) = num (isBillion) * 10 ^ 8;%调整单元num (1:5)%预览前5行
ans =南7700000南7700000 20000000

现在让我们绘制结果直方图。

%的新人物直方图(num)%绘制柱状图包含(“预计投资(美元)”)%添加轴标签ylabel (项目的数量)%添加轴标签标题(“粮食土地获取数据集”)%添加标题

标记

在文本分析的一个常用方法是计算出现的单词。我们可以标记整个字符串数组并生成独特的单词作为字典的列表。检查字符串数组如何无缝地与熟悉的功能较低的,ismember独特的。我们还可以使用新功能擦除。标准化形式,我们将处理这个词复数和结合使用的遗产波特抽梗机代码。需要特征向量,所以我们需要将字符串转换为特征向量字符当我们使用它。

摘要=数据。(9);%提取总结分隔符= {' ',”、“,“。”,“- - -”,“””,“%”,“(”,“)”,“&”,' / ',“美元”};%字符分割stopwordsURL =“http://www.textfixer.com/resources/common-english-words.txt”;stopWords = urlread (stopwordsURL);%停止读单词stopWords =分裂(string (stopWords),”、“);%分裂停止的话stemmer_url =“http://tartarus.org/martin/PorterStemmer/matlab.txt”;如果存在(“porterStemmer.m”,“文件”)~ = 2%如果文件不存在websave (“porterStemmer.txt”,stemmer_url);从网上%保存文件移动文件(“porterStemmer.txt”,“porterStemmer.m”,“f”)%重命名文件结束令牌=细胞(大小(总结));%细胞arrray蓄电池2 = 1:长度(总结)在总结%为每一行s =分裂(总结(ii),分隔符)”;%由分隔符分割内容s =低(年代);%使用小写= regexprep(年代,“[0 - 9]+”,);%删除数据s (s = =)= [];%去除空字符串s (ismember(年代,stopWords)) = [];%删除停用词s =擦掉(年代,“‘s’);%去除所有格sjj = 1:长度(s)%为每个单词年代(jj) = porterStemmer (char (s (jj)));%得到遏制这个词结束令牌{2}= s;%增加蓄电池结束独特dict =(({}):令牌);%词典独特的词语

文档项频率矩阵

现在我们可以数出现的次数所有单词在字典里所有行通过创建文档项频率矩阵。

DTM = 0(长度(令牌),(dict));%蓄电池2 = 1:长度(令牌)%循环令牌(话说,~,idx) =独特(标记{2});%得到uniqe的话wcounts = accumarray (idx, 1);%得到单词统计关口= ismember (dict类型,单词);%为单词找到关口DTM (ii,关口)= wcounts;% unpdate dtm与词项结束

让我们排名前20位的是单词的频率。我们可以做更漂亮的分析与文档项频率矩阵,例如文本分类、情感分析和文本挖掘。

看看我的帖子你能通过文本分析找到爱吗?,与MATLAB分析推特文本挖掘与MATLAB莎士比亚文本挖掘与MATLAB机器学习研究论文为更多的细节。

[wc, ii] =排序(总和(DTM),“下”);%按照字数dtm排序%的新人物栏(wc (1:20))%绘制前20名甘氨胆酸ax =;%得到当前轴韩德先生斧子。XTick = 1:20;%设置x轴斧子。XTickLabel = dict (ii (1:20));% x轴标签斧子。XTickLabelRotation = 90;% x轴旋转蜱虫标签xlim (21 [0])%设置x轴的极限包含(“词”)%添加x轴标签ylabel (总字数的)%添加y轴标签标题(“前20个单词汇总列”)%添加标题

非英语文本

让我们不要忘记,我们经常处理非英语文本,尤其是如果数据源来自互联网,比如Twitter。让我们加载示例数据Excel文件包含文本法语、意大利语、德语、西班牙语、汉语、日语和韩语(所谓的无花果CJK文本)。中国和日本对“字符串”似乎有一个共同特点。我们证实了这一点包含我们之前看到。

[~,~,nonenglish] = xlsread (“non_english.xlsx”);%从Excel加载文本nonenglish =字符串(nonenglish);%转换为字符串disp (nonenglish(:,(1,者)))%预览3列cj_string = nonenglish(者);%在中国和日本的“字符串”包含(cj_string (1) cj_string {2} (2))%是日本在中文文本字符?
“英语”“中国”“日本”“英语”“中文”“日本語”“字符串”“字符串”“文字列”“你说MATLAB吗?”"你会说MATLAB吗?" " あなたはMATLABを話..." ans = logical 1

韩国,喜欢英语,使用空格来分隔单词。我们可以使用字符串分割成令牌。

kr_string = nonenglish (4、8);%的“你说MATLAB”韩国人分割(kr_string)%由空格分割字符串
ans = 3×1的字符串数组"당신은”“MATLAB을”“말합니까?”

因为语言不使用空格字符分开的话,我们需要使用专门的工具来分裂的话,如日本形态分析仪MeCab在我的文章中讨论你能通过文本分析找到爱吗?你可以找到更多的细节与MATLAB如何使用它这个文件交换条目

总结

字符串数组是一个有用的处理文本数据的新数据类型。字符串数组的行为更像数字数组,可以使代码更可读,更高效的存储文本数据和执行字符串操作。

试着和你的文本数据,而不是使用字符串数组单元特征向量的数组。这样做可以使代码更清晰和简洁特别是如果你利用新的功能。你也可以避免的需要cellfun与函数处理UniformOutput标记细胞通常需要字符数组向量。

显然我很兴奋的字符串数组。玩字符串数组和让我们知道你的想法在这里!




发表与MATLAB®R2016b


评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。