单词之间没有空格的语言中的分词符(例如,亚洲)?

我想让MySQL全文搜索适用于日语和中文文本,以及任何其他语言。问题是这些语言以及可能其他语言的单词之间通常没有空格。当您必须键入与文本中相同的句子时,搜索没有用处。

我不能在每个字符之间放一个空格,因为英语也必须起作用。我想用PHP或MySQL解决这个问题。

我可以配置MySQL来识别应该是他们自己的索引单元的字符吗?有没有一个PHP模块可以识别这些字符,所以我可以在它们周围为索引抛出空格?

更新

部分解决方案:

$string_with_spaces =
  preg_replace( "/[".json_decode('"\u4e00"')."-".json_decode('"\uface"')."]/",
  " $0 ", $string_without_spaces );

这使得至少一些我需要特别对待的角色类。我可能应该提到,对索引文本进行大量讨论是可以接受的。

有谁知道我需要插入空格的所有字符范围?

另外,必须有一种更好的,可移植的方式来表示PHP中的这些字符吗?Literal Unicode中的源代码并不理想;我不会认出所有的角色;它们可能无法在我必须使用的所有计算机上进行渲染。


答案 1

所提及语言的分词需要一种语言方法,例如使用字典以及了解基本词干规则的方法

我听说过相对成功的全文搜索应用程序,它们简单地将每个字符拆分为一个单独的单词,在中文中,只需应用最终用户提供的搜索条件的相同“标记化”。然后,搜索引擎为以与搜索条件相同的顺序提供字符单词的文档提供更好的排名。我不确定这是否可以扩展到日语等语言,因为Hirakana和Katagana字符集使文本更类似于具有短字母表的欧洲语言。

编辑
资源
这个分词问题,以及相关的问题,是如此的不平凡,以至于整本书都写了关于它。例如,请参阅CJKV信息处理(CJKV代表中文,日语,韩语和越南语;您也可以使用CJK关键字,因为在许多文本中,不讨论越南语)。另请参阅 日语中的分词对于这个主题的单页游戏来说很难。
可以理解的是,涵盖此主题的大多数材料都是用一种基本的母语编写的,因此对于没有相对流利这些语言的人来说,使用有限。出于这个原因,并且为了帮助您在开始实现分词系统逻辑后验证搜索引擎,您应该寻求一两个母语人士的帮助。

各种想法
识别系统地暗示分词符(例如引号,括号,类似连字符的字符等)的字符的想法是好的,这可能是一些专业级分词器使用的启发式方法。然而,你应该为这样的列表寻找一个权威的来源,而不是根据轶事发现从头开始组装一个。
一个相关的想法是在假名到汉字的过渡中打破单词(但我猜不是相反),可能在平假名到片假名的过渡中,反之亦然。
与分词本身无关,索引可能受益于将每个(例如)平假名字符系统地转换为相应的片假名字符。只是一个没有受过教育的想法!我对日语的了解还不够多,不知道这是否会有所帮助。从直觉上讲,它大致类似于系统地将重音字母等转换为相应的非重音字母,就像几种欧洲语言一样。

也许我之前提到的系统地索引单个字符(并根据它们与搜索条件的接近顺序对搜索结果进行排名)的想法可以稍微改变一下,例如通过将连续的假名字符放在一起,然后使用其他一些规则......并产生一个不完美但足够实用的搜索引擎。

如果不是这种情况,请不要失望...如前所述,这远非微不足道,从长远来看,通过暂停并阅读一两本书,它可以节省您的时间和金钱。尝试学习更多“理论”和最佳实践的另一个原因是,目前你似乎专注于分词,但很快,搜索引擎也可能从词干意识中受益;事实上,这两个问题至少在语言上是相关的,并且可能受益于串联处理。

祝你好运,这个令人烦恼但值得的努力。


答案 2

一年后,您可能不再需要它,但以下页面上的代码可能有一些提示,说明您想要执行的操作:

http://www.geocities.co.jp/SiliconValley-PaloAlto/7043/spamfilter/japanese-tokenizer.el.txt

如果您在自己的搜索中发布上述帖子后取得了任何进展,我相信其他人会有兴趣知道。

(编辑说这里有一个更好的答案:如何将日语字符分类为汉字或假名?)


推荐