至此为止,我们就讲解完了针对英文文档的倒排索引。在英文的句子中,由于单词之间留有空白,所以通过用空白划分句子就可以提取出句中的单词。但是在中文的句子中,由于各单词是词间不留空白连续书写的,所以就需要使用不同于英文的方法,才能将句子分割成单词或字符的序列。在本节我们详细地看一下分割中文句子的方法。 分割中文句子的方法 若要将类似中文的句子,即单词无法通过空白划分出来的句子分割成单词序列,通常有以下两种方法。 词素解析分割法 N-gram(q-gram)分割法 下面就让我们详细地看一看这两种分割方法吧。 词素解析分割法 词素解析(Morphological Analysis)分割法是一种将句子分割为“词素”序列的方法。词素是语言中含有意义的最小单位。例如,如果使用词素解析分割法分割“全文搜索引擎”这段文本,那么可以得到如下结果。 全文 搜索 引擎 由于中文的语法极其复杂,所以一般认为对中文句子正确地进行词素解析是件非常困难的事。近几年,在词素解析上,一般采用的是机器学习的方法。机器学习的过 程是先学习由手工作业正确分割句子后得到的数据,然后推理出应该如何分割未知的句子(以及如何标注词性等)①。一般认为现代词素解析的精度已经非常高了,在大多数情况下,都能正确地判断出中文句子应该在哪里分割成词。不过,对于那种在博客等环境中常用的含有大量口语表达的句子,精度还是会大幅下降的。 ----———— A 机器学习中的有些方法采用了隐马尔可夫模型(Hidden Markov Model),有些采用了条件随机场(Conditional Random Field)概率模型。 ———————— N-gram(q-gram)分割法 N-gram 分割法是一种将句子分割成由N 个字符组成的片段序列的方法,每个片段称作一个N-gram。N 的取值通常为2 或3。N = 1 时称作uni-gram(一元gram),N = 2 时称作bi-gram(二元gram),N = 3时称作tri-gram(三元gram)。例如,如果使用bi-gram 去分割“全文搜索引擎”这段文本,那么可以得到如下结果。 全文 文搜 搜索 索引 引擎 N-gram 分割法作为一种不依赖具体语言的句子分割方法,广泛应用于以亚洲国家的语言为主的各种语言中。 另外, 在英文中将分割句子这种行为称为Segmentation 或Tokenization。严格地来讲这两个词的含义并不相同,但是在有关倒排索引的上下文中,人们似乎并不怎么在使用上对它们加以区分。句子分割后产生的一个个单词则称为词元(Token)或词项(Term)。 权衡分割方法 上述两种方法都可以将句子分割成词元,由这两种词元构成的倒排索引各有各的优缺点。 由词素构成的倒排索引的优缺点 与由N-gram 构成的倒排索引相比,由词素构成的倒排索引由于从文中分割出的词元数更少, 所以词典和倒排文件的尺寸也就更小。由此就产生了高速进行构建处理和搜索处理的可能性。 不过这种倒排索引也存在缺点,即会发生所谓的“检索遗漏”问题。检索遗漏指的是,尽管查询实际就包含在文档中,但就是找不到与查询相匹配的内容。这是由查询与通过词素解析从文中分割出的词素不一致导致的。例如,将“哆哆嗦嗦”分割成词素后还是“哆哆嗦嗦”,可如果检索的是“哆嗦”,就无法检索到包含“哆哆嗦嗦”的文档了。那些尚未收录在词素解析词典中的新词和以口语方式使用的单词也都面临同样的问题。 由N-gram 构成的倒排索引的优缺点 与由词素构成的倒排索引不同,由N-gram 构成的倒排索引不会产生检索遗漏问题。也就是说,在由N-gram 构成的倒排索引中,基本上只要查询包含在文档中,就一定能找得到①。 但是,从刚刚的“全文搜索引擎”的例子中也能看出来,相比于词素解析,在同一个文档中使用N-gram 产生的词元通常较多。因此,词典和倒排文件的尺寸自然也就更大,从而导致构建处理和搜索处理的速度下降。而且,由于N-gram 并不考虑单词的界限,所以在由N-gram 构成的倒排索引中,会发生检索“华山”,却也能找到包含“九华山”的文档这样的问题。 在开发搜索引擎的过程中,重要的是根据文档的特性灵活运用这两种分割方法。为了体现出运用上的灵活性,我们需要设计出不依赖句子分割方法的搜索引擎。例如,可以不以从文档的开头数是第几个词元为基础,而是以从文档的开头数是第几个字符为基础来构建倒排项。 ----—————— ① 要想能够检索到少于N 个字符的字符串,通常需要事先制作由M-gram(M < N)构成的倒排索引。 ——————————