百度_baidu_搜索分词算法

合集下载

英文分词模型

英文分词模型

英文分词模型
英文分词模型是指用于将英文文本按照单词进行切分的算法或模型。

分词是自然语言处理中的一个重要任务,它将连续的文本切分成有意义的词汇单位,方便后续的文本处理和分析。

在英语中,单词之间通常以空格或标点符号作为分隔符,但有些情况下单词之间并没有明显的分隔符,比如复合词、缩写词和合成词等。

因此,英文分词需要利用语言规则、统计方法或机器学习技术来确定单词的边界。

常见的英文分词模型包括以下几种:
1. 基于规则的分词模型:基于一定的语言规则和词典,通过匹配规则和查找词典中的单词来切分文本。

这种方法需要人工编写规则和维护词典,适用于特定领域或语言规则较为规范的情况。

2. 统计分词模型:基于统计方法,通过分析大量的文本数据,计算词频、词组频率等统计信息,来确定单词的边界。

常见的统计分词算法有最大匹配法、最大概率法和隐马尔可夫模型等。

3. 基于机器学习的分词模型:利用机器学习算法,通过训练样本来学习英文分词的模式和规律。

常见的机器学习算法包括条件随机场(Conditional Random Field, CRF)和递归神经网络(Recurrent Neural Network, RNN)等。

这些英文分词模型各有优劣,选择合适的模型需要根据具体的应用场景和需求进行评估和比较。

同时,还可以通过模型融合和组合等方法来提高分词的准确性和鲁棒性。

信息检索 分词

信息检索 分词

信息检索分词
信息检索是指通过计算机技术从大量的数据中找到所需的信息的过程。

在信息检索中,分词是一个非常重要的步骤。

分词是将一段连续的文本划分成一个个独立的词语,以便计算机能够理解和处理。

在进行分词时,我们需要使用一些特定的算法和技术来实现。

常见的分词算法包括基于规则的分词算法、基于统计的分词算法和基于机器学习的分词算法等。

这些算法可以根据不同的语言和文本特点来选择和应用。

对于中文分词来说,由于中文没有像英文那样明显的单词边界,因此分词更加困难。

中文分词算法通常会使用词典和规则来进行切分,同时也会结合统计和机器学习的方法来提高分词的准确性和效率。

分词的结果可以作为后续信息检索任务的输入。

通过分词,我们可以将文本转化成计算机能够处理的形式,进而进行关键词提取、文本分类、信息检索等任务。

总的来说,分词在信息检索中扮演着非常重要的角色。

它是将文本转化为计算机可识别的形式的关键步骤,对于提高信息检索的准确性和效率具有重要意义。

通过合理选择适用的分词算法和技术,我们能够更好地处理和利用大量的文本数据,从中获取有价值的信息。

最大正向匹配分词算法

最大正向匹配分词算法

最大正向匹配分词算法简介分词是自然语言处理中的重要任务之一,它将连续的文本切分成有意义的词语或词组。

在中文分词中,最大正向匹配分词算法是一种常见的分词方法。

该算法基于词典,通过从左到右依次匹配最长的词进行分词。

优点•算法简单、效率高,适用于大规模文本的分词任务。

•对于常见词汇的分词效果较好。

缺点•对于歧义词汇的分词效果较差。

由于该算法只依次匹配最长的词,因此可能会将歧义词汇按错误的方式进行分词。

•无法处理未登录词。

如果分词的文本中存在词典中未包含的词汇,该算法将无法正确地进行分词。

算法步骤最大正向匹配分词算法的步骤如下:1.定义一个词典,包含常见的词汇。

2.从待分词的文本的左侧开始,选择词典中最长的词作为候选词。

3.判断候选词是否存在于词典中。

4.如果候选词存在于词典中,将该词作为分词结果的一部分,然后从待分词文本的右侧继续进行分词。

5.如果候选词不存在于词典中,将候选词的最后一个字去除,然后将剩余的部分作为新的候选词。

6.重复步骤3和步骤4,直到待分词的文本为空。

算法示例假设我们有一个词典:[“最大”, “正向”, “匹配”, “分词”, “算法”]。

我们要对文本”最大正向匹配分词算法”进行分词。

1.从文本的左侧开始,选择最长的词”最大正向”作为候选词。

2.判断候选词”最大正向”存在于词典中。

3.将候选词”最大正向”作为分词结果的一部分。

4.从待分词的文本的右侧继续进行分词,此时待分词的文本为”匹配分词算法”。

5.从文本的左侧开始,选择最长的词”匹配”作为候选词。

6.判断候选词”匹配”存在于词典中。

7.将候选词”匹配”作为分词结果的一部分。

8.从待分词的文本的右侧继续进行分词,此时待分词的文本为”分词算法”。

9.从文本的左侧开始,选择最长的词”分词”作为候选词。

10.判断候选词”分词”存在于词典中。

11.将候选词”分词”作为分词结果的一部分。

12.从待分词的文本的右侧继续进行分词,此时待分词的文本为”算法”。

搜索引擎的分词机制

搜索引擎的分词机制

