分割单词,并对文本中的带连字符和撇号单词进行分组

pho*_*xis 5 text-processing information-retrieval

我需要从文本中分割单词.有时候带连字符的单词是在没有连字符的情况下编写的,撇号单词是在没有撇号的情况下写成的.还有类似的问题,例如相同单词的不同拼写问题(例如:颜色,颜色)或单个单词,它们之间用空格写入(例如:up,upto,blankspace,blank space).我需要将这些变体分组为单个表示形式,并将其插入到set/hashmap或其他位置.对于没有重音字符的重音字符单词也可能存在问题(尽管我还没有面对它们).目前,在任何空白字符和每个非字母数字处切割单词,然后将其截止,并省略停用单词.

这些索引稍后将用于文档相似性检查和搜索等.任何建议如何解决这些问题?我想到了将扫描的单词与单词表匹配的想法,但问题是专有的名词和非词典单词将被省略.

信息:我的代码是Java

Rug*_*man 3

我认为你应该结合使用多种技术。

1)对于常见的拼写变体,我会使用基于字典的方法。由于它们很常见,我不会担心会丢失非字典单词。这应该可以解决颜色/颜色问题。

2) 对于拼写错误和其他非标准拼写变体,您可以应用 Metaphone (http://en.wikipedia.org/wiki/Metaphone) 算法将标记转换为其英语发音的表示。类似的变体听起来很相似,因此您可以将它们相互匹配(例如,Jon 到 John)。您还可以在查询过程中使用基于编辑距离的匹配算法来匹配非常相似的标记,仅包含一对并置的字符或删除一个字符(例如,Huseyin 与 Housein)。

3) 对于撇号和中间有连字符的复合词,您可以存储两种变体。例如,“John's”将被索引为“John s”和“Johns”。“blank-space”可以转换为(或一起存储)“blank space”和“blankspace”。

4)对于中间没有任何连字符的复合词,您可以使用外部库,例如Solr的HyphenationCompoundWordTokenFilterFactory类(http://lucene.apache.org/solr/api/org/apache/solr/analysis/HyphenationCompoundWordTokenFilterFactory.html) 。虽然它可以使用字典,但不是必须的。它的目标是处理德语和类似语言中经常遇到的复合词。我认为没有理由不能将其应用于英语(您需要提供英语词典和连字符规则文件)。

事实上,最后一点提出了一个重要的问题。我不认为您准备从头开始构建自己的搜索库。如果这是真的,为什么不使用 Lucene(或基于 Lucene 的 Solr),这是一个基于 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)

您还需要决定在何时处理这些问题:一种极端的方法是在索引过程中对这些术语的所有可能变体进行索引,并按原样使用查询。这将使您的查询处理保持轻松,但会花费您更大的索引(因为您需要存储所有变体)。另一个极端是按原样索引文档并在搜索过程中扩展查询。这将使您能够以更繁重的查询处理为代价来保持索引的精简。语音索引需要您在索引期间处理文档并在搜索期间处理查询。模糊匹配仅在搜索期间才可行,因为您可能无法在索引中存储所有术语的所有编辑变体。