罗兰谈MATLAB的艺术

将想法转化为MATLAB

请注意

罗兰谈MATLAB的艺术已退役,不会更新。

用MATLAB挖掘莎士比亚文本

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

内容

预测文本游戏

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

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

是你杀了我的堂兄吗罗密欧,离别是如此甜蜜的悲伤,我再次请求护士把我介绍给你的女儿借丘比特的翅膀,和它们一起飞翔吧,恶作剧吧你就像这些意外之一爱情是最辛辣的酱汁

我碰巧用了罗密欧与朱丽叶来自Project Gutenberg,但是你可以使用任何文本数据的集合。我差点想过用喜剧演员艾米·舒默.如果你有自己写的东西,比如电子邮件、短信等,它可以生成听起来像你的文字(检查这个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-grams用于基于链式条件概率预测句子中的单词序列。这些概率是通过挖掘被称为语料库的文本集合来估计的;我们将用《罗密欧与朱丽叶》作为我们的语料。语言模型由这样的词序列概率组成。

这里有一个基于重子的例子,你将如何计算这样的概率。

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

P (word2 | word1)是word2跟随word1的条件概率,通过将igram 'word1 word2'的计数除以word1的计数来计算它。下面是一个关于三元组的例子。

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

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

阅读和预处理莎士比亚

古登堡项目文本文件是一个普通的ASCII文件格式,带有LFCR换行符。它带有许多我们想要删除的额外页眉和页脚文本。我假设您已经将文本文件下载到当前文件夹中。

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

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

Processed =预处理(romeo);预处理文本%Disp ([processed{6} char(10) processed{7}])%预览结果加工=较低(加工);%小写文本
格里高利,我发誓,我们不会再火上浇油了。 不,因为那时我们应该是矿工。< / s >

构建Bigram语言模型

让我们使用一个简单的bigram模型bigramClass建造了第一个莎士比亚文本生成器

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

这里有一个如何使用bigram模型来获得“thou art”的概率的例子。Rows表示bigram中的第一个单词,columns表示第二个单词。

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

生成大型莎士比亚文本

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

rng (1)再现率%textGen (biMdl)%生成随机文本
“水泡比我的呻吟更远”“这致命的点和每一天,射穿所有将同意”“自负更最尖锐地所有风你和欢乐的日子……”“唉,你的量和取是在闲暇时服的……' 'cast me and said an alderman drawn among these my master and scorn the...'

生成莎士比亚文本

大句式听起来有点像莎士比亚的作品,但它们没有什么意义。我们用三字母组合模型会做得更好吗?让我们试试trigramClass

triMdl = trigramClass(分隔符);%生成三元图triMdl。构建(加工、biMdl);建立一个三元模型rng (2)再现率%textGen (triMdl“你”%以“thou”开头
生成三元图... .........................建立一个卦模型 ... ......................Ans = '你来告诉我,我的好朋友' '你不能教我如何去爱' '你知道我经常爱罗莎琳' '你来告诉我,我多么爱你的智慧那装饰塑造和爱…"你抢了我的住处"

创建智能手机应用程序

如果你愿意这个XKCD卡通它展示了一个文本预测智能手机应用程序的例子,你可能想创建自己的。如果是这样,看看这个网络研讨会,它将向您展示如何通过C代码生成将MATLAB代码转换为移动应用程序MATLAB到iPhone和Android使简单

总结

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

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

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

要学习如何在MATLAB中处理文本,请查看这本很棒的介绍性书籍MATLAB文本挖掘

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

如果你有语言模型的有趣用法,请在评论中分享在这里




MATLAB®R2015a发布

|
  • 打印
  • 发送电子邮件