搜索引擎的分词机制(木木长官)〃長官"(4651130) 14:57:53今天我来给大家讲下搜索引擎的分词机制〃長官"(4651130) 14:57:58准备下马上就开始〃長官"(4651130) 15:00:36在搜索引擎中用户提交的搜索内容会被后台提交到数据库与数据库中的数据来对比,从中调出相应的数据。

(这些东西做程序的可能了解)与普通网站的站内搜索类似〃長官"(4651130) 15:01:38下面举例:比如你想要搜索的是“京珠高速的火车出轨并且无一人伤亡天上也掉下冰雹”这个语句的时候〃長官"(4651130) 15:02:40如果搜索引擎直接用你段话与数据库中的数据来对比。

肯定搜索不出来任何数据。

因为这个是我自己随便写的。

〃長官"(4651130) 15:03:26但是搜索引擎又不能叫客户搜索不到东西,所以他们用到了中文分词和英文分词〃長官"(4651130) 15:03:42今天主要说中文英文以后在说〃長官"(4651130) 15:04:50当它用了分词后,用过动易CMS系统的朋友,应该知道。

他们采集后的数据,会把标题分割成2个字一组的关键词。

〃長官"(4651130) 15:04:58比如:京珠高速的火车出轨并且无一人伤亡天上也掉下冰雹〃長官"(4651130) 15:05:55这个标题动易的分词机制是这么分:京珠|珠高|高速|速的|的火|火车|车出|出轨|轨并|并且|且无|无一|一人|人伤|伤亡|亡天|天上|上也|也掉|掉下|下冰|冰雹它把每个字前一个和后一个自动组合,虽然不合理,但是有一定的技术含量在里面。

