用MATLAB挖掘莎士比亚的文本
您是否想知道谷歌如何在谷歌建议中提供自动完成功能?或者有时你会看到智能手机上滑稽或恼人的自动更正功能的结果?今天的客座博主Toshi Takeuchi通过一个有趣的莎士比亚文本挖掘例子来解释一种自然语言处理方法。
内容
预测文字游戏
有一种简单但功能强大的自然语言处理方法叫做语法的语言模型用MATLAB你会得到很多乐趣。
为了了解它是如何工作的,我们将创建一个预测文本游戏,自动生成随机莎士比亚文本。您还可以指定第一个单词来生成一个随机句子。以下是一些自动生成的假莎士比亚语录:
是你杀了我的堂兄吗罗密欧离别是如此甜蜜的悲伤,我再次请求护士把我托付给你的女儿借丘比特的翅膀和它们一起飞翔吧你就像这些意外事件中的一个爱情是最尖锐的酱汁
我碰巧用了罗密欧与朱丽叶但您可以使用任何文本数据的集合。我几乎想过用喜剧演员艾米·舒默语录.如果你有自己的写作集合,如电子邮件、短信等,这可以生成听起来像你的文本(查看这部XKCD漫画).如果你有海盗说话的集合,你可以像他们一样说话。那会很有趣的。
字格
让我们从最基本的开始。N-gram是在一个句子中一起出现的单词序列。通常使用的是单词标记,它们是字母。你也可以用一对单词,那就是bigram。三元名词用了三个词…一直到N个单词的N个格。让我们试试这个ngrams函数。
ngrams (“a b c d e”, 1)% unigramsngrams (“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格用于预测句子中的单词序列。这些概率是通过挖掘被称为语料库的文本集合来估计的;我们将用《罗密欧与朱丽叶》作为我们的语料。语言模型是由这样的词序列概率组成的。
下面是一个关于如何计算这种概率的基于bigram的例子。
P(word2|word1) = c('word1 ')/c(word1)
P (word2 | word1)是word2跟在word1后面的条件概率,通过将图形'word1 word2'的计数除以word1的计数来计算它。下面是一个三字母组合的例子。
P(word3|'word1 word2') = c('word1 word2') /c('word1 word2')
单词序列并不总是由前面的单词决定的。这是一种非常简单的方法(称为马尔可夫模型)。然而,它很容易建模并且工作得相当好。维基百科提供了一个例子,说明这在解决语音识别应用程序中的歧义方面是如何有用的,其中短语“recognition speech”和“wreck a nice beach”在美式英语中发音几乎相同,但意思非常不同。你可能会猜到,“识别语音”比“破坏一个美丽的海滩”有更高的概率。语音识别应用程序将采用概率较高的选项作为答案。
阅读和预处理莎士比亚
Project Gutenberg文本文件是一种普通的ASCII文件格式,带有LFCR换行符。它带有许多额外的页眉和页脚文本,我们想删除它们。我假设您已经将文本文件下载到您当前的文件夹。
罗密欧=文件读取(“pg1513.txt”);%读取文件内容罗密欧(1:13303)= [];%删除额外的标题文本罗密欧(end-144:end) = [];删除多余的页脚文本disp(罗密欧(662:866))%预览文本
第一幕:公共场所。[桑普森和格里高利带着剑和盾牌进来。桑普森。格里高利,我的天哪,我们可不会背煤。格雷戈里。不,那样我们就得当矿工了。
你需要删除非对话文本,如舞台说明。您还需要在每个句子的开头和结尾添加句子标记,例如和。我们将使用包含至少3个单词的句子。处理此过程进行预处理函数。
Processed =预处理(romeo);%预处理文本Disp([加工{6}char(10)加工{7}])%预览结果加工过的=低(加工过的);%小写文本
格雷戈里,我的天哪,我们可不要背煤。不,那样我们就应该是矿工。< / s >
建立Bigram语言模型
让我们使用一个简单的bigram模型bigramClass建造了第一台莎士比亚文本生成器。
分隔符= {' ',“!”,”“,”、“,“- - -”,“。”,...%字界字符“:”,“;”,“?”,' \ r ',' \ n ',“——”,“&”};biMdl = bigramClass(分隔符);%实例化类biMdl.build(加工);%建立模型
生成bigrams... .........................构建bigram模型... ................
这里有一个例子,你如何使用bigram模型来获得“你是”的概率。行表示bigram中的第一个单词,列表示第二个单词。
行= strcmp(biMdl.unigrams,“你”);%为'thou'选择行坳= strcmp (biMdl.unigrams,“艺术”);% select col for 'art'坳biMdl.mdl(行)“你是”的概率
Ans = 0.10145
生成Bigram莎士比亚文本
使用这个bigram语言模型,您现在可以生成随机文本,希望听起来像莎士比亚。它的工作原理是,首先根据概率随机选择以开头的bigram,然后根据概率随机选择另一个bigram,从第一个bigram中的第二个单词开始,以此类推,直到遇到。这是在函数中实现的textGen而且nextWord.
rng (1)可重复性%textGen (biMdl)%生成随机文本
Ans = '比我更痛苦的呻吟' '这致命的一点,每天射穿所有的都会同意' '自负更尖锐地所有的风你和快乐的日子的t…“唉,你的尺度和你所采取的措施是休息的闲暇服务……' 'cast me and said an alderman drawn among these my master and scorn the...'
生成三字母莎士比亚文本
Bigram句子听起来有点像莎士比亚的作品,但它们没有太多的意义。我们使用三元模型会做得更好吗?让我们试试trigramClass.
triMdl = trigramClass(分隔符);%生成三元图triMdl。构建(加工、biMdl);构建一个三元模型rng (2)可重复性%textGen (triMdl“你”)%以“你”开头
生成三元图... .........................建立一个卦模型 ... ......................Ans = '你在这里告诉我,我的好朋友' '你不能教我,我如何爱' '你知道我经常爱玫瑰' '你在这里告诉我,我如何爱你的智慧,装饰塑造和爱…"你剥夺了我的住所"
创建智能手机应用程序
如果你喜欢的话这部XKCD漫画这显示了一个预测文本智能手机应用程序的例子,你可能想要创建自己的。如果是这样,请查看这个网络研讨会,它向您展示了如何通过C代码生成将MATLAB代码转换为移动应用程序MATLAB到iPhone和Android使容易
总结
你会发现三字母组合模型比双字母组合模型更有效,但威廉·莎士比亚(William Shakespeare)完全不用担心这些模型会取代他的剧作家工作。我们讨论了自动补全、自动纠错、语音识别等实际应用。我们还讨论了如何使用C代码生成从MATLAB代码转换到移动应用程序。
在实际的自然语言处理应用中,如解决“识别语音”与“识别语音”之间的歧义。“破坏一个美丽的海滩”的语音识别,模型需要进一步的改进。
要了解您可以在MATLAB中对文本做什么,请查看这本很棒的介绍性书籍基于MATLAB的文本挖掘.
对于一个休闲的文本预测游戏,你可以使用我在这篇文章中使用的简单模型。尝试这里的代码示例,并从您感兴趣的任何语料库构建您自己的随机文本生成器。或者尝试实现分数方法,该方法使用此处提供的代码合并了建议的改进。
如果你对语言模型的使用有兴趣,请在评论中分享在这里.