偶述 Wolfram 中文分词算法

吴飞

从 2000 年开始学习和使用 Mathematica,《Mathematica 演示项目笔记》作者,发表Wolfram Demonstrations Projects 50 余篇。

引言:

助人间才子佳人兴,轻歌曼舞,星移斗横。 ——《群音类选 玉如意记 赏月登仙》

概念

一国的创新能力应当看该国语言是否占有某领域的统治地位或极大的影响力。如十八世纪,法国成为启蒙运动的中心,法语成为欧美上流社会和知识分子的国际语言,更是外交和法律的统治语言。又如十九世纪,德国成为世界科学和研究的中心,当时的一流科技文献中德语占 70% 以上。二十世纪至今的英美语系取而代之成为当代的国际通用语言,尤其是电子、计算机和信息化产业,发源地就是美国硅谷。

在西方语言,如英语的行文中,单词之间是以空格作为自然分界符。而中文只有字、句和段能通过明显的分界符来划界,唯独词没有一个形式上的分界符。虽然英文在部分短语的划分问题也存在同样问题,不过在词这一层上,中文确实要比英文复杂得多、困难得多。

古代汉语中,除了人名、地名等,词通常就是单个汉字,所以当时没有分词书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。现代汉语的基本表达单元也不再是单个的字了,而是以词作为最小单元,且以双字或者多字词居多。

中文分词是指将现代汉语中的句子切分成单独的表达含义的字或词。或者说,分词就是将连续的汉字序列按照一定的规范重新组合成字或词序列的过程。如下以一个顺口溜举例,如果没有进行分词,未经练习的人恐怕很难说得利索。经过分词后,分词符号为 | ,就变得比较容易理解和区分了。

原始语句: 黑化肥发灰会挥发;灰化肥挥发会发黑。

分词结果: 黑化肥 | 发灰 | 会 | 挥发;灰化肥 | 挥发 | 会 | 发黑。

但由于人们认识水平的不同,对词和短语的边界很难去区分。例如:“对制造和销售假冒商品给予严厉处罚”,“制造和销售假冒商品” 本身是一个词还是一个短语,不同的人会有不同的标准。即使是完全相同的文本和句子,不同的分词会产生完全不同的语义,并给读者造成不同的理解,存在歧义。

例如:| 羽毛球拍卖完了 |,可以切分成 | 羽毛 | 球拍 | 卖完了 |、也可切分成 | 羽毛球 | 拍卖 | 完了 |,如果没有上下文或其他的补充,恐怕谁也不能断言 | 拍卖 |在这里算不算一个词。

算法简述

对于一句话,人可以通过自己的知识和智力来明白哪些是词,哪些不是词,但如何让计算机也能理解并进行处理,这样的过程就是中文分词算法。分词算法是自然语言处理和文本挖掘的基础,中文分词算法指在输入一段中文字符串后,通过计算机自动识别语句中所应包含的字或词,最终能成功地输出该段语句所对应的分词结果,该分词结果经一步为语句和语义的识别奠定基础。

现有的中文分词算法可归纳为如下策略:首先基于公知的中文词典,先将常用的词在计算机中进行建档,随后将待处理的文本以字符串的方式同词典进行匹配和比较,若在词典中能找到某一对应的字符串,则成功匹配或识别出一个词。

对于较难鉴定的词,则可根据不同的权重函数或文本中词出现的频率进行评估,最终通过评分,计算机得出结论,并认为已识别出了语句中的字或词。更先进的算法还可包含同义词和反义词的语义评估,以进一步提高分词和识别的正确率。常用的中文分词算法举例如下:

  • 正向最大匹配算法:Maximum Matching
  • 逆向最大匹配算法:Reverse Maximum Matching
  • 正向最小匹配算法:Minimum Matching
  • 逆向最小匹配算法:Reverse Minimum Matching
  • 双向最大匹配算法:Bidirectional Maximum Matching
  • 双向最小匹配算法:Bidirectional Minimum Matching
  • 双向最大最小匹配算法:Bidirectional Maximum Minimum Matching
  • 全切分算法:Full Segmentation
  • 最少词计数算法:Minimal Word Count
  • 最大多元计数算法:Max N-gram Count
  • 最大概率分词算法:Max Probability Value

方法一:轻歌曼舞

Jlink 调用 Java Class

轻:安装分词组件

调用 JLink 安装包,并设置和查阅功能项。

“Java 分布式中文分词组件 - word 分词” 是由杨尚川在 Github 开发一个“轻”量级中文分词开源工具,获得较多业内人士和爱好者的认可和支持。

项目简介:https://github.com/ysc/word

下载链接:https://pan.baidu.com/s/1dDziDFz#list/path=%2F

歌:创建 Java Class

载入 Java Class 中文分词 wordSegmenter。分词英语叫 Segment 就是分割,同音字通假一下,就是“歌”了。

创建新的 JavaNew 中文分词,并将它赋值为 JavaObject。

可查看 Java 静态变量值

曼:调用Java Class