〃長官"(4651130) 15:06:39之所以把词拆分开,就是为了与数据库中的相应数据来对比〃長官"(4651130) 15:08:10搜索引擎可以这样做分词(前提是因为数据库中有相应的数据库,还有临时数据库!这些后面有介绍)〃長官"(4651130) 15:09:03京珠|高速|的|火车|出轨|并且|无一人|伤亡|天上|也掉|下|冰雹〃長官"(4651130) 15:09:35也可以这样分〃長官"(4651130) 15:10:42京珠高速|的|火车出轨|并且|无一人|伤亡|天上|也|掉下|冰雹〃長官"(4651130) 15:11:51怎么个分词方法是根据搜索引擎的数据库与算发有直接的关系〃長官"(4651130) 15:12:22比如百度搜索引擎〃長官"(4651130) 15:13:23这样可以简单的看出他是怎么分的〃長官"(4651130) 15:13:27〃長官"(4651130) 15:14:45京珠高速|的|火车出轨|并且无一|人伤亡|天上|也掉下冰雹〃長官"(4651130) 15:16:02京|珠|高速|的|火车|出轨|并且|无|一人|伤亡|天上|也掉下冰雹〃長官"(4651130) 15:17:22下面来看看百度搜索引擎中的分词的理解与实践〃長官"(4651130) 15:17:48〃長官"(4651130) 15:18:15大家可以看到这个是百度中的分法(不能一概而论)〃長官"(4651130) 15:19:07可以看出我在上面所规划出的词〃長官"(4651130) 15:19:10〃長官"(4651130) 15:16:02京|珠|高速|的|火车|出轨|并且|无|一人|伤亡|天上|也掉下冰雹〃長官"(4651130) 15:19:13这个来`〃長官"(4651130) 15:19:41〃長官"(4651130) 15:20:01而第二个呢〃長官"(4651130) 15:20:08就与上面有些出入了〃長官"(4651130) 15:21:08这些就是在数据库中所存的数据也可以说是字典〃長官"(4651130) 15:21:17/s?wd=%BE%A9%D6%E9%B8%DF%CB%D9%B5%C4%BB%F0%B3%B5%B3%F6%B9%EC%B2%A2% C7%D2%CE%DE%D2%BB%C8%CB%C9%CB%CD%F6+%CC%EC%C9%CF%D2%B2%B5%F4%CF%C2%B1%F9%B1%A2&cl=3〃長官"(4651130) 15:21:26大家可以打开这个地址看一下〃長官"(4651130) 15:21:28一会在看哦〃長官"(4651130) 15:23:20当这站上的某个页面上出现了我刚才搜索的语句,搜索引擎把他分词,当查寻不到的时候,引擎中还会在把分过的词,或者原句在从新的分词〃長官"(4651130) 15:23:54也就是相当于比如搜索的是某个成语〃長官"(4651130) 15:24:37胸有成竹东山再起〃長官"(4651130) 15:25:02刚刚我用的是只能ABC打出来的〃長官"(4651130) 15:25:49直接拼音出来胸有成竹东山再起这两个就能直接打出来。

搜索引擎的分词机制

搜索引擎的分词机制

搜索引擎的分词机制(木木长官)〃長官" 14:57:53今天我来给大家讲下搜索引擎的分词机制〃長官" 14:57:58准备下马上就开始〃長官" 15:00:36在搜索引擎中用户提交的搜索内容会被后台提交到数据库与数据库中的数据来对比,从中调出相应的数据。

(这些东西做程序的可能了解)与普通网站的站内搜索类似〃長官" 15:01:38下面举例:比如你想要搜索的是“京珠高速的火车出轨并且无一人伤亡天上也掉下冰雹”这个语句的时候〃長官" 15:02:40如果搜索引擎直接用你段话与数据库中的数据来对比。

肯定搜索不出来任何数据。

因为这个是我自己随便写的。

〃長官" 15:03:26但是搜索引擎又不能叫客户搜索不到东西,所以他们用到了中文分词和英文分词〃長官" 15:03:42今天主要说中文英文以后在说〃長官" 15:04:50当它用了分词后,用过动易CMS系统的朋友,应该知道。

他们采集后的数据,会把标题分割成2个字一组的关键词。

〃長官" 15:04:58比如:京珠高速的火车出轨并且无一人伤亡天上也掉下冰雹〃長官" 15:05:55这个标题动易的分词机制是这么分:京珠|珠高|高速|速的|的火|火车|车出|出轨|轨并|并且|且无|无一|一人|人伤|伤亡|亡天|天上|上也|也掉|掉下|下冰|冰雹它把每个字前一个和后一个自动组合,虽然不合理,但是有一定的技术含量在里面。

〃長官" 15:06:39之所以把词拆分开,就是为了与数据库中的相应数据来对比〃長官" 15:08:10搜索引擎可以这样做分词(前提是因为数据库中有相应的数据库,还有临时数据库!这些后面有介绍)〃長官" 15:09:03京珠|高速|的|火车|出轨|并且|无一人|伤亡|天上|也掉|下|冰雹〃長官" 15:09:35也可以这样分〃長官" 15:10:42京珠高速|的|火车出轨|并且|无一人|伤亡|天上|也|掉下|冰雹〃長官" 15:11:51怎么个分词方法是根据搜索引擎的数据库与算发有直接的关系〃長官" 15:12:22比如百度搜索引擎〃長官" 15:13:23这样可以简单的看出他是怎么分的〃長官" 15:13:27〃長官" 15:14:45京珠高速|的|火车出轨|并且无一|人伤亡|天上|也掉下冰雹〃長官" 15:16:02京|珠|高速|的|火车|出轨|并且|无|一人|伤亡|天上|也掉下冰雹〃長官" 15:17:22下面来看看百度搜索引擎中的分词的理解与实践〃長官" 15:17:48〃長官" 15:18:15大家可以看到这个是百度中的分法(不能一概而论)〃長官" 15:19:07可以看出我在上面所规划出的词〃長官" 15:19:10〃長官" 15:16:02京|珠|高速|的|火车|出轨|并且|无|一人|伤亡|天上|也掉下冰雹〃長官" 15:19:13这个来`〃長官" 15:19:41〃長官" 15:20:01而第二个呢〃長官" 15:20:08就与上面有些出入了〃長官" 15:21:08这些就是在数据库中所存的数据也可以说是字典〃長官" 15:21:17/s?wd=%BE%A9%D6%E9%B8%DF%CB%D9%B5%C4%BB%F0%B3%B5%B3%F6%B9%EC%B2%A2% C7%D2%CE%DE%D2%BB%C8%CB%C9%CB%CD%F6+%CC%EC%C9%CF%D2%B2%B5%F4%CF%C2%B1%F9%B1%A2&cl=3〃長官" 15:21:26大家可以打开这个地址看一下〃長官" 15:21:28一会在看哦〃長官" 15:23:20当这站上的某个页面上出现了我刚才搜索的语句,搜索引擎把他分词,当查寻不到的时候,引擎中还会在把分过的词,或者原句在从新的分词〃長官" 15:23:54也就是相当于比如搜索的是某个成语〃長官" 15:24:37胸有成竹东山再起〃長官" 15:25:02刚刚我用的是只能ABC打出来的〃長官" 15:25:49直接拼音出来胸有成竹东山再起这两个就能直接打出来。

分词 和数据库匹配算法

分词 和数据库匹配算法

分词和数据库匹配算法分词(Tokenization)是将文本或字符串分解成更小的单元,通常是单词或标记的过程。

在数据库匹配算法中,分词常常用于处理搜索、匹配和索引等操作,以提高数据库中文本数据的检索效率。

以下是一些与数据库匹配算法相关的常见分词和技术:1. 全文搜索引擎:全文搜索引擎是一种数据库匹配算法,它使用分词技术来创建索引,支持高效的文本搜索。

例如,MySQL 的全文搜索功能可以通过使用`MATCH AGAINST` 进行全文搜索。

```sqlSELECT * FROM articles WHERE MATCH (title, content) AGAINST ('search query' IN NATURAL LANGUAGE MODE);```2. n-gram 分词:n-gram 是一种将文本切分成包含n 个连续字符的片段的方法。

在数据库匹配中,n-gram 分词可用于模糊搜索和相似度匹配。

通过创建n-gram 索引,可以更有效地处理模糊查询。

3. 正则表达式:正则表达式可以用于在文本中识别和匹配模式。

在数据库中,正则表达式可以用于复杂的模式匹配和搜索操作。

```sqlSELECT * FROM users WHERE username REGEXP '^joh?n';```4. Levenshtein 距离:Levenshtein 距离是一种度量两个字符串之间差异的方法。

在数据库匹配中,可以使用Levenshtein 距离算法来进行模糊匹配,找到与给定字符串最接近的数据库条目。

