今天我们想强调中文搜索功能的挑战。在这篇文章中,我们将探讨CJK语言(中文、日文和韩文)实现全文搜索的主要困难,以及如何借助Manticore Search来克服这些困难。
中文搜索的困难
中文属于所谓的CJK语言家族(中文、日文和韩文)。它们可能是最复杂的全文搜索实现语言,因为在这些语言中,词义严重依赖于众多汉字的变化及其顺序,并且字符并未拆分为单词。
中文语言的具体特征:
- 中文汉字没有大写或小写之分。无论上下文如何,它们只有一个概念。
- 字母没有像阿拉伯文那样的其他装饰。
- 句子中的单词之间没有空格。
那么问题是什么呢?为了在全文搜索中找到确切匹配,我们面临分词的挑战,而分词的主要任务是将文本分解为用户可以搜索的低级值单元。
中文的分词/分段
更具体地说,分词是将一段有意义的数据(例如一个词)转换为一个唯一标识符,称为标记(token),该标记代表系统中的一段数据。在全文搜索引擎中,标记作为对原始数据的引用,但不能用于推测这些实际值。
在大多数语言中,我们使用空格或特殊字符将文本划分为片段。然而,在中文和其他CJK语言中,由于它的形态特性,这一点是不可行的。不过,我们仍然需要完成这项工作。这个过程称为分段。
换句话说,对于中文来说,分段是分词的前提条件。
以下是展示英语和中文分词差异的示例。
正如您所看到的,中文句子短了一半,没有空格、逗号,甚至没有拆分成单词,每个词由一个或多个汉字表示。以下是定量比较:
另一个挑战是,中文汉字可能根据其顺序和组合有不同的含义。让我们看看汉字组合的不同含义:
在这里,我们可以看到两个汉字“简单”的组合,它的意思是“简单性”,但是如果分别取每个汉字,它们的含义会不同:“简”(简单)和“单”(单一)
在某些情况下,取决于您在单词之间放置边界的位置,含义可能会有所不同。例如:
正如您所看到的,问题是字符组可以有不同的分隔方式,导致不同的值。
让我们看看解决中文分词/分段问题的可能方法。
实现方法
对于中文文本分段,有几种方法,但主要两种是:
- N-gram:将“N”个相邻中文字符的重叠组视为标记,其中“N”可以是1-单字;2-双字;3-三字;等等“-gram”。
- 基于词典:基于词典执行单词分段。
中文文本分段的最简单方法是假设使用N-gram。算法相对简单,但众所周知质量不足,并且随着被处理文本的长度增加带来相当大的开销,因为每个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_chinese
charset_table = cjk / chinese
互动课程
尝试一下我们的课程,看看它是如何工作的
<img src="ICU_course-1-optimized.webp" alt="img">
如果您尝试我们的“ ICU中文文本分词”互动课程,您可以了解更多关于中文分词的信息,该课程具有命令行以便于学习。