我需要从文本中分割单词。有时候带连字符的单词是在没有连字符的情况下写的,撇号单词是在没有撇号的情况下写的。还有类似的问题,例如相同单词的不同拼写问题(例如:颜色,颜色)或单个单词,它们之间用空格写入(例如:up,upto,blankspace,blank space)。我需要将这些变体分组为单个表示形式,并将其插入到set / hashmap或其他位置。对于没有重音字符的重音字符单词也可能存在问题(尽管我还没有面对它们)。目前,在任何空白字符和每个非字母数字处切割单词,然后将其截止,并省略停用单词。
这些索引稍后将用于文档相似性检查和搜索等。任何建议我如何解决这些问题?我想到了将扫描的单词与单词表匹配的想法,但问题是专有的名词和非词典单词将被省略。
信息:我的代码是Java
答案 0 :(得分:3)
我认为你应该采用一系列技术。
1)对于常见的拼写变体,我会使用基于字典的方法。由于它们很常见,我不担心错过非词典单词。这应该解决颜色/颜色问题。
2)对于拼写错误和其他非标准拼写变体,您可以应用Metaphone(http://en.wikipedia.org/wiki/Metaphone)算法将令牌转换为其英语发音的表示。类似的变体听起来很相似,因此你可以将它们相互匹配(例如,Jon to John)。您还可以在查询期间使用基于编辑距离的匹配算法来匹配非常相似的标记,只有一对字符并列或字符丢弃(例如,Huseyin与Housein)。
3)对于撇号和中间带连字符的复合词,您可以存储两个变体。例如,“John's”将被索引为“John s”和“Johns”。 “空格”可以转换为(或与“空白空间”和“空白空间”一起存储。
4)对于中间没有连字符的复合词,可以使用外部库,如Solr的HyphenationCompoundWordTokenFilterFactory类(http://lucene.apache.org/solr/api/org/apache/solr/analysis/HyphenationCompoundWordTokenFilterFactory的.html)。虽然它可以使用字典,但它没有必要。它的目标是处理德语和类似语言中经常遇到的复合词。我没有理由不能将它应用于英语(你需要提供英文字典和连字规则文件)。
实际上,最后一点提出了一个重要问题。我不认为你是从头开始构建自己的搜索库。如果这是真的,为什么不使用Lucene(或Solr,它基于Lucene),一个基于Java的搜索库,已经有方法和方法来处理这些问题?例如,注入技术允许您在文档中的相同位置索引颜色和颜色;因此,无论您是搜索“彩色汽车”还是“彩色汽车”(假设您负责清理)都没关系。有一些过滤器可以进行语音索引(http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html)。甚至还有一个FuzzyQuery组件,允许您允许一定量的编辑距离匹配相似的术语(http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/搜索/ FuzzyQuery.html)
您还需要决定在哪一点上处理这些问题:一种极端的方法是在索引期间索引这些术语的所有可能变体,并按原样使用查询。这将使您的查询处理变得轻松,但会花费您更大的索引(因为您需要存储的所有变体)。另一个极端是按原样索引文档,并在搜索期间扩展查询。这将使您能够以更重的查询处理成本来保持您的索引。语音索引要求您在索引期间处理文档,在搜索期间处理查询。模糊匹配仅在搜索时间内是可行的,因为可能您无法在索引中存储所有术语的所有编辑变体。