我需要从文本中切分单词。有时,连字符的单词不带连字符,撇号的单词不带撇号。还有类似的问题,比如相同单词的不同拼写问题(例如:颜色,颜色),或者单个单词之间有空格(例如:最多,最多,空格,空格)。我需要将这些变体分组为一个单独的表示,并将其插入到set/hashmap或其他位置。没有重音字符的重音字符单词也可能存在问题(尽管我还没有遇到过这些问题)。当前,在任何空格字符和每个非字母数字字符处剪切单词,然后对它们进行词干处理,并省略停止单词。
这些索引稍后将用于文档相似性检查和搜索等。有什么建议吗?我该如何解决这些问题?我想过一个想法,将扫描的单词与词表匹配,但问题是,专有名词和非词典单词将被省略。
信息:我的代码是Java编写的
发布于 2012-02-19 07:51:36
我认为你应该综合运用各种技术。
1)对于常见的拼写变体,我会使用基于字典的方法。因为它们很常见,所以我不会担心丢失非字典单词。这应该可以解决颜色/颜色问题。
2)对于拼写错误和其他非标准拼写变体,您可以应用变音位(http://en.wikipedia.org/wiki/Metaphone)算法将标记转换为其英语发音的表示形式。相似的变体听起来很相似,因此你可以将它们相互匹配(例如,Jon to John)。您还可以在查询过程中使用基于编辑距离的匹配算法来匹配非常相似的令牌,这些令牌只有一对字符并置或字符丢失(例如,Huseyin与Huseyin)。
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/search/FuzzyQuery.html)
您还需要决定在哪一点处理这些问题:一种极端的方法是在索引过程中索引这些术语的所有可能变体,并按原样使用查询。这将使您的查询处理保持轻量级,但将消耗更大的索引(因为您需要存储所有的变体)。另一个极端是按原样为文档编制索引,并在搜索期间扩展查询。这将允许您以更重的查询处理为代价来保持索引的精确性。语音索引将要求您在索引期间处理文档,并在搜索期间处理查询。只有在搜索期间,模糊匹配才是可行的,因为假设您不能存储索引中所有术语的所有编辑变体。
https://stackoverflow.com/questions/9293687
复制相似问题