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

时间:2009-10-22 06:26:46

标签: php full-text-search tokenize cjk wordbreaker

我想使用日文和中文文本以及任何其他语言进行MySQL全文搜索。问题是这些语言和其他语言通常不会在单词之间留有空格。如果必须键入与文本中相同的句子,则搜索无用。

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

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

更新

部分解决方案:

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

这使得一个角色类至少包含了一些我需要特别对待的角色。我应该提一下,删除索引文本是可以接受的。

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

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

2 个答案:

答案 0 :(得分:15)

上述语言的分词需要 语言方法 ,例如使用词典并理解基本 >干预规则

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

修改
资源
这个破坏问题的问题,以及相关的问题,是如此非平凡,整本书都是关于它的。参见例如CJKV Information Processing(CJKV代表中文,日文,韩文和越南文;您也可以使用CJK关键字,因为在许多文本中,不讨论越南语)。有关此主题的单页面内容,另请参阅Word Breaking in Japanese is hard 理解上,涵盖此主题的大部分材料都是用其中一种基础母语编写的,因此对于没有这些语言相对流畅性的人来说,其用途有限。出于这个原因,并且一旦您开始实施断字逻辑,还要帮助您验证搜索引擎,您应该寻求一两个母语人士的帮助。

各种想法
你想要识别系统地暗示单词破坏的字符(比如引号,括号,连字符等字符等)是好的,这可能是一些专业级别破坏者使用的启发式算法。然而,你应该寻找这种清单的权威来源,而不是根据轶事发现从头开始组装 一个相关的想法是打破假名到汉字过渡的话语(但我猜不是相反),可能是 Hiragana-to-Katakana 或反之亦然 与单词破解无关,索引可以[ - 或可能不 - ;-)]从每个平假名字符到相应的片假名字符的系统转换中受益。只是一个没有受过教育的想法!我不太了解日语,知道这是否有帮助;从直觉上来说,它可能与强调字母的系统转换类似,也就是用几种欧洲语言实践的相应的非强调字母。

也许我之前提到过的,系统地索引单个字符(以及根据搜索标准的顺序依次对搜索结果进行排名)的想法可以略微改变,例如通过将连续的假名字符保持在一起,然后其他一些规则......并产生一个不完善但足够实用的搜索引擎。

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

祝你好运但又值得努力。

答案 1 :(得分:1)

一年之后,你可能不再需要这个了,但是下一页的代码可能会提供一些你希望(ed)做的提示:

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

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

(编辑说这里有一个更好的答案: How to classify Japanese characters as either kanji or kana?