罗兰关于MATLAB的艺术

将想法转化为matlab

基于MATLAB的莎士比亚文本挖掘

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

内容

预测文本的游戏

有一种简单但功能强大的自然语言处理方法叫做n-gram.-基于语言模型使用matlab,您可以获得很多乐趣。

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

我杀死了我的堂兄罗密欧分手是如此甜蜜的悲伤,我再次问护士向你的女儿借用丘比特的翅膀和他们翱翔他们,就像这些事故的一个爱情一样,是最锋利的酱汁

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

n-grams.

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

ngrams('a b c d e'1)%unfigrams.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 Text文件是纯粹的Vanilla ASCII文件格式,LFCR线条断裂。它附带了许多我们要删除的额外标题和页脚文本。我假设您已将文本文件下载到当前文件夹。

罗密欧= fileread (“pg1513.txt”);%读取文件内容罗密欧(1:13303)= [];删除额外的标题文本罗密欧(端- 144:端)= [];删除额外的页脚文本disp(罗密欧(662:866))%预览文本
第一幕:公共场所。[桑普森和格里高利带着剑和盾牌上了楼。桑普森。格里高利,我发誓,我们决不担罪。格雷戈里。不,那样的话,我们就是矿工了。

您需要删除非对话框,例如阶段方向。您还需要在每个开头和结尾添加句子标记,例如。我们将使用至少3个单词的句子。此程序是处理的预处理函数。

处理=预处理(罗密欧);%预处理文本disp ([{6} char(10)加工处理{7}))%预览结果=低处理(加工);%小写的文本
gregory,我的话,我们不会携带煤炭。  no,因为那时我们应该是colliers。

构建Bigram语言模型

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

分隔符= {'''!'''''”、““- - -”“。”......字边界字符':'';''?''\ r'' \ n '“——”“&”};biMdl = bigramClass(分隔符);%实例化课程biMdl.build(加工);%建立模型
生成Bigrams .........................建立一个Bigram模型...................

下面是一个如何使用双元模型来得到“你是”的概率的例子。行表示双字符中的第一个单词,列表示第二个单词。

行= strcmp (biMdl.unigrams,“你”);% select row for 'thou'col = strcmp(bimdl.unigrams,“艺术”);% select col for '艺术'bimdl.mdl(行,col)'thou art'的概率
ans = 0.10145

生成Bigram莎士比亚文本

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

RNG(1)%的再现性textGen (biMdl)%生成随机文本
“这致命的点,每一天都射穿了所有会同意的”“自负更尖锐的地面的所有风你和快乐的日子的t…“唉,你所采取的措施是在闲暇时的休息服务……''cast me and said an alderman drawn among these my master and scorn the...'

生成莎士比亚文本

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

Trimdl =三元类(分隔符);%生成三元模型trimdl.build(已加工,bimdl);%建立一个三元组模型RNG(2)%的再现性textGen (triMdl“你”%以“thou”开头
生成三元模型 ... .........................建立一个卦模型 ... ......................你在这里告诉我,我的好朋友,你不能教我如何爱,你知道我经常爱玫瑰,你在这里告诉我,我多么爱你的智慧,那是塑造和爱的装饰品……你切断了我的住处

创建智能手机应用程序

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

总结

你看到三岁的模型比Bigram模型更好地工作,但威廉·莎士比亚将没有任何东西害怕那种拍摄他的剧作家工作的模式。我们讨论了自动完成,自动更正,语音识别等的实用用途。我们还讨论了如何使用C代码生成从Matlab代码到移动应用程序。

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

  • 要给一个句子打分,你要用链式法则计算一堆有条件概率的产品。由于它们是少数,因此通过将它们乘以甚至更小数字,导致算术下溢.我们应该使用日志概率。
  • 如何处理语料库中没有出现的新序列或新词?我们需要使用平滑或后退来解释看不见的数据。

要学习在MATLAB中使用文本可以做什么,请查看这本很棒的介绍性书籍基于MATLAB的文本挖掘

对于休闲预测的文本游戏仅适用于乐趣,您可以使用此帖子中使用的简单模型。请尝试此处的代码示例,并从您兴趣的任何语料库构建您自己的随机文本生成器。或试图实施分数使用此处提供的代码结合了建议的改进的方法。

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




发布与MATLAB®R2015a

|
  • 打印
  • 发送电子邮件

评论

要发表评论,请点击此处登录到您的MathWorks帐户或创建一个新帐户。