```sqlSELECT * FROM words WHERE LEVENSHTEIN('search term', column_name) < 3;```5. 全文检索引擎(如Elasticsearch):对于大规模文本数据,专用的全文检索引擎如Elasticsearch可能更适合。

分词算法java

分词算法java

分词算法java
在Java中,常用的分词算法包括:
1. 最大匹配算法(MM):
最大匹配算法是一种基于词典的分词算法,它将待分词的文本从左到右进行扫描,根据词典中的词语进行匹配,选择最长的匹配词作为分词结果。

该算法简单高效,但对于歧义词和未登录词处理较差。

2. 正向最大匹配算法(FMM):
正向最大匹配算法与最大匹配算法类似,但它从文本的起始位置开始匹配。

首先取待分词文本中的前n个字符作为匹配字符串(通常取词典中最长的词的长度),如果这个字符串在词典中存在,则作为分词结果,否则取待分词文本的前n-1个字符,继续匹配,直到匹配到词典中的词为止。

3. 逆向最大匹配算法(BMM):
逆向最大匹配算法与正向最大匹配算法类似,但它从文本的末尾位置向前匹配。

首先取待分词文本中的后n个字符作为匹配字符串,如果这个字符串在词典中存在,则作为分词结果,否则取待分词文本的后n-1个字符,继续匹配,直到匹配到词典中的词为止。

4. 双向最大匹配算法(BiMM):
双向最大匹配算法结合了正向最大匹配算法和逆向最大匹配算法的优点。


从文本的起始位置和末尾位置同时进行匹配,选择两个结果中词数较少的分词结果作为最终的分词结果。

以上是一些常见的分词算法,你可以根据自己的需求选择合适的算法进行分词处理。

同时,还可以使用一些开源的中文分词库,例如HanLP、jieba等,它们已经实现了这些算法,并提供了丰富的功能和接口供你使用。

基于统计的分词算法

基于统计的分词算法

基于统计的分词算法是一种将文本分割成单独的词语(或称为“中文分词”)的自然语言处理技术。

它主要基于概率模型和统计学方法,通过对大量文本进行训练和分析,来确定每个词语出现的概率和上下文关系,从而实现准确的分词。

基于统计的分词算法通常可以分为以下几个步骤:
收集并预处理语料库:语料库是指包含大量文本数据的数据库,用于训练和测试分词模型。

在这一步中,需要收集、清洗和预处理语料库,以便后续的分析和建模。

构建统计模型:建立一个概率模型,用于描述每个中文字在不同上下文环境中出现的概率。

典型的模型包括隐马尔可夫模型(HMM)、最大熵模型(ME)、条件随机场(CRF)等。

分词:在实际应用中,分词通常采用正向最大匹配法(FMM)和逆向最大匹配法(RMM)两种方法。

在这一步中,根据前面构建的统计模型和特定的分词策略,将待处理的文本分割成词语序列。

评估和优化:在分词完成后,需要对结果进行评估和优化。

通常采用F1值、准确率、召回率等指标来评价分词的效果,并对模型进行调整和改进。

基于统计的分词算法的优点是可以自适应地调整分词策略和概率模型,以适应不同的文本领域和语言环境。

但它也存在一些缺点,如对于新词的处理比较困难,而且对于歧义词的划分也存在一定的局限性。

