罗兰在MATLAB的艺术

把想法变成MATLAB

请注意

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

在MATLAB处理文本

我想介绍一下今天的嘉宾博客戴夫Bergstein, MathWorks MATLAB产品经理。在今日的帖子里,戴夫讨论最近的更新与MATLAB的文本处理。

内容

在今日的帖子里我分享一个文本处理的例子使用新的字符串数组和一个新的集合文本处理功能,无论是在R2016b引入。我也给建议时,最好使用字符串,字符,或细胞用于文本和分享我们的一些思考未来。

也要看看古原的职位介绍字符串数组和罗兰的文章字符串唱赞歌

例子:我的车是多晚?

我的朋友在纽约讨论了延迟她的公交路线。让我们来看看一些数据,看看典型的延迟是火车和公共汽车。的开放纽约计划股票数据包括150000多个公共交通事件生成6年。我下载这个数据作为一个CSV文件:https://data.ny.gov/Transportation/511-NY-MTA-Events-Beginning-2010/i8wu-pqzv

导入数据

我读到表中使用的数据readtable并指定TextType名称-值对的字符串阅读文本字符串数组。

数据= readtable (511 _ny_mta_events__beginning_2010.csv,“TextType”,“字符串”);
警告:变量名称进行了修改,使它们有效的MATLAB标识符。原来的名字是保存在VariableDescriptions财产。

这是一个表中的变量列表:

data.Properties.VariableNames
ans = 1×13单元阵列列1到4的EventType‘OrganizationName’‘FacilityName’‘方向’列5到9“城市”“县”“国家”“CreateTime”“CloseTime”列10到13“EventDescription”“RespondingOrganiz…”“纬度”的经度

data.EventDescription是一个字符串数组,包含事件描述。让我们仔细看看事件。

eventsStr = data.EventDescription;

与特征向量或单元阵列的特征向量,字符串数组的每个元素是一个字符串本身。看看我可以字符串数组的索引就像一个数字数组和字符串数组返回。

eventsStr (1:3)
ans = 3×1的字符串数组”MTA纽约过境巴士:由于早些时候洪水Q11汉密尔顿海滩恢复正常服务”“MTA纽约过境巴士:由于施工,向北M1总线的第147街领域:初级“亚当·鲍威尔“MTA纽约交通地铁:由于延迟,布朗克斯绑定# 2 & 3线内文斯街车站(布鲁克林)”

许多报告延误事件的描述像操作迟到10分钟。看到例如26分钟的延迟是5180事件的报道。

eventsStr (5180)
ans = " MTA长岛铁路:由于轨道碎片,西行的蒙托克分支之间的蒙托克站(萨福克县)和牙买加站(皇后)44点从蒙托克由于牙买加32点,操作26分钟迟到是由于未经授权的车辆在汉普顿海湾附近的轨道。”

确定延迟

我想找到所有包含“迟到”的事件。MATLAB R2016b还介绍了十多个新功能来处理文本。这些函数与特征向量,细胞特征向量数组和字符串数组。你可以了解这些功能的字符和字符串在我们的文档页面。

我将文本转换为小写和确定哪些事件包含“末”使用包含函数。

eventsStr =低(eventsStr);idx =包含(eventsStr,“晚了”);lateEvents = eventsStr (idx);

提取延迟时间

我从短语中提取分钟喜欢操作迟到10分钟的使用功能extractAfterextractBefore

让我们看看第一晚的事件。确切的词我们正在寻求不出现在这个事件中。当我们寻找文本后我们回到“操作”失踪字符串。

lateEvents (1) extractAfter (lateEvents (1),“操作”)
ans = " mta长岛铁路:由于延迟,西行的巴比伦分支之间speonk车站(speonk)和纽约中央火车站(曼哈顿)点08分离职由于纽约@ 7:02上午迟到15分钟@巴比伦。”ans = <失踪>

让我们看看第二个事件。这个字符串包含短语“操作14分钟晚了”。提取文本的操作后,我们得到14分钟晚了由于信号问题。提取文本“分钟”之前我们回到“14”我们可以转换为一个数字值使用

lateEvents (2) s = extractAfter (lateEvents (2),“操作”)= extractBefore(年代,“分钟”)minLate =双(s)
ans = " mta长岛铁路:由于延迟西行ronkonkoma分支出的车站(萨福克县)飞机于8:01点火车由于为佩恩车站47点运行14分钟晚了由于信号问题”s =“14分钟晚了由于信号问题”=“14”minLate = 14

成功!我们提取火车延迟从事件描述。现在让我们把这一切放在一起。我晚提取分钟从所有的事件和缺失值使用rmmissing函数。然后我用剩下的值转换成数字并画一个柱状图的结果。

s = extractAfter (lateEvents“操作”);= extractBefore(年代,“分钟”);s = rmmissing(年代);minLate =双(s);直方图(minLate 0:5:40) ylabel (事件的数量)包含(“分钟”)标题({交通延误的,纽约大都会运输署的})

