罗兰关于MATLAB的艺术

将想法转化为MATLAB

基于MATLAB的文本挖掘

你有没有想过谷歌是如何提供谷歌Suggest中的自动完成功能的?或者有时你会在智能手机上看到滑稽或恼人的自动纠错功能的结果?今天的客座博主Toshi Takeuchi通过一个有趣的莎士比亚文本挖掘例子解释了一种自然语言处理方法。

内容

预测文本游戏

有一种简单但功能强大的自然语言处理方法叫做语法语言模型你可以在MATLAB中找到很多乐趣。

为了了解它是如何工作的,我们将创建一个自动生成随机莎士比亚文本的预测性文本游戏。您还可以指定生成随机句子的第一个单词。下面是一些自动生成的假莎士比亚语录:

你杀了我的表姐罗密欧离别是如此甜蜜的悲伤,我再次请求护士把我推荐给你的女儿,借着丘比特的翅膀,带着它们翱翔在空中,你就像这些意外中的一件爱情是最辛辣的调味汁

我碰巧使用罗密欧与朱丽叶但您可以使用任何文本数据集合。我几乎想过用喜剧演员艾米·舒默语录.如果你有自己的写作,如电子邮件、短信等,这可以生成听起来像你的文本(查看)XKCD漫画).如果你收集了海盗的语言,你就可以像他们一样说话了。那将会很有趣。

字格

让我们从最基本的开始。N-gram是在句子中一起出现的单词序列。通常使用单词标记,它们是unigrams。你也可以用一对单词,那是一个双字词。八卦用三个词…一直到N个单词的N-grams。我们试试这个ngrams函数。

ngrams (“a b c d e”, 1)%单格ngrams (“a b c d e”, 2)%大人物ngrams (“a b c d e”, 3)%三角图
ans = ' ' ' b ' ' c ' ' d ' ' e ' ans = ' b ' ' b c ' ' c d ' ' d e ' ans = ' a b c ' ' b c d ' ' c d e '

语言模型

n -gram用于基于链式条件概率预测句子中的单词序列。这些概率是通过挖掘一个被称为语料库的文本集合来估计的;我们将用《罗密欧与朱丽叶》作为语料库。语言模型由这样的词序列概率组成。

下面是一个基于二元组元的例子,说明如何计算这样的概率。

P(word2|word1) = c('word1 word2')/c(word1)

P (word2 | word1)是word2跟在word1后面的条件概率,计算方法是用图表word1 word2的计数除以word1的计数。下面是一个三元组的例子。

P(word3|'word1 ') = c('word1 word2') /c('word1 word2')

单词序列并不总是由前面的单词决定的。这是一种非常简单的方法(称为马尔可夫模型)。然而,它很容易建模,并且工作得相当好。维基百科提供了一个例子,说明如何在语音识别应用程序中解决歧义,短语“识别语音”和“破坏一个漂亮的海滩”在美国英语中发音几乎相同,但意思却非常不同。你大概可以猜到“识别语音”的概率会比“毁掉一个漂亮的海滩”的概率高。语音识别应用程序将采用概率较高的选项作为答案。

莎士比亚作品的阅读与预处理

Project Gutenberg文本文件是普通的ASCII文件格式,带有LFCR换行符。它有很多额外的页眉和页脚文本,我们想要删除。我假设你已经下载了文本文件到你当前的文件夹。

罗密欧= fileread (“pg1513.txt”);%读取文件内容罗密欧(1:13303)= [];删除额外的标题文本罗密欧(end-144:end)=[];%删除额外的页脚文本disp(罗密欧(662:866))%预览文本
第一幕第一幕公共场所。[进入桑普森和格雷戈里,带着剑和皮带扣。]桑普森。格雷戈里,我保证,我们不会带煤。格雷戈里。不,那样我们就应该当煤矿工人了。

你需要删除非对话文本,比如舞台指示。您还需要在每个句子的开头和结尾添加句子标记,例如。我们将使用至少3个单词的句子。该过程在进行预处理函数。

