⚠️ 此页面为自动翻译,翻译可能不完美。
blog-post

New way of tokenization of Chinese

今天,我们想强调中文搜索功能的挑战。在本文中,我们将探讨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_tablewordforms 等)会像在常见的分段工作流程中一样应用于修改后的文本。

要启用ICU-中文分段,必须设置以下索引配置选项:

  • morphology = icu_chinese
  • charset_table = cjk / chinese

互动课程

尝试在我们的课程中了解其工作原理

<img src="ICU_course-1-optimized.webp" alt="img">

如果你想了解更多关于中文分词的内容,可以尝试我们的“ICU-中文文本分词”互动课程,该课程包含命令行以方便学习。

安装Manticore Search

安装Manticore Search