京东搜索框的汉语分词技术太牛了!!!---------js的番外拓展 (二)

系列文章目录

JS的垃圾回收机制-----------------------------js的番外拓展 (一)

https://blog.csdn.net/weixin_44070254/article/details/116245572?spm=1001.2014.3001.5501


文章目录

  • 系列文章目录
  • 前言
  • 一、分词涉及的主要问题 ?
    • 1. 核心词表问题
    • 2.词的变形问题
    • 3.词缀的问题
    • 4.不同目标的应用
  • 二、基于词典和规则的汉字分词分类
    • 1 基于词典和规则的汉字分词
      • 1.1 最大匹配分词方法
      • 1.2 全切分分词算法
      • 1.3 基于理解的中文分词算法
      • 2.1 N元语法(N-gram)模型和隐马尔可夫模型(HMM)
      • 2.2 互信息模型
      • 2.3 最大熵模型
    • 3 规则和统计方法相结合的汉字分词方法
  • 三、常用中文分词包
  • 总结


前言

中文分词的技术是怎样实现的?例如有一段文字“吃亏不要紧,只要主义真”,双击“吃”字,会自动选中“吃亏”。我想问的就是系统怎么知道这两个字构成一个词?

京东的分词还是非常牛的,支持汉语拼音分词、简拼分词、英语分词、数词分词,太厉害了。

比如我这样搜索:
京东搜索框的汉语分词技术太牛了!!!---------js的番外拓展 (二)_第1张图片
当搜索一个名词时,下面的提示框会提示相关的不同名词。

但是当我输入拼音的时候,看清楚了:

京东搜索框的汉语分词技术太牛了!!!---------js的番外拓展 (二)_第2张图片
它自己给拼音进行了解析,提示框也给出了相关的提示,是不是很神奇呢,太牛了吧。那这背后到底是怎么样的算法实现呢?

我忍不住去翻阅了相关资料和问了度娘,这篇博客带你们见识一下这个神奇的算法吧。


在中文自然语言处理中,词是最小的能够独立活动的有意义的语言成分。汉语是以字为基本书写单位,词语之间没有明显的区分标记,因此进行中文自然语言处理通常是先将汉语文本中的字符串切分成合理的词语序列,然后再在此基础上进行其它分析处理。中文分词是中文信息处理的一个基础环节,已被广泛应用于中文文本处理、信息提取、文本挖掘等应用中。分词涉及许多方面的问题,主要包括:

一、分词涉及的主要问题 ?

1. 核心词表问题

        许多分词算法都需要有一个核心的(通用、与领域无关的)词表。凡在该词表中的词,分词时就应该切分出来。但对于哪些词应当收进核心词表,目前尚无一个标准;

2.词的变形问题

        汉语中的动词和形容词有些可以产生变形结构,如“打牌”、“开心”、“看见”、“相信”可能变形成“打打牌”、“开开心”、“看没看见”、“相不相信”等,它们可以被切出“打打/牌”,但“开开/心”就不合理;“看/没/看见”说得过去,“相/不/相信”就说不过去。又如大量的离合词如“打架”、“睡觉”等可以合理地变形为“打了一场架”、“睡了一大觉”。对这些变形结构的切分往往缺少可操作而又合理的规范;

3.词缀的问题

        如语素“者”在现代汉语中单用是没有意义的,因此“作者”、“成功者”、“开发者”内部不能切开。依据这个标准,如“作出了巨大个人财产和精神牺牲者”、“克服许多困难而最终获得成功者”、“开发中国第一个操作系统软件者”也不能切开,但这样复杂的结构与词的定义相矛盾。又如职务名称“教育局长”,语义上理解为“教育局之长”,但切成“教育/局长”、“教育局/长”、“教育/局/长”或不予切分,都会有人提出异议。

