18

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

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

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

更新

部分解决方案:

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

这使得至少有一些我需要特别对待的字符组成了一个字符类。我可能应该提一下,对索引文本进行调整是可以接受的。

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

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

4

2 回答 2

17

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

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

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

各种想法
识别系统地暗示断词的字符(比如引号、括号、类似连字符的字符等)的想法很好,这可能是一些专业级断词器使用的一种启发式方法。但是,您应该为此类列表寻求权威来源,而不是根据轶事发现从头开始组装。
一个相关的想法是在假名到汉字的转换中断词(但我猜不是相反),可能在平假名到片假名或反之亦然的转换中。
与分词无关,索引可能[-或可能不-;-)]受益于每个平假名字符到相应片假名字符的系统转换。只是一个没有受过教育的想法!我对日语知之甚少,不知道这是否有帮助;直观地说,这将类似于将重音字母等系统转换为相应的非重音字母,就像在几种欧洲语言中实践的那样。

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

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

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

于 2009-10-22T06:43:05.797 回答
1

一年后,您可能不再需要这个,但下一页上的代码可能会提示您想要(ed)做什么:

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

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

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

于 2010-10-15T05:35:33.250 回答