取一段字符串作为分词的输入。

调用 JavaObject 生成结果矩阵链表。

再将中文分词结果,从矩阵中取出来,得到输出。当然输入数据量大的话,稍微有点“慢”。

舞:应用分词结果

案例一:翻译

接下来结合 Mathematica 的一体化算法平台,就可应用中文分词结果,如中文翻译成多国语言。

案例二:词云

也可应用中文分词结果生成一种中文词云,简单地说就是要让词“舞”动起来。

更进一步,可以直接从网页上爬下一段文本作为输入字符串,然后出词云图,如世界杯的新闻词云。

方法二:星移斗转

Wolfram N-gram 方法

如下我们以Wolfram 语言,对多元计数(N-gram Count)方法展开进行详述。

星:简介多元单词概念

在文本和单词中,通常多元词汇拥有更高的信息熵,如下以《爱丽丝梦游仙境》为例。

采用多元单词计数(N-gram count)统计熵,一般情况下 4-gram 以接近整体的熵。

移:英语多元计数算法

如下以英文文本作为研究对象,采用多元单词计数方法提取分词。以高阶多元词识别优先,将高阶多元词的词频减去低阶多元词的词频,以此类推,最终获得多元词识别的结果。

调用以上函数,以爱丽丝为文本,默认情况下为 4-gram 算法。

采用词云展示一下,可以看见 “小白兔”(white rabbit)了。

斗:中文多元计数算法

如下以中文文本作为研究对象,也采用多元单词计数方法提取分词,也以高阶多元词识别优先。

主要区别在于如下两行代码,由于英语中采用空格符(white space)作为单词之间的分割符,因此将中文变通的处理一下,也采用空格符作为字与字之间的分割符,随后再塞到 WordCounts 中,此后一样处理。

横:调用中文分词算法

调用以上函数,以道德经为文本,默认情况下为 4-gram 方法。

采用词云展示一下,可以看见 “是以圣人” 等多元词了,词组终于都横出来了。

需要指出的是此处以介绍方法为目标,多元(n-gram)计数的方法是一种基于输入文本统计词频方法,它没有 “先验的经验”,如额外中文词典为支持,完全是基于输入文本的信息统计后得出分词结果,因此对于小文本和短文本识别效果是有限的。此外,在识别的精度和准确率上也低于之前 Java Class 的。毕竟方法一是 10M 的文件包,而方法二仅有 10 行代码。

总结

一国的语言是一国人的表达方式,也是该国科技和文化的载体。每一位热爱自己祖国的人都会觉得本国的母语是世界上最美的语言,并为本国的语言而感到自豪和骄傲。汉语经历五千年文明的沉淀和演化,逐步形成现在人们所使用的现代汉语。在人工智能即将来临之际,希望有更多的有志之士,将中文作为自然语言处理(NLP)的研究对象,将科技之光和文化之美,通过母语来传承和发扬。

原文发布于微信公众号 - WOLFRAM(WolframChina)

原文发表时间:2018-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏hadoop学习笔记

Hanlp自然语言处理工具的使用演练

Hanlp是由一系列模型与算法组成的工具包,目标是普及自然语言处理在生产环境中的应用。Hanlp具备功能完善、性能高效、架构清洗、语料时新、可自定义的特点;提供...

1992
来自专栏marsggbo

什么是P问题、NP问题和NPC问题

    这或许是众多OIer最大的误区之一。     你会经常看到网上出现“这怎么做,这不是NP问题吗”、“这个只有搜了,这已经被证明是NP问题了”之类的话。你...

1152
来自专栏奇点大数据

遗传算法(2)

在遗传算法中我们再举一个求极大值的例子。这种例子也是比较多见的,只要我们把一些数据关系描述成函数之后就会有一些求极大值或者极小值的问题。 其实极大值和极小值是一...

34612
来自专栏窗户

怀念Galois

  我的第一篇谈到具体学科的博客,还是献给我最钟爱的数学。   个人比较喜欢离散数学,并非因为曲高和寡,而是因为数学分析、概率论、拓扑学、泛函之类的高手实在太多...

1965
来自专栏趣学算法

ACM竞赛学习指南(算法工程师成长计划)

6731
来自专栏量化投资与机器学习

【独家重磅】来自华尔街的量化金融面试Q&A(第一期)

这是一个十分简单的问题。因为10=2*5,所以0的个数就是100!因式分解后2*5(必须配对)的个数。显然因式分解中2的个数比5多,因此问题划归为5的个数决定了...

1202
来自专栏mathor

第五届蓝桥杯决赛B组C/C++——殖民地

1765
来自专栏java一日一条

有没有一段代码,让你觉得人类的智慧也可以璀璨无比?

Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推...

963
来自专栏大数据文摘

改变计算技术的 9 个伟大算法

2423
来自专栏大数据

大数据图:循环点阵

本文的内容最初由Marko Rodriguez和Bobby Norton在Aurelius博客上共同撰写。

3355

扫码关注云+社区

领取腾讯云代金券