4.不同目标的应用

        比如以词为单位的键盘输入系统为了提高输入速度,一些互现频率高的相互邻接的几个字也常作为输入单位,如“这是”、“每一”、“并不”、“不多”、“不在”、“就是”、“也就”等;检索系统中,检索系统的词库注重术语和专名,且多数检索系统倾向于分词单位小型化,比如把“中国科学院”切成“中国/科学院”,使得无论用“中国科学院”还是用“科学院”检索,系统都能查到,提高查全率;在校对系统中往往将含有易错字的词和词组作为词单位,如许多人“作”、“做”分不清,计算机自动判别时,若把它们当作单字词也不好区分,但在同前后文构成的词或词组中往往可以有确定的选择,故应把有关的词和词组都收进词库,如“敢做”、“敢作敢为”、“叫做”、“做出”、“看作”、“做为”等,而校对系统要求分词单位较大,如把“勇斗”、“力擒”、“智取”等分别作为一个分词单位并划归及物动词参与上下文检查,“张老师”、“五分之三”、“北京中医学院”也应分别作为分词单位,并分别归类作为人、数字、机构名,再参与上下文检查。


二、基于词典和规则的汉字分词分类

1 基于词典和规则的汉字分词

1.1 最大匹配分词方法

        最大匹配分词方法又分正向最大匹配、反向最大匹配和双向最大匹配方法。正向最大匹配从左到右每次取最长词;反向最大匹配每次是从右到左取最长词;双向匹配则是进行正向、反向匹配,然后对于两种匹配结果不同的地方再利用一定的规则进行消歧。

最大匹配法可能无法处理部分覆盖歧义、交叉歧义。但这种方法实现简单且切分速度快。

1.2 全切分分词算法

        利用词典匹配,获得一个句子所有可能的切分结果。由于全切分的结果数随着句子长度的增加呈指数增长,因此这种方法的时空开销大;对于比较长且包含较多歧义的句子,往往要经过很长时间才能遍历完所有的切分路径。

1.3 基于理解的中文分词算法

        分词中歧义消除的过程是一个理解的过程,这不仅需要词法信息,还需要句法和语义信息。所以目前也有些研究者尝试模拟人的理解过程,在分词过程中加入句法和语义分析来处理歧义问题。由于汉语语言知识的复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。


## 2 基于大规模语料库的统计学习的分词方法         这类方法主要是利用从大规模语料库中通过统计得到的各种概率信息,来对中文字符串进行切分。这种方法往往不需人工维护规则,也不需复杂的语言学知识,且扩展性较好,是现今分词算法中较常用的做法。除最常见的词频统计信息以外,目前常用的模型有:

2.1 N元语法(N-gram)模型和隐马尔可夫模型(HMM)

在N元语法中,一个句子可以看成一个连续的字符串序列,它可以是单字序列,也可以是词序列。一个句子W1W2…Wk的出现概率用P(W)表示,则:
在这里插入图片描述

2.2 互信息模型

互信息用来表示两个字之间结合的强度,其公式为:

在这里插入图片描述

MI值越大,表示两个字之间的结合越紧密(如“尴尬”、“匍匐”等词)。反之,断开的可能性越大。当两个词x与y关系强时,MI(x , y )>= 0;x与y关系弱时,MI (x , y )≈0;而当MI(x , y )< 0时,x与y称为“互补分布”。

2.3 最大熵模型

在这里插入图片描述
        最大熵模型的作用是在已知条件下选择一个合适的分布来预测可能出现的事件,其主要思想是在只掌握关于未知分布的部分知识时,应选取符合这些知识但熵值最大的概率分布。式中,S在实验结束前是实验结果不确定性的度量,实验完成后是从实验中获得的信息量。S越大表明不确定性越大,实验结束后从中得到的信息量也越大。


3 规则和统计方法相结合的汉字分词方法

        现在多数分词算法都采用规则和统计相结合的方法,这样做既可降低统计对语料库的依赖性,充分利用已有的词法信息,同时又能弥补规则方法的不足。常用的结合方法是利用词典进行初切分,然后用其它的概率统计方法和简单规则消歧来进行未登录词识别。比如,ICTCLAS分词法利用词典匹配进行初切分得到一个切分词图,然后利用词频信息求词图N条最短路径的N-最短路径法。还有些研究者利用词典找出所有的交叉歧义,然后利用Bigram语言模型或其变形来消除歧义。

        以上内容引用北京理工大学大数据搜索与挖掘实验室张华平主任著作《大数据搜索与挖掘》一书,大家如果感兴趣可以查找阅读一下,或受益匪浅。同时张华平主任的研究成果NLPIR大数据语义智能系统,大家也可以了解一下,NLPIR大数据语义智能分析平台是根据中文数据挖掘的综合需求,融合了网络精准采集、自然语言理解、文本挖掘和语义搜索的研究成果,并针对互联网内容处理的全技术链条的共享开发平台。


