A. python中文分词的原理你知道吗
中文分词,即 Chinese Word Segmentation,即将一个汉字序列进行切分,得到一个个单独的词。表面上看,分词其实就是那么回事,但分词效果好不好对信息检索、实验结果还是有很大影响的,同时分词的背后其实是涉及各种各样的算法的。
中文分词与英文分词有很大的不同,对英文而言,一个单词就是一个词,而汉语是以字为基本的书写单位,词语之间没有明显的区分标记,需要人为切分。根据其特点,可以把分词算法分为四大类:
基于规则的分词方法
基于统计的分词方法
基于语义的分词方法
基于理解的分词方法
下面我们对这几种方法分别进行总结。
基于规则的分词方法
这种方法又叫作机械分词方法、基于字典的分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行匹配。若在词典中找到某个字符串,则匹配成功。该方法有三个要素,即分词词典、文本扫描顺序和匹配原则。文本的扫描顺序有正向扫描、逆向扫描和双向扫描。匹配原则主要有最大匹配、最小匹配、逐词匹配和最佳匹配。
最大匹配法(MM)。基本思想是:假设自动分词词典中的最长词条所含汉字的个数为 i,则取被处理材料当前字符串序列中的前 i 个字符作为匹配字段,查找分词词典,若词典中有这样一个 i 字词,则匹配成功,匹配字段作为一个词被切分出来;若词典中找不到这样的一个 i 字词,则匹配失败,匹配字段去掉最后一个汉字,剩下的字符作为新的匹配字段,再进行匹配,如此进行下去,直到匹配成功为止。统计结果表明,该方法的错误率 为 1/169。
逆向最大匹配法(RMM)。该方法的分词过程与 MM 法相同,不同的是从句子(或文章)末尾开始处理,每次匹配不成功时去掉的是前面的一个汉字。统计结果表明,该方法的错误率为 1/245。
逐词遍历法。把词典中的词按照由长到短递减的顺序逐字搜索整个待处理的材料,一直到把全部的词切分出来为止。不论分词词典多大,被处理的材料多么小,都得把这个分词词典匹配一遍。
设立切分标志法。切分标志有自然和非自然之分。自然切分标志是指文章中出现的非文字符号,如标点符号等;非自然标志是利用词缀和不构成词的词(包 括单音词、复音节词以及象声词等)。设立切分标志法首先收集众多的切分标志,分词时先找出切分标志,把句子切分为一些较短的字段,再用 MM、RMM 或其它的方法进行细加工。这种方法并非真正意义上的分词方法,只是自动分词的一种前处理方式而已,它要额外消耗时间扫描切分标志,增加存储空间存放那些非 自然切分标志。
最佳匹配法(OM)。此法分为正向的最佳匹配法和逆向的最佳匹配法,其出发点是:在词典中按词频的大小顺序排列词条,以求缩短对分词词典的检索时 间,达到最佳效果,从而降低分词的时间复杂度,加快分词速度。实质上,这种方法也不是一种纯粹意义上的分词方法,它只是一种对分词词典的组织方式。OM 法的分词词典每条词的前面必须有指明长度的数据项,所以其空间复杂度有所增加,对提高分词精度没有影响,分词处理的时间复杂度有所降低。
此种方法优点是简单,易于实现。但缺点有很多:匹配速度慢;存在交集型和组合型歧义切分问题;词本身没有一个标准的定义,没有统一标准的词集;不同词典产生的歧义也不同;缺乏自学习的智能性。
基于统计的分词方法
该方法的主要思想:词是稳定的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻出现的概率或频率能较好地反映成词的可信度。可以对训练文本中相邻出现的各个字的组合的频度进行统计,计算它们之间的互现信息。互现信息体现了汉字之间结合关系的紧密程度。当紧密程 度高于某一个阈值时,便可以认为此字组可能构成了一个词。该方法又称为无字典分词。
该方法所应用的主要的统计模型有:N 元文法模型(N-gram)、隐马尔可夫模型(Hiden Markov Model,HMM)、最大熵模型(ME)、条件随机场模型(Conditional Random Fields,CRF)等。
在实际应用中此类分词算法一般是将其与基于词典的分词方法结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
基于语义的分词方法
语义分词法引入了语义分析,对自然语言自身的语言信息进行更多的处理,如扩充转移网络法、知识分词语义分析法、邻接约束法、综合匹配法、后缀分词法、特征词库法、矩阵约束法、语法分析法等。
扩充转移网络法
该方法以有限状态机概念为基础。有限状态机只能识别正则语言,对有限状态机作的第一次扩充使其具有递归能力,形成递归转移网络 (RTN)。在RTN 中,弧线上的标志不仅可以是终极符(语言中的单词)或非终极符(词类),还可以调用另外的子网络名字分非终极符(如字或字串的成词条件)。这样,计算机在 运行某个子网络时,就可以调用另外的子网络,还可以递归调用。词法扩充转移网络的使用, 使分词处理和语言理解的句法处理阶段交互成为可能,并且有效地解决了汉语分词的歧义。
矩阵约束法
其基本思想是:先建立一个语法约束矩阵和一个语义约束矩阵, 其中元素分别表明具有某词性的词和具有另一词性的词相邻是否符合语法规则, 属于某语义类的词和属于另一词义类的词相邻是否符合逻辑,机器在切分时以之约束分词结果。
基于理解的分词方法
基于理解的分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。目前基于理解的分词方法主要有专家系统分词法和神经网络分词法等。
专家系统分词法
从专家系统角度把分词的知识(包括常识性分词知识与消除歧义切分的启发性知识即歧义切分规则)从实现分词过程的推理机中独立出来,使知识库的维护与推理机的实现互不干扰,从而使知识库易于维护和管理。它还具有发现交集歧义字段和多义组合歧义字段的能力和一定的自学习功能。
神经网络分词法
该方法是模拟人脑并行,分布处理和建立数值计算模型工作的。它将分词知识所分散隐式的方法存入神经网络内部,通过自学习和训练修改内部权值,以达到正确的分词结果,最后给出神经网络自动分词结果,如使用 LSTM、GRU 等神经网络模型等。
神经网络专家系统集成式分词法
该方法首先启动神经网络进行分词,当神经网络对新出现的词不能给出准确切分时,激活专家系统进行分析判断,依据知识库进行推理,得出初步分析,并启动学习机制对神经网络进行训练。该方法可以较充分发挥神经网络与专家系统二者优势,进一步提高分词效率。
以上便是对分词算法的基本介绍。
B. 关键字分词技术是怎么回事呢
何为分词?中文分词与其他的分词又有什么不同呢?分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在上面的例子中我们就可以看出,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段可以通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,但是在词这一层上,上面的例子中我们也可以看出,中文比之英文要复杂的多、困难的多。
目前主流的中文分词算法有以下3种:
1、 基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹 配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为 1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还 需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分 为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反 过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
2、 基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织 成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3、 基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统 计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这 一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
分词几点要注意:
1.分词算法的时间性能要比较高。尤其是现在的web搜索,实时性要求很高。所以作为中文信息处理基础的分词首先必须占用尽可能少的时间。
2.分词正确率的提高并不一定带来检索性能的提高。分词到达一定精度之后,对中文信息检索的影响不再会很明显,虽然仍然还是有一些影响,但是这已经不是CIR的性能瓶颈。所以片面的一味追求高准确率的分词算法并不是很适合大规模中文信息检索。在时间和精度之间存在矛盾无法兼顾的情况下,我们需要在二者之间找到一个合适的平衡点。
3.切分的颗粒度仍然可以依照长词优先准则,但是需要在查询扩展层面进行相关后续处理。在信息检索中,分词算法只需要集中精力考虑如何消除交叉歧义。对于覆盖歧义,我们可以利用词典的二次索引和查询扩展来解决。
4.未登录词识别的准确率要比召回率更加重要。要尽量保证未登录词识别时不进行错误结合,避免因此切分出错误的未登录词。如果将单字错误的结合成未登录词了,则有可能导致无法正确检索到相应的文档。
网络的分词
首先根据分割符号将查询分开。“信息检索 理论 工具” 分词后 <信息检索,理论,工具>。
然后看看是否有重复的字符串,如果有,就抛弃多余的,只保留一个。“理论 工具理论”分词后<工具理论>,GOOGLE不考虑这个并归计算。
接着判断是否有英文或者数字,如果有的话,把英文或者数字当作一个整体保留并把前后的中文切开。查询”电影BT下载”分词后<电影,BT,下载>。
如果字符串只包含小于等于3个中文字符的话,那就保留不动,当字符串长度大于4个中文字符的时候,网络的分词程序才出马大干快上,把这个字符串肢解掉。
分词算法类型正向最大匹配,反向最大匹配,双向最大匹配,语言模型方法,最短路径算法判断一个分词系统好不好,关键看两点,一个是消除歧义能力;一个是词典未登录词的识别比如人名,地名,机构名等。
网络分词采取了至少两个词典,一个是普通词典,一个是专用词典(人名、地名、新词等)。而且是专用词典先切分,然后将剩余的片断交由普通词典来切分。
网络用分词算法类型采用的是双向最大匹配算法。
C. 加分求搜索引擎的工作机制
搜索引擎是一种依靠技术取胜的产品,搜索引擎的各个组成部分,包括页面搜集器、索引器、检索器等,都是搜索引擎产品提供商进行比拼的着力点。
近几年,搜索引擎的商业化取得了巨大的成功,如着名搜索引擎公司Google、Yahoo(本文中提到Yahoo时,特指英文Yahoo)、网络等纷纷成功上市,引发了众多公司涉足于该领域,带动了人力、资本的大量投入,连软件巨人Microsoft公司也禁不住诱惑积极打造自己的搜索引擎。但是,从性能上来说,目前的搜索引擎还不尽如人意,搜索返回的结果往往与用户的检索要求相去甚远,有效性还不是很高。本文将对搜索引擎的工作原理及其实现技术进行分析,从中可以了解限制搜索引擎用户体验改善的因素到底有哪些。
——————————————————————————
[相关链接]
搜索引擎的技术流派
搜索引擎的技术流派可以分为三类:第一类是利用计算机程序自动进行信息处理的自动化派,其典型代表是Google以及Ghunt等;第二类是以人工进行信息分类处理为主的人力加工派,这方面的典型代表是早期的Yahoo,正在兴起的Web2.0、网摘等社区化搜索是这一流派的新发展;第三类是强调智能化人机交互、协同的融合派,目前英文Yahoo的搜索引擎在发展这方面的技术,MSNLive也显示出其更加重视融合性的技术,联索IFACE专业搜索融入了用户知识和机器学习方法,可以看做是融合派在中文搜索引擎方面的典型代表。
如果按照网页库的容量、相关度计算技术、用户搜索体验以及商业模式等方面来划分,到目前为止,搜索引擎的发展大约经历了两代。第一代搜索引擎(1994年~1997年)的索引网页量一般都在数百万量级左右,采用全文检索技术和分布式并行运算技术,但极少重新搜集网页并去刷新索引,而且其检索速度较慢,一般都要等待10秒甚至更长的时间,同时承受的检索请求也受到很大限制,商业模式处于探索期并且尚未成型。
第二代搜索引擎(1998年至今)大多采用分布式协同处理方案,其网页索引库一般都在数千万个网页量级甚至更多,采用可伸缩的索引库架构,每天能够响应数千万次甚至数以亿计的用户检索请求。1997年11月,当时最先进的几个搜索引擎宣称能建立1亿数量级的网页索引。以Google为代表的第二代搜索引擎通过链接分析和点击分析(网页流行度)方法来计算(网页权威性)相关度取得了巨大的成功。另外,以自然语言进行问题解答的搜索引擎在某种程度上改善了用户体验,更重要的是第二代搜索引擎奠定了目前搜索引擎普遍采用的成熟商业模式,如Google、Overture、网络等收费搜索服务均受益于此商业模式。
相关名词解释
全文搜索引擎是由一个称为蜘蛛(Spider)的机器人程序以某种策略自动地在互联网中搜集和发现信息,由索引器为搜集到的信息建立网页索引数据库,由检索器根据用户输入的查询条件检索索引库,并将查询结果返回给用户。服务方式是面向网页的全文检索服务。
目录索引搜索引擎主要以人工方式搜集信息,由编辑人员查看信息之后,人工形成信息摘要,并将信息置于事先确定的分类框架中。信息大多面向网站,提供目录浏览服务和直接检索服务。用户完全可以不用关键词(Keywords)进行查询,仅靠分类目录也可找到需要的信息。
元搜索引擎是指在统一的用户查询界面与信息反馈的形式下,共享多个搜索引擎的资源库为用户提供信息服务的系统。元搜索引擎是借助于其他搜索引擎进行工作,没有自己的索引库,它是将用户的查询请求同时向多个搜索引擎递交,将返回的结果进行重复排除、重新排序等处理后,作为自己的结果返回给用户。
自动分类技术是计算机根据分类标准自动将文档归类到已经存在的类别体系(或者主题)下的某一个具体类别中。目前自动分类并不能完全代替人工所做的相关工作,只是提供了一个花费较少的可选择方法。
文本聚类技术是利用计算机将已经存在的大量文本(很多文档)进行分组的全自动处理过程。聚类可以提供对一个大的文本集内容的概况了解,可以识别隐藏的共同点,可以便捷地浏览相近或相关的文本。
网文摘录又称网摘,它具有对内容页的收藏、分类、摘录、加注标签、保存到信息库、信息库共享等功能,主要是为了满足用户阅读网络内容和信息知识积累的需要。
D. 请问什么是自然语言处理中的中文分词技术
众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。
现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
1、基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
2、基于理解的分词方法
这种分词方法是通过让计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
3、基于统计的分词方法
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。笔者了解,海量科技的分词算法就采用“复方分词法”,所谓复方,相当于用中药中的复方概念,即用不同的药才综合起来去医治疾病,同样,对于中文词的识别,需要多种算法来处理不同的问题。
E. 分词算法是什么
分词算法是文本挖掘的基础,通常对整个模型的效果起着较大的决定作用。
分词算法常用的两种运行方式:
1、用户搜索及匹配。
例如:我们在网络搜索一个词 “手机回收”,那么网络会先把这个词分为手机和回收两个词这个时候呢网络会先在库中搜索手机这个词然后进行第一轮的筛选。把网页当中没有手机这个词的去除,只保留带有手机这个词的结果,之后再从已筛选出来的网页中,筛选出带有回收这个词的页面。然后在所得结果里面根据页面评分给用户进行排序。
2、网页主题计算
前面启蒙博客也讲过,网络蜘蛛只是一个机器,并不能向人一样去思考,而在处理文章的时候,网络蜘蛛则会把文章也进行分词去处理,如过文章里 手机 这个词出现频率比较多,也就是所说的关键词密度,那么这个页面也就会定性为手机方面的文章。
搜索引擎是通过分词算法来计算网页的,如果我们能够合理地利用分词算法进行网页布局,会让网页将会有一个很好的得分。
中文分词算法大概分为三大类:
第一类是基于字符串匹配,即扫描字符串,如果发现字符串的子串和词典中的词相同,就算匹配,比如机械分词方法。这类分词通常会加入一些启发式规则,比如“正向/反向最大匹配”,“长词优先”等。
第二类是基于统计以及机器学习的分词方法,它们基于人工标注的词性和统计特征,对中文进行建模,即根据观测到的数据(标注好的语料)对模型参数进行训练,在分词阶段再通过模型计算各种分词出现的概率,将概率最大的分词结果作为最终结果。
常见的序列标注模型有HMM和CRF。这类分词算法能很好处理歧义和未登录词问题,效果比前一类效果好,但是需要大量的人工标注数据,以及较慢的分词速度。
第三类是通过让计算机模拟人对句子的理解,达到识别词的效果,由于汉语语义的复杂性,难以将各种语言信息组织成机器能够识别的形式,目前这种分词系统还处于试验阶段。
F. 如何对excel表格里的词结巴分词python
#-*-coding:utf-8-*-
importjieba
'''''
Createdon2015-11-23
'''
defword_split(text):
"""
Splitatextinwords.
(word,location).
"""
word_list=[]
windex=0
word_primitive=jieba.cut(text,cut_all=True)
forwordinword_primitive:
iflen(word)>0:
word_list.append((windex,word))
windex+=1
returnword_list
definverted_index(text):
"""
CreateanInverted-.
{word:[locations]}
"""
inverted={}
forindex,wordinword_split(text):
locations=inverted.setdefault(word,[])
locations.append(index)
returninverted
definverted_index_add(inverted,doc_id,doc_index):
"""
AddInvertd-Indexdoc_indexofthedocumentdoc_idtothe
Multi-DocumentInverted-Index(inverted),
usingdoc_idasdocumentidentifier.
{word:{doc_id:[locations]}}
"""
forword,locationsindoc_index.iteritems():
indices=inverted.setdefault(word,{})
indices[doc_id]=locations
returninverted
defsearch_a_word(inverted,word):
"""
searchoneword
"""
word=word.decode('utf-8')
ifwordnotininverted:
returnNone
else:
word_index=inverted[word]
returnword_index
defsearch_words(inverted,wordList):
"""
searchmorethanoneword
"""
wordDic=[]
docRight=[]
forwordinwordList:
ifisinstance(word,str):
word=word.decode('utf-8')
ifwordnotininverted:
returnNone
else:
element=inverted[word].keys()
element.sort()
wordDic.append(element)
numbers=len(wordDic)
inerIndex=[0foriinrange(numbers)]
docIndex=[wordDic[i][0]foriinrange(numbers)]
flag=True
whileflag:
ifmin(docIndex)==max(docIndex):
docRight.append(min(docIndex))
inerIndex=[inerIndex[i]+1foriinrange(numbers)]
foriinrange(numbers):
ifinerIndex[i]>=len(wordDic[i]):
flag=False
returndocRight
docIndex=[wordDic[i][inerIndex[i]]foriinrange(numbers)]
else:
minIndex=min(docIndex)
minPosition=docIndex.index(minIndex)
inerIndex[minPosition]+=1
ifinerIndex[minPosition]>=len(wordDic[minPosition]):
flag=False
returndocRight
docIndex=[wordDic[i][inerIndex[i]]foriinrange(numbers)]
defsearch_phrase(inverted,phrase):
"""
searchphrase
"""
docRight={}
temp=word_split(phrase)
wordList=[temp[i][1]foriinrange(len(temp))]
docPossible=search_words(inverted,wordList)
fordocindocPossible:
wordIndex=[]
indexRight=[]
forwordinwordList:
wordIndex.append(inverted[word][doc])
numbers=len(wordList)
inerIndex=[0foriinrange(numbers)]
words=[wordIndex[i][0]foriinrange(numbers)]
flag=True
whileflag:
ifwords[-1]-words[0]==numbers-1:
indexRight.append(words[0])
inerIndex=[inerIndex[i]+1foriinrange(numbers)]
foriinrange(numbers):
ifinerIndex[i]>=len(wordIndex[i]):
flag=False
docRight[doc]=indexRight
break
ifflag:
words=[wordIndex[i][inerIndex[i]]foriinrange(numbers)]
else:
minIndex=min(words)
minPosition=words.index(minIndex)
inerIndex[minPosition]+=1
ifinerIndex[minPosition]>=len(wordIndex[minPosition]):
flag=False
break
ifflag:
words=[wordIndex[i][inerIndex[i]]foriinrange(numbers)]
returndocRight
if__name__=='__main__':
doc1="""
中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范
重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文
只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样
存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。
"""
doc2="""
存在中文分词技术,是由于中文在基本文法上有其特殊性,具体表现在:
与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,
词语之间没有分隔。古代汉语中除了连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词
书写的必要。而现代汉语中双字或多字词居多,一个字不再等同于一个词。
在中文里,“词”和“词组”边界模糊
现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和
短语的边界很难去区分。
例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,
同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现
混乱,难度很大。
中文分词的方法其实不局限于中文应用,也被应用到英文处理,如手写识别,单词之间的空格就不很清楚,
中文分词方法可以帮助判别英文单词的边界。
"""
doc3="""
作用
中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。
中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,
但如何让计算机也能理解?其处理过程就是分词算法。
影响
中文分词对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,
没有人能看得完,最重要的是把最相关的结果排在最前面,这也称为相关度排序。中文分词的准确与否,常常直接
影响到对搜索结果的相关度排序。从定性分析来说,搜索引擎的分词算法不同,词库的不同都会影响页面的返回结果
"""
doc4="""
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,
若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向
匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种
机械分词方法如下:
正向最大匹配法(由左到右的方向);
逆向最大匹配法(由右到左的方向);
最少切分(使每一句中切出的词数最小);
双向最大匹配法(进行由左到右、由右到左两次扫描)
还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。
由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于
正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为,单纯使用逆向
最大匹配的错误率为。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词
作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。
一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征
的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法
是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词
结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
"""
doc5="""
从形式上看,词是稳定的字的组合,因此在上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。
因此字与字相邻共现的频率或概率能够较好的反映成词的可信度。可以对语料中相邻共现的各个字的组合的频度
进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字的相邻共现概率。互现信息体现了
汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法
只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法
也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、
“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本
的分词词典(常用词词典)进行串匹配分词,同时使用统计方法识别一些新的词,即将串频统计和串匹配结合起来,
既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动消除歧义的优点。
另外一类是基于统计机器学习的方法。首先给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律
(称为训练),从而实现对未知文本的切分。我们知道,汉语中各个字单独作词语的能力是不同的,此外有的字常
常作为前缀出现,有的字却常常作为后缀(“者”“性”),结合两个字相临时是否成词的信息,这样就得到了许多
与分词有关的知识。这种方法就是充分利用汉语组词的规律来分词。这种方法的最大缺点是需要有大量预先分好词
的语料作支撑,而且训练过程中时空开销极大。
到底哪种分词算法的准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法
来实现,都需要综合不同的算法。例如,海量科技的分词算法就采用“复方分词法”,所谓复方,就是像中西医结合
般综合运用机械方法和知识方法。对于成熟的中文分词系统,需要多种算法综合处理问题。
"""
#BuildInverted-Indexfordocuments
inverted={}
documents={'doc1':doc1,'doc2':doc2,'doc3':doc3,'doc4':doc4,'doc5':doc5}
fordoc_id,textindocuments.iteritems():
doc_index=inverted_index(text)
inverted_index_add(inverted,doc_id,doc_index)
#Searchoneword
aWord="分词"
result_a_word=search_a_word(inverted,aWord)
ifresult_a_word:
result_a_word_docs=result_a_word.keys()
print"'%s'isappearedat"%(aWord)
forresult_a_word_docinresult_a_word_docs:
result_a_word_index=result_a_word[result_a_word_doc]
forindexinresult_a_word_index:
print(str(index)+''),
print"of"+result_a_word_doc
print""
else:
print"Nomatches! "
#Searchmorethanoneword
words=["汉语","切分"]
result_words=search_words(inverted,words)
ifresult_words:
print("["),
foriinrange(len(words)):
print("%s"%(words[i])),
print("]areappearedatthe"),
forresult_words_docinresult_words:
print(result_words_doc+''),
print" "
else:
print"Nomatches! "
#Searchphrase
phrase="中文分词"
result_phrase=search_phrase(inverted,phrase)
ifresult_phrase:
result_phrase_docs=result_phrase.keys()
print"'%s'isappearedatthe"%(phrase)
forresult_phrase_docinresult_phrase_docs:
result_phrase_index=result_phrase[result_phrase_doc]
forindexinresult_phrase_index:
print(str(index)+''),
print"of"+result_phrase_doc
print""
else:
print"Nomatches! "
G. 谁会用ICTCLAS这个分词程序
ICTCLAS分词系统是个NB的系统,这几天找到了仔细试了试,效率奇高,比自己搞字典,分词算法效率不知高了很多倍,用起来也是非常简单的,BOSS需要导出自定义词库,然后用文章训练词库,不管了,反正可以使用了。DT地用hash做了两个星期,进度很慢,分析一本《天龙八部》,统计出现的词语频率(词语只是仅仅基于频率,在并没有字典的情况下无法实现智能分词!)大概要花费十几分钟,可见效率底下,而且内存200M左右。使用ICTCLAS分词系统可以高效地实现分词。下面把过程贴出来。
使用方法,首先到网上下载ICTCLAS,因为我是windows下的C++实现, 下载ICTCLAS2011_Windows_32_c,解压,里面有很好的Demo,Doc, API目录下的所有文件(夹)到你所在的工程,在你的源文件加上
#include "ICTCLAS50.h"
#pragma comment(lib, "ICTCLAS50.lib") //ICTCLAS50.lib库加入到工程中
//
//your code here,可参考Demo里面的代码
//
即可。
大概的函数C++函数接口都在Doc文件下的文档中:
bool ICTCLAS_Init(const char* pszInitDir=NULL);初始化函数
返回值
如果初始化成功返回true, 否则返回false. 如初始化不成功,请查看ictclas.log文件了解详细错误原因.
参数
pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic). 如果这些文件及目录在系统运行当前目录下,此参数可以为null。
bool ICTCLAS_Exit( );退出,释放内存
返回值
成功返回true;否则返回false。
unsigned int ICTCLAS_ImportUserDict(const char *sFilename,eCodeType eCT)
//导入用户自定义词典
返回值
导入成功的词的个数
参数
sFilename: 用户定义词典文件
eCT:编码格式
int ICTCLAS_ParagraphProcess(const char *sParagraph,int nPaLen,eCodeType eCt,int bPOStagged,char* sResult);//对一段文字进行分词
返回值
返回结果缓冲区的指针(sResult)以及结果的长度R
参数
sParagraph: 原始文字段
nPaLen: 文字段的长度
eCodeType: 文字段的编码格式
bPOStagged: 需不需要根据标注集做标记 0 = 做标记 ; 1 = 不标记; 默认为1.
sResult: 输出结果
t_pstRstVec ICTCLAS_ParagraphProcessA(const char *sParagraph,int PaLen,eCodeType eCodeType,int bPOStagged,int &nRstCnt);
//处理文字段
返回值
结果vector的指针,系统调用,用户无法分配以及释放
struct stResult{
int start; //start position
int length; //length
#ifdef POS_TAGGER
int iPOS; //POS
char sPOS[POS_SIZE];//word type
#endif
int word_ID; //word_ID
int word_type; //Is the word of the user's dictionary?(0-no,1-yes)
int weight;// word weight
};
参数
sParagraph: 原始文字段
nPaLen: 文字段长度
eCodeType: 编码格式
bPOStagged:
需不需要根据标注集做标记 0 = 做标记 ; 1 = 不标记; 默认为1.
nRstcnt: 处理结果的长度值。
详细用法参见Doc文件。
bool ICTCLAS_FileProcess(const char *sSrcFilename,eCodeType eCt,const char *sDsnFilename,int bPOStagged);//处理txt文件
返回值
处理文本文件成功返回true, 否则返回false
参数
sSourceFilename: 原始处理文件
eCodeType: 原始文件编码格式
sDsnFilename: 存储结果的文件名T
bPOStagged: 需不需要根据标注集做标记 0 = 做标记 ; 1 = 不标记; 默认为1.
注意事项
调用此函数之前需要调用init函数成功,输出格式可以通过ICTCLAS 配置来更改,这个需要研究下配置文件。
int ICTCLAS_SetPOSmap(int nPOSmap);//设置标注集
返回值
成功为1,其他为0
参数
nPOSmap :
ICT_POS_MAP_FIRST 计算所一级标注集
ICT_POS_MAP_SECOND 计算所二级标注集 PKU_POS_MAP_SECOND 北大二级标注集 PKU_POS_MAP_FIRST 北大一级标注集
int ICTCLAS_GetWordId(const char *sWord,int nWrdLen,eCodeType eCT);
返回值
单词的ID(我觉得是词典里面的存储位置,不清楚词典的具体结构)
参数
sWord: 目标单词
nWrdLen: 单词长度
eCodeType: 编码格式
bool ICTCLAS_ResultFree ( t_pstRstVec pRetVec)
//释放调用ICTCLAS_ParagraphProcessAW得到的vector指针
返回值
成功为1,失败为0
参数
t_pstRstVec: ICTCLAS_ParagraphProcessAW得到的vector指针
总结:这些函数都很好用,我需要使用处理文件函数ICTCLAS_FileProcess我出现的问题是:单独调用这个函数没有问题,但是在MFC界面调用两个选择打开文件路径和保存结果文件路径的CFileDialog以后就会出现ICTCLAS_Init初始化失败!郁闷了半天,查看ICTCLAS.log文件,
Default Path : E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS
start lic check.
License succeed!Cannot open user dictionary
E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pdat.
Cannot open file E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.map.
Cannot open user dictionary E:\test_ICTCLAS\test_ICTCLAS\test_ICTCLAS\Data\UserDict.pos.
Load dictionary down!
并没有异常,加载失败是因为并没有自定义词典。
仔细排查,发现bool ICTCLAS_Init(const char* pszInitDir=NULL)有一个默认的工作路径,在没有打开CFileDialog的时候默认的路径是exe文件执行路径,但是打开以后若不进行设置,会改变工作路径!这就是为什么点击CFileDialog路径更改,找不到路径下的文件,当然无法初始化了!( pszInitDir:初始化路径,应包含配置文件(Configure.xml)和词典目录(Data目录)以及授权文件(user.lic). 如果这些文件及目录在系统运行当前目录下,此参数可以为null)
解决方案:
方案1. 在每次调用CFileDialog打开文件后重新设置工作路径
方案2. 在程序中使用绝对路径
方案3. CFileDialog的构造函数有8个参数,平时为了省事一般只是指定第一个。其实解决这个问题,只要在第四个参数dwFlags中加上OFN_NOCHANGEDIR即可
H. 什么是百度分词百度分词技术又是什么
首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向匹配分词策略。
如果两者切分结果相同,说明没有歧义,直接输出分词结果
如果不一致,则输出最短路径的那个结果
如果长度相同。则选择单字词少的那一组切分结果。如果单字也相同,则选择正向分词结果。
如果说网络有优势的话,唯一的优势就是那个很大的专用词典。
这个专用词典登录了人名(比如大长今)。称谓(比如老太太)。部分地名(比如阿联酋等)。
从语料库里面不断识别出词典未登录词。逐渐扩充这个专门词典。Spelling Checker(网络词典)拼写检查错误提示(以及拼音提示功能),拼写检查错误提示是搜索引擎都具备的一个功能。也就是说用户提交查询给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误。
对于中文用户来说一般造成的错误是输入法造成的错误。
那么我们就来分析看看网络是怎么实现这一功能的。
我们分析拼写检查系统关注以下几个问题:
(1)系统如何判断用户的输入是有可能发生错误的查询?
那么网络有又是如何做到这些的?网络判断用户输入是否错误的标准,
我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入。此时启动错误提示功能,这个很好判断,
因为如果是一个正常词汇的话,网络一般不会有错误提示。而你故意输入一个词典不可能包含的所谓词汇
此时网络一般会提示你正确的检索词汇。
网络又是怎么提示正确词汇的呢?
很明显是通过拼音的方式,在网络输入查询“紫材”。
网络提供的提示词汇为: “紫菜”,
是同音字。所以网络必然维持着一个同音词词典。里面保留着同音词信息
比如可能包含着下面这条词条: “ zi cai 紫材”,
另外还有一个标注拼音程序,
现在能够看到的基本流程是:用户输入“紫材”,查词典。发现没有这个词汇,启动标注拼音程序。将“紫材”标注为拼音“ cai”。然后查找同音词词典,发现同音词“紫菜”,那么提示用户可能的正确拼写。
但是还有一些遗留的小问题。比如是否将词表里面所有同音词都作为用户的提示信息?
比如某个拼音有10个同音词,是否都输出呢?
大家觉得网络会都输出吗?网络并没有将所有同音词都输出,而是选择一定筛选标准。选择其中几个输出,怎么证明这一点?
我们看看拼音“liu li”的同音词。搜狗拼音输入法提示同音词汇有“六里 刘历 琉璃 流利 刘丽”等N个。
这里是故意输入一个词典不包含的词汇,这样网络的拼写检查才开始工作。网络提示您要找的是不是: “流氓”。我们改换输入“遛邙”。
看网络的查询呈现,
就没有提示您要找的是不是“流氓”了。看看我两次输入的字有什么区别,这说明什么?
说明不是所有同音词都给提示,而是选择性的做呈现提示。那么选择的标准是什么?
大家再回头看看,第一次和第二次输入的“遛氓与遛邙”是有绝对的区别的。
第一次输入的“遛氓”的“氓”字是流氓的氓字,所以网络做了提示您要找的是不是“流氓”了。
去网络,就是有一点对的,一个字是对的,网络也会给你个流氓
另外一个小问题:同音词词典是否包含一字词? 包含2字词,3字词,那么是否包含4字词以及更长的词条?
这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?
反正只要是汉字就能在词表里面找到,所以没有判断依据。
二字词是包含的,上面有例子
三字词也包含吗?
下面我们查询 “中城药”网络错误提示:“中成药”
修改查询为“重城药”。
那么我们看看4字词汇网络怎么处理?网络是不是还是会给我们提示呢,
输入:静华烟云
输入 静话烟云
输入 京花阎晕
那么更长的词汇网络是否也提示?
我们现在输入: “落花世界有风军”, 这个查询是什么意思,估计读过古诗的都知道。看看网络的提示
这说明什么?
说明同音词词典包含不同长度的同音词信息。
另外也说明了网络的核心中文处理技术,也就是那个词典还真挺大的。
还有一个比较重要的问题。如果汉字是多音字那么怎么处理?网络比较偷懒。它根本就没有对多音字做处理。
我们来看看网络的一个标注拼音的错误。在看这个错误前先看看对于多音字网络是怎么提示错误的。
网络提示“局长”!!“俱长”的拼音有几种拼法,大家说说?两种“ju zhang / ju chang”
可见如果是多音字则几种情况都提示。
现在我们来看看错误的情况,我们输入查询“距长”,看看结果
网络提示为“局长”当然好解释,因为是同音字。
但是为什么会被提示“局长”呢?这说明网络的同音字词典有错误,
说明在“ju chang”这个词条里面包含“局长”这个错误的同音词。
让我们顺藤摸瓜。这个错误又说明什么问题呢?
说明网络的同音词典是自动生成的。而且没有人工校对。还说明在自动生成同音词典的过程中,网络不是根据对一篇文章标注拼音然后,在抽取词汇和对应的拼音信息获得的。而是完全按照某个词典的词条来标注音节的,以对于多音字造成的错误无法识别出来,
如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注。当然还有另外一种解释,就是“局长”是故意被网络提示出来可能的正确提示词汇。
因为考虑到南方人“zh”和 “ch”等前后鼻音分不清么。
我们继续测试到底是何种情况
是网络有错误还是这是网络的先进的算法?
我们输入查询“悬赏”,故意将之错误输入为“悬桑”。
没有错误提示。说明确实没有考虑这种情况,鼻音没有考虑。
根据以上推导, 我们可以得出如下结论:
网络是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典。
所以两个词典是同样大的而且这个词典也随着分词词典的增长而在不断增长。
至于标注过程中多音字网络没有考虑,如果是多音字就标注成多个发音组合,
通过这种方式形成同音词词典。这样的同音词词典显然包含着很多错误。
最后一个问题:网络对于英文进行拼写检查么?让我们试试看,输入查询“china”,
大家告诉我,什么情况
专注中文搜索的网络还能搜索到英文
真是意外的惊喜。变换一下查询“chini”。
那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索”rongji”,
最后让我们总结归纳一下网络的拼写检查系统:
就是网络的后台作业:
(1)前面我们说过,网络分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),
最后让我们总结归纳一下网络的拼写检查系统:
网络利用拼音标注程序依次扫描所有词典中的每个词条,
然后标注拼音,如果是多音字则把多个音都标上,比如”长大”,会被标注为”zhang da/chang da”两个词条.
(2)通过标注完的词条,建立同音词词典,比如上面的”长大”,会有两个词条: zhang daà长大chang daà长大。
(3)利用用户查询LOG频率信息给予每个中文词条一个权重;LOG大家知道是什么吗?函数
(4)同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;
拼写检查:
(1)用户输入查询,如果是多个子字符串,不作拼写检查;
(2)对于用户查询,先查分词词典,如果发现有这个单词词条,不作拼写检查;
(3)如果发现词典里面不包含用户查询,启动拼写检查系统:
首先利用拼音标注程序对用户输入进行拼音标注
(4)对于标注好的拼音在同音词词典里面扫描,
如果没有发现则不作任何提示;
(5)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;
拼音提示:
(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;
(2)如果发现有词条,则按照顺序输出权重比较大的几个提示结果。
对网络分词算法的进一步分析,上面说过,经过分析得出网络的分词系统采用双向最大匹配分词,
但是后来发现推理过程中存在一个漏洞,而且推导出来的网络分词算法步骤还是过于繁琐。所以进一步进行分析,看看是否前面的推导有错误。
那么以前的分析有什么漏洞呢?
我们推导网络分词有反向最大匹配的依据是网络将“北京华烟云”分词为“北/京华烟云”,从这里看好像采用了反向最大匹配。因为正向最大匹配的结果应该是“北京/华/烟云”,但是由此就推论说网络采用了双向最大匹配还是太仓促了。
前面我们也讲过,网络有两个词典,一个普通词典,一个专有词典。
而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分。
以上面的“北京华烟云”之所以被切分成“北/京华烟云”,
另外一个可能是“京华烟云”这个词汇是在专有词典里面存储的。
所以先分析,这样得出“京华烟云”剩下“北”,没什么好切分的,所以就呈现出来了。
这里只是假设,那么是否确实“京华烟云”在专有词典呢?
我们再看一个例子“山东北京华烟云”,
如果“京华烟云”在普通词典,如果是反向切分,那么结果应该是,如果是正向切分应该是,无论如何都分不出。这说明什么?说明“京华烟云”是在那个专有词典
所以先切分出“京华烟云”,然后剩下的“山东北”交由普通词典切分,明显是正向最大匹配的结果呈现。
当然按照我们在前面讲的算法推导“山东北”的切分也会得出的结论。
但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一个更加简洁的方法也能说得通,那当然选择简便的方法了。所以初步判断网络采取的是正向最大匹配。
我们继续测试采用何种分词算法,
为了减少专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇
我们查询“天才能量级”,看看
这里应该没有专有词典出现过的词汇,网络切分为天才 /能量/ 级
看来是正向最大匹配的结果。
另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?
这样首先就得保证词汇都出现在专有词典,这么保证这一点呢?我们构造查询“山东京城”,网络切分为“山东/京城”,说明“东京”是在普通词典的。构造查询“陈晓东京华烟云”,
通过前面分析可以看出两个词汇都在专有词典里面,网络切分为陈晓东 /京华烟云 ,
说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配。
那么使用反向最大匹配了吗?构造查询例子“陈晓东方不败”。
首先我们肯定“陈晓东”和“东方不败”都是在专有词典出现的,
如果是正向切分陈晓东 /方/ 不败
那么应该是或者如果是反向切分则是陈晓/东方不败
可以看出网络的切分是或者,说明采用的是正向最大匹配。
通过分析,网络的词典不包含“不败”这个单词。所以实际上网络的切分很明显这和我们以前推导的算法是有矛盾的,所以以前的分析算法确实有问题,所以结论是网络采取的是正向最大匹配算法
重新归纳一下网络的分词系统:首先用专有词典采用最大正向匹配分词,切分出部分结果,剩余没有切分交给普通词典,同样采取正向最大匹配分词,最后输出结果。
另外,GOOGLE也是采用正向最大匹配分词算法,
不过好像没有那个专用词典,所以很多专名都被切碎了
I. 什么是自动分词系统搜索引擎是如何实现的
紧接着上一讲,搜索引擎索引网页库建立之后,我们需要对索引网页库预处理,其中又分为两大类:网页分析和建立倒排文件索引。而搜索引擎的自动分词系统就是进行网页分析的前提。
首先,中文和英文不同的是,英文单词之间有空格,而中文都是连贯在一起来操作的,在形式上,无法做出区分。所以中文文本在进行网页分析之前,需要将文本切分为多个词或者字。在目前检索中,主要可以分为按字检索和按词检索,其中按词检索,拥有更快的速度和较高的准确性。
自动分词系统算法介绍
分词系统基本方法:基于字符串匹配的分词方法和基于统计的分词方法。
1)基于字符串匹配:也称为机械分词,按照几个既定的策略,将等待分析的字符串和一个容量足够大的词典中的词条进行匹配,若在词典中找到同样的一个字符串,那么匹配成功。
字符串匹配分词,按照扫描方向,可以分为:正向匹配和逆向匹配;按照不同长度有限匹配,可以分为:最大匹配和最小匹配;按照是否与词性标注相结合,可以分为:单纯分词方法和分词与标注相结合的一体化方法;
常用的机械分词方法:正向最大匹配,逆向最大匹配,最小切分(就是在每一句中切除的词量最少,而不是单个词字节最少) (盐城SEO联想:使用正向最大匹配,逆向最大匹配,和我们SEO中经常用到的关键词靠前,则排名越有利,是否存在关联)
同时,在机械分词法中,存在这样一个模型:ASM(d,a,m);
d:匹配方向,+表示正向,-表示逆向;
a:每次匹配失败后增加或减少字串长度(字符串),“+”就是增加一个,“-”就是减少一个;
m:最大或最小匹配标志,+为最大匹配,-为最小匹配。
对于,中文汉字来说,ASM(+,=,+)是最为实用的方法。
2)基于统计的分词方法介绍:
在表现形式上,词是多个字的稳定组合,所以说,在文章中,相邻的字同时出现的次数越多,那么越有可能是一个词,因此,字和字相邻出现的的频率可以大概的反应出词的可信率。
通过公式:M(x,y)=log( P(x,y) / p(x)p(y) )来计算他们的互现信息,该互现信息体现了汉字之间结合的紧密程度,当M(x,y)的值大于某一阈值时,便可以确定这是一个词。
因为,只需要对字组频率进行计算,不需要使用词典,所以叫做无词典分词方法,或者说统计分词方法。
缺点:经常会抽出一些高频,但不是词的常用词组,如:“我们”“共同”“有的”等。
所以在正常使用中,统计分词法,都会使用一部基本的分词词典(常用词词典),通过字符串分词系统,识别出常用词组,同时通过统计分词系统,识别出新词,生词,两者结合,即发挥出字符串匹配分词系统的速度快,效率高,又可以利用统计分词系统识别生词,自动消除歧义的优点。
J. 我需要把一些语料进行基于统计的分词方法(无词典),将其分词形成一个词库,这种分词算法谁会吗
的故事大概