今天,我们想强调中文搜索功能的挑战。在本文中,我们将探讨CJK语言(中文、日文和韩文)全文搜索实现的主要困难,以及如何借助Manticore Search克服这些困难。
中文搜索的困难
中文属于所谓的CJK语言家族(中文、日文和韩文)。它们可能是实现全文搜索最复杂的语言,因为在这些语言中,词义严重依赖于大量汉字变体及其序列,而字符本身并未被分隔成单词。
中文语言的特性:
- 中文汉字没有大小写之分。它们只有一个概念,无论上下文如何。
- 没有像阿拉伯语那样的字母附加装饰。
- 句子中的单词之间没有空格。
那么问题出在哪里?要在全文搜索中找到精确匹配,我们必须面对分词的挑战,其主要任务是将文本分解为可以被用户搜索的低级值单元。
中文的分词/分段
具体来说,分词是将有意义的数据片段(例如一个词)转换为称为标记的唯一标识符的过程,该标识符代表系统中的数据片段。在全文搜索引擎中,标记作为原始数据的参考,但不能用来猜测实际值。
在大多数语言中,我们使用空格或特殊字符将文本分割成片段。然而,由于中文和其他CJK语言的形态学特性,这是不可能的。然而,我们仍然需要这样做。这个过程称为分段。
换句话说,对于中文来说,分段是分词的前提条件。
以下是一个示例,展示了英文和中文分词之间的差异。

如你所见,中文句子长度是英文的一半,没有空格、逗号,甚至没有被分割成单词,每个词在这里由一个汉字或几个汉字表示。以下是定量比较:

另一个挑战是,中文汉字可能根据其序列和组合具有不同的含义。让我们看看汉字组合的不同含义:

在这里,我们可以看到两个汉字“简单”组合在一起表示“简单性”,但如果单独使用每个汉字,它们将有不同的含义:“简”(简单)和“单”(单一)。
在某些情况下,根据你放置的单词边界,含义可能会有所不同。例如:

如你所见,问题在于一组字符可以被分割成不同的部分,从而产生不同的值。
让我们看看解决中文分词/分段问题的可能方法。
实现
中文文本分段有几种方法,但主要的两种是:
- N-grams:将“N”个相邻的中文字符重叠组视为标记,其中“N”可以是1 - 单字;2 - 双字;3 - 三字;依此类推“-grams”。
- 基于字典:根据字典进行分词。
中文文本分段最简单的方法是使用N-grams。该算法简单直接,但已知质量较差,并且随着处理文本长度的增加,会产生相当大的开销,因为每个N-gram都是一个单独的标记,这会使标记字典更大,并使搜索查询的处理更加复杂。历史上,这是Manticore Search中CJK文本索引的常用方法。
在Manticore Search 3.1.0版本中,引入了一种新的中文文本分段方法,该方法基于ICU文本分段算法,遵循第二种方法 - 基于字典的分段。
使用ICU的优势
ICU是一组提供Unicode和全球化支持的开源库。除了许多其他功能外,它还解决了文本边界确定的任务。ICU算法可以定位文本范围内的单词、句子、段落位置,或识别适合文本显示时换行的位置。
ICU分段在Manticore中的工作原理可以简要描述如下:
- 原始文本被视为符号数组。
- 然后Manticore遍历数组,如果发现一组中文符号,就将其传递给ICU库进行处理。
- 分段后的中文文本部分将替换原始的未分段部分。
- 其他自然语言处理算法( charset_table , wordforms 等)会像在常见的分段工作流程中一样应用于修改后的文本。
要启用ICU-中文分段,必须设置以下索引配置选项:
morphology = icu_chinesecharset_table = cjk / chinese
互动课程
尝试在我们的课程中了解其工作原理
<img src="ICU_course-1-optimized.webp" alt="img">
如果你想了解更多关于中文分词的内容,可以尝试我们的“ICU-中文文本分词”互动课程,该课程包含命令行以方便学习。