三、常用中文分词包

  1. 庖丁解牛分词包,适用于与Lucene整合。http://www.oschina.net/p/paoding

            庖丁中文分词库是一个使用Java开发的,可结合到Lucene应用中的,为互联网、企业内部网使用的中文搜索引擎分词组件。

             Paoding填补了国内中文分词方面开源组件的空白,致力于此并希翼成为互联网网站首选的中文分词开源组件。 Paoding中文分词追求分词的高效率和用户良好体验。

    Paoding’s Knives 中文分词具有极 高效率 和 高扩展性 。引入隐喻,采用完全的面向对象设计,构思先进。

    高效率:在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字。

    采用基于 不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。

    能够对未知的词汇进行合理解析

  2. LingPipe,开源自然语言处理的Java开源工具包。http:/alias-i.com/lingpipe/

    功能非常强大,最重要的是文档超级详细,每个模型甚至连参考论文都列出来了,不仅使用方便,也非常适合模型的学习。

            主题分类(Top Classification)、命名实体识别(Named Entity Recognition)、词性标注(Part-of Speech Tagging)、句题检测(Sentence Detection)、查询拼写检查(Query Spell Checking)、兴趣短语检测(Interseting Phrase Detection)、聚类(Clustering)、字符语言建模(Character Language Modeling)、医学文献下载/解析/索引(MEDLINE Download, Parsing and Indexing)、数据库文本挖掘(Database Text Mining)、中文分词(Chinese Word Segmentation)、情感分析(Sentiment Analysis)、语言辨别(Language Identification)等

  3. JE分词包

  4. LibMMSeg http://www.oschina.net/p/libmmseg

    采用C++开发,同时支持Linux平台和Windows平台,切分速度大约在300K/s(PM-1.2G),截至当前版本(0.7.1)。

    LibMMSeg没有为速度仔细优化过,进一步的提升切分速度应仍有空间。

  5. IKAnalyzer http://www.oschina.net/p/ikanalyzer

    IKAnalyzer基于lucene2.0版本API开发,实现了以词典分词为基础的正反向全切分算法,是LuceneAnalyzer接口的实现。

             该算法适合与互联网用户的搜索习惯和企业知识库检索,用户可以用句子中涵盖的中文词汇搜索,如用"人民"搜索含"人民币"的文章,这是大部分用户的搜索思维;

    不适合用于知识挖掘和网络爬虫技术,全切分法容易造成知识歧义,因为在语义学上"人民"和"人民币"是完全搭不上关系的。

  6. PHPCWS http://www.oschina.net/p/phpcws

    PHPCWS 是一款开源的PHP中文分词扩展,目前仅支持Linux/Unix系统。

             PHPCWS 先使用“ICTCLAS 3.0 共享版中文分词算法”的API进行初次分词处理,再使用自行编写的“逆向最大匹配算法”对分词和进行词语合并处理,并增加标点符号过滤功能,得出分词结果。

             ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System)是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度 98.45%,各种词典数据压缩后不到3M。ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan 组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

             ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人对ICTCLAS分词后的结果,再采用逆向最大匹配算法,根据自己补充的一个9万条词语的自定义词库(与ICTCLAS词库中的词语不重复),对ICTCLAS分词结果进行合并处理,输出最终分词结果。

         由于 ICTCLAS 3.0 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用PHP的iconv函数转换成GBK编码,再用phpcws_split函数进行分词处理,最后转换回UTF-8编码。

7、KTDictSeg 一个C#.net做的简单快速准确的开源中文分词组件(这个分词算法效果也不错)


总结

JS的垃圾回收机制-----------------------------js的番外拓展 (一)

https://blog.csdn.net/weixin_44070254/article/details/116245572?spm=1001.2014.3001.5501

你可能感兴趣的:(拓展,小结,个人心得,算法,大数据)