处理=预处理(罗密欧);%预处理文本disp ([{6} char(10)加工处理{7}))%预览结果=低处理(加工);%小写文本
格里高利,我发誓,我们不会挨骂的。不,那样的话,我们就是矿工了。< / s >

构建Bigram语言模型

让我们使用一个简单的二元图模型bigramClass来构建第一个莎士比亚文本生成器。

分隔符= {' '“!””“','“- - -”“。”...字边界字符“:”“;”“?”' \ r '' \ n '“——”'&'};biMdl=bigramClass(分隔符);%实例化该类biMdl.build(加工);%建立模型
生成三元 ... .........................建立一个二元模型... ................

下面是一个如何使用二元模型来获得“你是”概率的示例。行表示二元图中的第一个字,列表示第二个字。

行= strcmp (biMdl.unigrams,“你”);%为“you”选择行坳= strcmp (biMdl.unigrams,“艺术”);% select col for '艺术'坳biMdl.mdl(行)“你是”的概率
ans = 0.10145

生成Bigram莎士比亚文本

使用这个双格语言模型,您现在可以生成听起来像莎士比亚的随机文本。首先,根据其概率随机选择一个以开头的双字词,然后根据其概率随机选择另一个双字词,从第一个双字词中的第二个词开始,以此类推,直到我们遇到。这在函数中实现textGennextWord

rng (1)%的再现性textGen(biMdl)%生成随机文本
ans=‘比为我呻吟还厉害’‘这致命的一点和每一天都会贯穿一切的意志同意’‘你和欢乐的t日,把所有风中最尖锐的地方都骄傲起来……’‘唉,你所采取的措施和所采取的措施是在闲暇时休息……’扔给我,一位议员在这些人中间说,我的主人,蔑视……’

生成莎士比亚文本

Bigram的句子听起来有点像莎士比亚,但它们没有很多意义。三字母组合模型会更好吗?让我们试试三级

triMdl = trigramClass(分隔符);%生成三角图triMdl。构建(加工、biMdl);%建立一个三元组模型rng (2)%的再现性textGen(triMdl,“你”%以“你”开头
生成三角图。。。。。。。。。。。。。。。。。。。。。。。。。建立三元模型。。。。。。。。。。。。。。。。。。。。。。ans=“你在这里告诉我,我的好朋友”“你不能教我如何爱”“你知道我经常爱罗莎琳”“你在这里告诉我,我多么爱你的智慧,那装饰和爱…”“你切断了我的住所”

创建智能手机应用程序

如果你喜欢XKCD漫画这显示了一个预测文本智能手机应用程序的示例,您可能希望创建自己的应用程序。如果是这样的话,请看这个网络研讨会,它向您展示了如何通过C代码生成将MATLAB代码转换为移动应用程序MATLAB对iPhone和Android的简化

总结

你可以看到三字母组合模型比双字母组合模型更有效,但威廉·莎士比亚不必担心这样的模型会取代他的剧作家工作。我们讨论了自动补全、自动校正、语音识别等实际应用。我们还讨论了如何使用C代码生成从MATLAB代码到移动应用程序。

在实际的自然语言处理应用中,如解决“语音识别”与“语音识别”之间的歧义。在语音识别中的“破坏一个漂亮的海滩”,模型需要进一步改进。

  • 要给一个句子打分,你要用链式法则来计算一系列条件概率的乘积。因为它们都是小的数,所以相乘会得到更小的数算术下溢.我们应该使用对数概率。
  • 如何处理语料库中没有的新序列或新词?我们需要使用平滑或回退来解释看不见的数据。

要了解如何使用MATLAB中的文本,请阅读这本非常棒的入门书基于MATLAB的文本挖掘

对于一款休闲的文本预测游戏,你可以使用我在这篇文章中使用的简单模型。尝试这里的代码示例,并从您感兴趣的任何语料库构建您自己的随机文本生成器。或者尝试实现分数方法,该方法使用这里提供的代码合并建议的细化。

如果你对语言模型有兴趣,请在评论中分享在这里




发布与MATLAB®R2015a

|
  • 打印
  • 发送电子邮件

评论

如需留言,请点击在这里登录到您的MathWorks帐户或创建新帐户。