今天,我们与 Meilisearch 的 Rust 开发者之一 Many 坐下来,谈论他一直在做的有关 Charabia 的工作,以提升 Meilisearch 的语言支持。
一些历史背景
虽然 Many 第一次接触 Meilisearch 的语言解析是在两年前,但他直到 2021 年底才开始专注于分词。你可能想知道:什么是分词?Many 告诉我们,这是索引文档时最重要的步骤之一,简而言之,就是将搜索词分解成我们的引擎可以更高效地处理的单元。Meilisearch 引擎中负责分词的部分称为分词器。
Many 认为我们处理不同语言内容的方式效率不高,即使 Meilisearch 已经能够很好地处理英语和法语等语言,但对于其他语言组来说却并非如此。Many 解释说,这很大程度上取决于我们在不同语言中输入的方式,以及我们在这些语言中写作时出错的不同方式。例如,日语或汉语中的一个错别字可能遵循与意大利语或葡萄牙语中的错别字不同的逻辑。
不同的视角
Many 立即意识到一个主要问题:我们 Meilisearch 不可能掌握世界上所有的语言,并且独自提升我们的分词器。幸运的是,开源社区是一个多元化且乐于助人的群体,其中来自世界各地的人们精通多种语言,是我们可能无法命名的。因此,Many 的重点从直接提升语言支持转向尽可能简单且无痛地做出贡献。
提升我们分词器中的语言支持主要涉及两个方面。首先,我们可以改进分段,这意味着理解一个词从哪里开始,从哪里结束。
“对于英语或欧洲语言的使用者来说,这似乎很明显:“在空格处拆分即可得到你的词!“;但当你遇到其他类型的语言(如汉语)时,就会变得更加困难,因为汉语字符之间没有明确的分隔符”
其次,我们可以改进规范化,它涵盖规范修改(大写或小写)、兼容等效(以不同形式识别同一个字符;例如:ツ 和 ッ)、以及音译(从一种字母表转换为另一种字母表,例如:西里尔字母转换为拉丁字母)——我们尽可能避免最后一种情况,因为它通常会导致信息丢失。
“这里也是一样的,每种语言都有其特殊性,我们需要针对每种语言调整规范化。以大小写为例:拉丁字母有两种形式,一种是大写形式,另一种是小写形式,但这种特殊性并不适用于世界上所有语言!”
因此,Many 的工作与其说是编写大量代码,不如说是研究和理解特定语言的来龙去脉,以便他可以判断贡献是否能够很好地与 Meilisearch 配合。
他解释说:
“这一切归结于传统翻译与信息检索 (IR) 领域之间的对比。翻译专注于保持意义,而 IR 可以不那么严格,并考虑到拼写错误等错误。专注于 IR 而不是翻译,使我们能够提供在翻译工作中可能无关紧要的搜索选项。”

如果用户输入“mais”,他们将看到与“but”和“corn”相关的结果,因为 Meilisearch 会考虑到用户可能忘记或只是不想在输入时使用适当的重音符号。
因此,每当我们希望提升对某种语言的支持时,不仅仅是让合适的语言专家为我们的项目做出贡献。它还涉及 Many 方面的大量研究时间投入,以便他能确定对特定语言的分词过程的更改是否会返回更相关的搜索结果。
我们目前已经针对哪些语言进行了改进?
正如你可能在我们的 关于 v0.29 版本发布的博客文章中读到的一样,在过去的两个月中,我们在提升对泰语的支持方面做了大量工作。这是一个我们非常自豪的功能,它得益于开源社区的贡献。不过,还有很大的提升空间:Meilisearch 中的泰语分段很棒,但规范化仍然需要改进。
我们最近还改进了 Meilisearch 的希伯来语规范化。在此之前,我们在日语分段方面取得了很大的进步,但希望完善日语规范化,以更好地解决ツ 和 ッ或 ダメ 和 だめ 之间的差异。
目前,Many 对汉语分词非常感兴趣,汉语本身也存在着一系列挑战。例如,汉语有多种变体,具体取决于其使用地点:普通话、中国大陆的各种地区用法和粤语,仅举几例。虽然所有这些变体在很大程度上共享相同的字符和含义,但它们并不总是以相同的方式使用,可能对应于不同的发音,因此每个人输入的方式也不尽相同,所有这些在 IR 方面都非常棘手。在这一点上,我们无法进行竞争性规范化,因此我们基于用户最多的方言进行规范化。

未来的雄心
容纳同一语言的竞争性规范化(对同一语言的多语言变体的容忍)是 Many 目前最优先考虑的事项之一。
他还认为,我们支持的语言数量太少,因此一个重要的步骤是制定策略,让更多贡献者参与进来。你可能会问:Many 想接下来关注哪些语言?他告诉我们,这是一个复杂的选择:他需要权衡自己的个人喜好、贡献者提出的语言,以及基于语言的使用者数量的战略选择。
他解释说,并非所有语言都是平等的。一些语言更容易处理:例如,像土耳其语这样的粘着语可能就是下一个! “但是,如果贡献者希望推广他们的语言,我们很乐意考虑他们的建议并重新确定优先级。”Many 确信地说。
下一个列表:解析重音符号、变音符号和其他非间距符号。还记得我们之前提到的“maïs”和“mais”示例吗?在这一点上,分词器只是简单地删除重音符号,但有些用户可能希望考虑这些变音符号。Many 表示,实现这一点在技术上并不复杂:简而言之,它需要建立两个不同的规范化过程——一个松散的(忽略重音符号)和一个严格的(不忽略任何内容)。挑战在于将它们整合在一起,而不会导致搜索速度大幅下降或索引大小增加一倍。
我如何做出贡献?
想帮忙吗?你可以通过多种方式做出贡献,其中很多与编码无关
- 点赞讨论:这有助于 Many 优先考虑某个特定主题或语言
- 在 GitHub 上创建问题,说明你遇到的语言相关问题:例如,如果你注意到当你搜索某个特定单词或短语时,Meilisearch 返回了错误的结果
- 精通某种语言?我们很乐意倾听你对创建分段器和规范器时的挑战和可能解决方案的看法
- 提出分词库:了解你喜欢的并且认为对于特定语言非常有效的现有工具非常有用
- 提交 PR 解决你在使用 Meilisearch 与特定语言时遇到的问题。提示:在 PR 本身或GitHub 问题中清楚地解释问题和解决方案,可以大大提高你的贡献被接受的可能性
如果你正在参加Charabia 存储库中列出的问题的大部分问题都符合该活动的要求!没有相应问题的 PR 也是受欢迎的——如果你的贡献被接受,我们很乐意将其标记为“hacktoberfest 已批准”。
最后但并非最不重要的一点是:没有社区提供的宝贵意见,我们的工作将无法完成。非常感谢你们所有的努力和慷慨!