因此,在实际应用中,还需要结合其他技术和方法,如规则匹配、机器学习、深度学习等,来提高分词的准确性和效率。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Baidu查询分词算法查询处理以及分词技术如何设计一个高效的搜索引擎?我们可以以百度所采取的技术手段来探讨如何设计一个实用的搜索引擎.搜索引擎涉及到许多技术点,比如查询处理,排序算法,页面抓取算法,CACHE机制,ANTI-SPAM等等.这些技术细节,作为商业公司的搜索引擎服务提供商比如百度,GOOGLE等是不会公之于众的.我们可以将现有的搜索引擎看作一个黑盒,通过向黑盒提交输入,判断黑盒返回的输出大致判断黑盒里面不为人知的技术细节.查询处理与分词是一个中文搜索引擎必不可少的工作,而百度作为一个典型的中文搜索引擎一直强调其”中文处理”方面具有其它搜索引擎所不具有的关键技术和优势.那么我们就来看看百度到底采用了哪些所谓的核心技术.我们分两个部分来讲述:查询处理/中文分词.一. 查询处理用户向搜索引擎提交查询,搜索引擎一般在接受到用户查询后要做一些处理,然后在索引数据库里面提取相关的信息.那么百度在接受到用户查询后做了些什么工作呢?1. 假设用户提交了不只一个查询串,比如”信息检索理论工具”.那么搜索引擎首先做的是根据分隔符比如空格,标点符号,将查询串分割成若干子查询串,比如上面的查询就会被解析为:<信息检索,理论,工具>三个子字符串;这个道理简单,我们接着往下看.2. 假设提交的查询有重复的内容,搜索引擎怎么处理呢?比如查询”理论工具理论”,百度是将重复的字符串当作只出现过一次,也就是处理成等价的”理论工具”,而GOOGLE显然是没有进行归并,而是将重复查询子串的权重增大进行处理.那么是如何得出这个结论的呢?我们可以将”理论工具”提交给百度,返回341,000篇文档,大致看看第一页的返回内容.OK.继续,我们提交查询”理论工具理论”,在看看返回结果,仍然是那么多返回文档,当然这个不能说明太多问题,那看看第一页返回结果的排序,看出来了吗?顺序完全没有变化,而GOOGLE则排序有些变动,这说明百度是将重复的查询归并成一个处理的,而且字符串之间的先后出现顺序基本不予考虑(GOOGLE是考虑了这个顺序关系的).3. 假设提交的中文查询包含英文单词,搜索引擎是怎么处理的?比如查询”电影BT下载”,百度的方法是将中文字符串中的英文当作一个整体保留,并以此为断点将中文切分开,这样上述的查询就切为<电影,BT,下载>,不论中间的英文是否一个字典里能查到的单词也好,还是随机的字符也好,都会当作一个整体来对待.至于为什么,你用查询” 电影dfdfdf下载”看看结果就知道了.当然如果查询中包含数字,也是如此办理.到目前为止,一切很简单,也很清楚,百度怎么处理用户查询的呢?归纳如下:首先根据分割符号将查询分开,然后看看是否有重复的字符串,如果有,就抛弃多余的,只保留一个,接着判断是否有英文或者数字,如果有的话,把英文或者数字当作一个整体保留并把前后的中文切开接着该干什么呢?该考虑分词的问题了.二. 中文分词首先,讲讲百度的分词时机或者条件问题,是否是个中文字符串百度就拿来切一下呢?非也,要想被百度的分词程序荣幸的切割一下也是要讲条件的,哪能是个字符串就切割啊?你当百度是卖锯条的么?那么什么样的字符串才满足被切割的条件呢?简单说来,如果字符串只包含小于等于3个中文字符的话,那就保留不动,当字符串长度大于4个中文字符的时候,百度的分词程序才出马大干快上,把这个字符串肢解掉.怎么证明呢?我们向百度提交”电影下载”,看看返回结果中标为红字的地方,不难看出来,查询已经被切割成<电影,下载>两个单词了,说明分词程序已经开工了,如果是比4个中文字符更长的字符串,那分词程序就更不客气了,一定大卸八块而后快.我们来看看三个字符的情况,提交查询”当然择”,看起来这个查询不伦不类,那是因为我希望看到这个字符串被切分为<当然,择>,返回结果365篇相关页面,翻到最后一页,发现标红的关键字都是”当然择”连续出现的情况,好像没有切分,但是还不确定,那么再提交人工分好的查询”当然择”看看,返回结果1,090,000篇,基本上可以确定没有进行分词了,当然另外一种解释是:对于三个字符先切分,然后将切分后的结果当作一个短语查询,这样看到的效果和没有切分是相似的.但是我倾向于判断百度对于少于3个字符的串没有切分,奥卡姆不是说了么”如无必要,勿增实体”,干吗做无用功呢.那么如果没有切分,会有一个随之而来的问题,怎么从索引库里面提取未切分的字符串呢?这牵扯到索引的问题,我觉得百度应该采取了两套索引机制,一种是按照单词索引,一种是按照N-GRAM索引,至于索引的具体问题,以后在详细论述.下面我们看看百度是采取的何种分词算法,现在分词算法已经算是比较成熟了,有简单的有复杂的,比如正向最大匹配,反向最大匹配,双向最大匹配,语言模型方法,最短路径算法等等,有兴趣的可以用GOOGLE去搜索一下以增加理解.这里就不展开说了.但是要记住一点的是:判断一个分词系统好不好,关键看两点,一个是消除歧义能力;一个是词典未登录词的识别比如人名,地名,机构名等.那么百度用的是什么方法?我的判断是用双向最大匹配算法.至于怎么推理得出的,让我们一步步来看.当然,这里首先有个假设,百度不会采取比较复杂的算法,因为考虑到速度问题.我们提交一个查询”毛泽东北京华烟云”,又一个不知所云的查询,尽管不知所云但是自有它的道理,我想看看百度的分词是如何消歧以及是否有词典未登录词的识别的功能,如果是正向最大匹配算法的话,那么输出应该是:”毛泽东/北京/华/烟云”,如果是反向最大匹配算法的话,那么输出应该是:”毛/泽/东北/京华烟云”,我们看看百度的分词结果:”毛泽东/北/京华烟云”,一个很奇怪的输出,跟我们的期望相差较多,但是从中我们可以获得如下信息:百度分词可以识别人名,也可以识别”京华烟云”,这说明有词典未登录词的识别的功能,我们可以假设分词过程分为两个阶段:第一阶段,先查找一个特殊词典,这个词典包含一些人名,部分地名以及一些普通词典没有的新词,这样首先将”毛泽东”解析出来,剩下了字符串”北京华烟云”,而”北/京华烟云”,可以看作是反向最大匹配的分词结果.这样基本说得通.为了证明这一点,我们提交查询”发毛泽东北”,我们期望两种分词结果,一个是正向最大匹配<发毛,泽,东北>,一个是上述假设的结果<发,毛泽东,北>,事实上百度输出是第二种情况,这样基本能确定百度分词采取了至少两个词典,一个是普通词典,一个是专用词典(人名等).而且是专用词典先切分,然后将剩余的片断交由普通词典来切分.继续测验,提交查询”古巴比伦理”,如果是正向最大匹配,那么结果应该是<古巴比伦,理>,如果是反向最大匹配,那么结果应该是<古巴,比,伦理>,事实上百度的分词结果是<古巴比伦,理>,从这个例子看,好像用了正向最大匹配算法;此外还有一些例子表明好像是使用正向最大匹配的;但是且慢,我们看这个查询”北京华烟云”,正向最大匹配期望的结果是<北京,华,烟云>,而反向最大匹配期望的结果是<北,京华烟云>,事实上百度输出的是后者,这说明可能采用的反向最大匹配;从这点我们可以猜测百度采用的是双向最大匹配分词算法,如果正向和反向匹配分词结果一致当然好办,直接输出即可;但是如果两者不一致,正向匹配一种结果,反向匹配一种结果,此时该如何是好呢?从上面两个例子看,在这种情况下,百度采取最短路径方法,也就是切分的片断越少越好,比如<古巴,比,伦理>和<古巴比伦,理>相比选择后者,<北京,华,烟云>和<北,京华烟云>相比选择后者.还有类似的一些例子,这样基本可以解释这些输出结果.但是仍然遗留的问题是:如果正向反向分词不一致,而且最短路径也相同,那怎么办?输出正向的还是反向的结果?我们再来看一个例子.提交查询”遥远古古巴比伦”,这个查询被百度切分为<遥远,古古,巴比伦>,说明词典里面有”巴比伦”,但是是否有”古巴比伦”这个词汇不确定,此时看不出是正向切分还是反向切分得出的结果,换查询为”遥远古巴比伦”,此时被切分为”遥远/古巴比伦”,这说明词典里面有”古巴比伦”这个词汇,这说明了”遥远古古巴比伦”是正向最大匹配的结果.那为什么”遥远古古巴比伦”不会被反向切分为”遥/远古/古巴比伦”呢,百度的可能选择是这种情况下选择单字少的那组切分结果.当然还可以继续追问:如果切分后单字也一样多,那怎么办?最后看一个例子,查询”王强大小:”,百度将其切分为”王/强大/小”,是正向切分的结果,如果是反向的会被切分为”王/强/大小”,这说明有歧义而且单字也相同则选择正向切分结果.OK,看到这里可能头已经有些晕了,最后总结一下百度的分词算法,当然里面还是有猜测的成分,算法如下:首先查询专用词典(人名,部分地名等),将专有名称切出,剩下的部分采取双向分词策略,如果两者切分结果相同,说明没有歧义,直接输出分词结果.如果不一致,则输出最短路径的那个结果,如果长度相同,则选择单字词少的那一组切分结果.如果单字也相同,则选择正向分词结果..百度一直宣传自己在中文处理方面的优势,从上面看,分词算法并无特殊之处,消歧效果并不理想,即使百度采取比上述分词算法复杂些的算法也难以说成是优势,如果说百度有优势的话,唯一的优势就是那个很大的专用词典,这个专用词典登录了人名(比如大长今),称谓(比如老太太),部分地名(比如阿联酋等),估计百度采用学术界公布的比较新的命名实体识别算法从语料库里面不断识别出词典未登录词,逐渐扩充这个专门词典.如果这就是优势的话,那么这个优势能够保持多久就是个很明显的问题.baidu分词算法分析之二文章作者: 张俊林文章来源: 中科院软件所文章编辑: urlSpelling Checker拼写检查错误提示(以及拼音提示功能)baidu分词算法分析之二拼写检查错误提示是搜索引擎都具备的一个功能,也就是说用户提交查询给搜索引擎,搜索引擎检查看是否用户输入的拼写有错误,对于中文用户来说一般造成的错误是输入法造成的错误.那么我们就来分析看看百度是怎么实现这一功能的.我们分析拼写检查系统关注以下几个问题:(1)系统如何判断用户的输入是有可能发生错误的查询呢?(2)如果判断是可能错误的查询输入,如何提示正确的词汇呢?那么百度是如何做的呢?百度判断用户输入是否错误的标准,我觉得应该是查字典,如果发现字典里面不包含这个词汇,那么很有可能是个错误的输入,此时启动错误提示功能,这个很好判断,因为如果是一个正常词汇的话,百度一般不会有错误提示,而你故意输入一个词典不可能包含的所谓词汇,此时百度一般会提示你正确的检索词汇.那么百度是怎么提示正确词汇的呢?很明显是通过拼音的方式,比如我输入查询" 制才",百度提供的提示词汇为: “制裁质材纸材",都是同音字.所以百度必然维持着一个同音词词典,里面保留着同音词信息,比如可能包含着下面这条词条: “ zhi cai à制裁,质材,纸材",另外还有一个标注拼音程序,现在能够看到的基本流程是: 用户输入" 制才",查词典,发现没有这个词汇,OK,启动标注拼音程序,将" 制才"标注为拼音"zhi cai",然后查找同音词词典,发现同音词" 制裁,质材,纸材",那么提示用户可能的正确拼写整体流程看起来很简单,但是还有一些遗留的小问题,比如是否将词表里面所有同音词都作为用户的提示信息呢?比如某个拼音有10个同音词,是否都输出呢?百度并没有将所有同音词都输出而是选择一定筛选标准,选择其中几个输出.怎么证明这一点?我们看看拼音"liu li"的同音词,紫光输入法提示同音词汇有" 流丽流离琉璃流利"4个,我们看看百度返回几个,输入"流厉"作为查询,这里是故意输入一个词典不包含的词汇,这样百度的拼写检查才开始工作,百度提示: " 琉璃刘丽刘莉",这说明什么?说明不是所有同音词都输出,而是选择输出,那么选择的标准是什么?我能够猜测到的方法是对于用户查询LOG进行统计,提取用户查询次数多的那些同音词输出,如果是这样的话,上面的例子说明用户搜索"琉璃"次数比其它的都要高些,次之是" 刘丽",再次是" 刘莉",看来大家都喜欢查询自己或者认识的人的名字.另外一个小问题:同音词词典包含2字词,3字词,那么是否包含4字词以及更长的词条?是否包含一字词? 这里一字词好回答,不用测试也能知道肯定不包含,因为你输入一个字,谁知道是否是错误的呢?反正只要是汉字就能在词表里面找到,所以没有判断依据.二字词是包含的,上面有例子,三字词也包含,比如查询"中城药"百度错误提示:"中成药",修改查询为"重城药",还是提示"中成药" ,再次修改查询"重城要",百度依然提示"中成药". 那么4字词汇呢?百度还是会给你提示的,下面是个例子:输入:静华烟云提示京华烟云输入:静话烟云提示京华烟云输入:静话阎晕提示京华烟云那么更长的词汇是否提示呢?也提示,比如我输入: "落花世界有风军",这个查询是什么意思,估计读过古诗的都知道,看看百度的提示"落花时节又逢君",这说明什么?说明同音词词典包含不同长度的同音词信息,另外也说明了百度的核心中文处理技术,也就是那个词典,还真挺大的.但是,如果用户输入的查询由两个或者两个以上子字符串构成,那么百度的错误提示功能就***了,比如输入查询"哀体",百度提示"艾提挨踢",但是.输入为"我哀体",则没有任何错误提示.还有一个比较重要的问题:如果汉字是多音字那么怎么处理?百度呢比较偷懒,它根本就没有对多音字做处理.我们来看看百度的一个标注拼音的错误,在看这个错误前先看看对于多音字百度是怎么提示错误的,我们输入查询"俱长",百度提示"剧场局长", “俱长"的拼音有两个:"ju zhang /ju chang" ,可见如果是多音字则几种情况都提示..现在我们来看看错误的情况, 我们输入查询"剧常",百度提示":剧场局长",提示为"剧场"当然好解释,因为是同音字,但是为什么"局长"也会被提示呢?这说明百度的同音字词典有错误,说明在"ju chang"这个词条里面包含"局长"这个错误的同音词.让我们顺藤摸瓜,这个错误又说明什么问题呢?说明百度的同音词典是自动生成的,而且没有人工校对.还说明在自动生成同音词典的过程中,百度不是根据对一篇文章标注拼音然后在抽取词汇和对应的拼音信息获得的,而是完全按照某个词典的词条来标注音节的,所以对于多音字造成的错误无法识别出来,如果是对篇章进行拼音标注,可能就不会出现这种很容易发现的错误标注. 当然还有另外一种解释,就是"局长"是故意被百度提示出来可能的正确提示词汇,因为考虑到南方人"zh"和"ch"等前后鼻音分不清么,那么是这样的么?我们继续测试到底是何种情况.是百度有错误还是这是百度的先进的算法?我们考虑词汇"长大",故意错误输入为"赃大",如果百度考虑到了前后鼻音的问题,那么应该会提示"长大",但是百度提示是"藏大".这说明什么?说明百度并没有考虑前后鼻音问题,根本就是系统错误. 我们输入查询"悬赏",故意将之错误输入为"悬桑",没有错误提示,说明确实没有考虑这种情况.前鼻音没有考虑,那么后鼻音考虑了么,我们输入":经常",故意改为后鼻音"经缠",百度提示为"经产经忏",还是没有考虑后鼻音.这基本可以确定是百度系统的错误导致.根据以上推导, 我们可以得出如下结论:百度是将分词词典里面每个词条利用拼音标注程序标注成拼音,然后形成同音词词典,所以两个词典是同样大的,而且这个词典也随着分词词典的增长而在不断增长. 至于标注过程中多音字百度没有考虑,如果是多音字就标注成多个发音组合,通过这种方式形成同音词词典.这样的同音词词典显然包含着很多错误.最后一个问题:百度对于英文进行拼写检查么?让我们试试看,输入查询"china",不错,搜到不少结果,专注中文搜索的百度还能搜索到英文,真是意外的惊喜.变换一下查询"chine",会更加意外惊喜的给我们提示"china"吗?百度提示的是: 吃呢持呢,原来是不小心触发了百度的拼音搜索功能了.那么拼音搜索和中文检查错误是否采用同一套同音词词典呢,让我们来实验一下,搜索"rongji", 百度提示" 榕基溶剂容积",OK,换个中文查询"容机",百度提示" 榕基溶剂容积",看来使用的是同一套同音词词典.也就是说百度的中文纠错和拼音检索使用的机制相同,中文纠错多了一道拼音注音的过程而已.难道这就是传说中那个百度的"事实上是一个无比强大的拼音输入法"的拼音提示功能么?最后让我们总结归纳一下百度的拼写检查系统:后台作业: (1)前面的文章我们说过,百度分词使用的词典至少包含两个词典一个是普通词典,另外一个是专用词典(专名等),百度利用拼音标注程序依次扫描所有词典中的每个词条,然后标注拼音,如果是多音字则把多个音都标上,比如"长大",会被标注为"zhang da/chang da"两个词条.(2)通过标注完的词条,建立同音词词典,比如上面的"长大",会有两个词条: zhang daà长大" , chang daà长大.(3)利用用户查询LOG频率信息给予每个中文词条一个权重;(4)OK,同音词词典建立完成了,当然随着分词词典的逐步扩大,同音词词典也跟着同步扩大;拼写检查(1)用户输入查询,如果是多个子字符串,不作拼写检查;(2)对于用户查询,先查分词词典,如果发现有这个单词词条,OK, 不作拼写检查;(3)如果发现词典里面不包含用户查询,启动拼写检查系统;首先利用拼音标注程序对用户输入进行拼音标注;(4)对于标注好的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;(5)如果发现有词条,则按照顺序输出权重比较大的几个提示结果拼音提示:(1)对于用户输入的拼音在同音词词典里面扫描,如果没有发现则不作任何提示;(2)如果发现有词条,则按照顺序输出权重比较大的几个提示结果;baidu分词算法分析之三对百度分词算法的进一步分析baidu分词算法分析之三上面说过,经过分析得出百度的分词系统采用双向最大匹配分词,但是后来发现推理过程中存在一个漏洞,而且推导出来的百度分词算法步骤还是过于繁琐,所以进一步进行分析,看看是否前面的推导有错误.那么以前的分析有什么漏洞呢?我们推导百度分词有反向最大匹配的依据是百度将"北京华烟云"分词为<北,京华烟云>,从这里看好像采用了反向最大匹配,因为正向最大匹配的结果应该是<北京,华,烟云>,但是由此就推论说百度采用了双向最大匹配还是太仓促了,前面文章我们也讲过,百度有两个词典,一个普通词典,一个专有词典,而且是专有词典的词汇先切分,然后将剩余片断交给普通词典去切分.所以上面的"北京华烟云"之所以被切分成<北,京华烟云>,另外一个可能是:京华烟云这个词汇是在专有词典里面存储的,所以先分析,这样得出"京华烟云",剩下"北",没什么好切分的,所以输出<北,京华烟云>.这里只是假设,那么是否确实"京华烟云"在专有词典呢?我们再看一个例子"山东北京华烟云",百度切分的结果是<山东,北,京华烟云>,如果"京华烟云"在普通词典,如果是反向切分,那么结果应该是<山,东北,京华烟云>,如果是正向切分应该是<山东,北京,华,烟云>,无论如何都分不出<山东,北,京华烟云>.这说明什么?说明"京华烟云"是在那个专有词典,所以先切分出"京华烟云",然后剩下的"山东北"交由普通词典切分,明显是正向最大匹配的结果输出<山东,北>.当然按照我们在第一篇文章的算法推导"山东北"的切分也会得出<山东,北>的结论,但是明显比正向最大匹配多几个判断步骤,既然效果一样,另外一个更加简洁的方法也能说得通,那当然选择简便的方法了.所以初步判断百度采取的是正向最大匹配.我们继续测试采用何种分词算法,为了减少专有词典首先分词造成的影响,那么查询里面不能出现相对特殊的词汇,构筑查询"天才能量级",这里应该没有专有词典出现过的词汇,百度切分为<天才,能量,级>,看来是正向最大匹配的结果.另外,如果所有查询词汇都出现在专有词典,那么采取的是何种方法?这样首先就得保证词汇都出现在专有词典,这么保证这一点呢?我们构造查询"铺陈晓东方",百度切分为<铺,陈晓东,方>,可以看出"陈晓东"是在专有词典的所以先切分出来.另外一个例子"山东京城",百度切分为<山东,京城>,说明"东京"是在普通词典的.OK,构造查询"陈晓东京华烟云",通过前面分析可以看出两个词汇都在专有词典里面,百度切分为<陈晓东,京华烟云>,说明对于专有词典词汇也是采取正向最大匹配或者双向最大匹配.那么使用反向最大匹配了吗? 构造查询例子"陈晓东方不败",首先我们肯定"陈晓东"和"东方不败"都是在专有词典出现的,如果是正向切分,那么应该是<陈晓东,方,不败>或者<陈晓东,方,不,败>如果是反向切分则是<陈,晓,东方不败>,可以看出百度的切分是<陈晓东,方,不败>或者<陈晓东,方,不,败>,说明采用的是正向最大匹配.通过分析,百度的词典不包含"不败"这个单词,所以实际上百度的切分结果是<陈晓东,方,不,败>,很明显这和我们以前。

相关文档
最新文档