它看起来像报道延迟通常10 - 15分钟。这个简单的程序捕获的许多交通延误,但不是全部。这种模式并不总是适合(再次考虑lateEvents (1))。我还遗漏了任何可能在小时的延误。你能改善吗?

文本数据

文本数据字符串数组是一个伟大的选择就像上面的例子,因为他们是记忆效率和执行比细胞特征向量(以前称为数组cellstr)。

让我们来比较一下内存使用。我将字符串数组转换成一个单元阵列的特征向量cellstr命令和检查内存。看到字节列,它显示了字符串数组大约是12%更有效率。

eventsCell = cellstr (eventsStr);谁事件*
类属性名称大小字节eventsCell 151225 x1 73208886细胞eventsStr 73208886 x1 64662486字符串

内存储蓄可以为许多小块的文本更大。例如,假设我想存储每个词作为一个单独的数组元素。首先我加入150000报道成一个长字符串使用加入函数。然后我把这个长字符串使用的空间分裂函数。结果是一个字符串数组存储超过400万字在不同的元素。这里的内存节省近2 x。

wordsStr =分裂(加入(eventsStr));wordsCell =分裂(加入(eventsCell));谁字*
类属性名称大小字节wordsCell 4356256 x1 535429652细胞wordsStr 535429652 x1 284537656字符串

字符串数组也表现得更好。您可以使用字符串数组实现最佳性能结合引入R2016b文本处理功能。在这里,我比较的性能取代在一个字符串数组的strrep单元阵列的特征向量。看看取代用一个字符串数组大约是4倍的速度比strrep单元阵列。

f1 = @()取代(eventsStr,“延迟”,“晚了”);f2 = @ () strrep (eventsCell,“延迟”,“晚了”);时间(f1)时间(f2)
答答= 0.23239 = 0.062507

建议文本类型

因此,你应该使用你所有的文本字符串数组吗?也许现在还不是时候。MATLAB具有三种不同的方式来存储文本:

  • 特征向量(字符)
  • 字符串数组(字符串)
  • 细胞阵列特征向量(细胞)

现在R2017a(),我们鼓励您使用字符串数组来存储文本数据,如交通事件。我们还不建议使用其他地方的字符串数组字符串数组以来尚未接受了在MATLAB。注意,我使用一个特征向量用于指定文件名readtable和一个单元阵列的特征向量图标题。

展望未来

在未来呢?我们觉得字符串数组提供一个更好的体验比字符特征向量的向量和细胞数组。我们的计划是推出更广泛使用的字符串数组。

接下来的几个版本中我们将更新更多的MATLAB函数和属性接受字符串数组除了字符特征向量的向量和细胞数组。当我们这样做,它将成为你更容易在更多的地方使用字符串数组。

接下来我们将取代电池阵列特征向量在MATLAB字符串数组。注意,细胞数组本身不会去任何地方。他们是一个重要的MATLAB容器类型和存储混合数据类型或锯齿状大小的数组等使用。但我们希望文本数据的使用将减少和成为主要由字符串数组代替更多的内存效率和纯文本数据的表现更好。

除此之外,随着时间的推移,我们将使用字符串数组在新功能和新特性的特征向量(但将继续返回特征向量在许多地方兼容性)。我们期望特征向量将继续生活在简化了代码的兼容性和特殊用例。

说到兼容性:我们非常关心简化了MATLAB代码的兼容性,今天比以往任何时候都更。因此,我们采取以下措施推出的字符串数组:

  1. 文本处理功能(新旧)通过返回的文本类型。这意味着您可以选择与这些函数使用字符串(字符串使用是没有必要的)。注意,我使用分裂加入上面的字符串数组或单元阵列的特征向量。
  2. 我们今天推荐的字符串数组的文本数据的应用程序。这里有一些方法可以选择字符串使用。在这个例子中,我选择了一个字符串数组readtable使用TextType名称-值对。从函数和字符串数组返回extractBefore因为我通过了一个字符串数组作为输入。
  3. 我们添加了花括号索引的字符串数组返回一个特征向量的兼容性。细胞数组返回其内容索引时用花括号{}。代码使用细胞阵列特征向量通常用花括号来访问数组索引特征向量。这样的代码可以使用花括号以来字符串数组索引也将返回一个特征向量。看看下面的代码返回同样的结果f是一个细胞数组或字符串:
d = datetime (“现在”);f = {“h”,“米”,“年代”};%使用单元阵列n = 1:3, d。格式= f {n};disp (d)结束
9 43 10
f = (“h”,“m”,“s”];%使用一个字符串数组n = 1:3, d。格式= f {n};disp (d)结束
9 43 10

我希望听到更多关于这个主题。请与我们分享您的输入在留言里。我们感兴趣的收到你的信

我们希望字符串数组将帮助你实现你的目标,我们正在采取的步骤提供一个光滑的采用。如果你还没有试过字符串数组,从我们的文档了解更多字符和字符串




发表与MATLAB®R2017a


评论

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