一个StringToken解析器,它赋予Google搜索样式"我们是不是要:"
寻求一种方法来:
在字符串中使用空格分隔的标记;返回建议的单词
IE:
Google搜索可以使用" fonetic wrd nterpreterr",
在结果页面的顶部显示"意思是:语音单词解释器"
最好使用任何C *语言或者Java解决方案。
是否存在执行此类功能的现有开放库?
还是有一种利用Google API来请求建议单词的方法?
解决方案
我们可以在此处使用yahoo Web服务:
http://developer.yahoo.com/search/web/V1/spellingSuggestion.html
但是,这只是一个Web服务...(即没有其他语言的API等。)但是它输出JSON或者XML,因此...很容易适应任何语言...
我们还可以使用Google API进行拼写检查。这里有一个ASP实现(不过,我不认为这很值得)。
首先:
- 爪哇
- C ++
- C#
使用选择之一。我怀疑它是针对一个单词限制为一个的拼写检查引擎运行查询的,如果整个查询都有效,则它什么都不做,否则它将用该单词的最佳匹配替换每个单词。换句话说,使用以下算法(返回字符串为空意味着查询没有问题):
startup() { set the spelling engines word suggestion limit to 1 } option 1() { int currentPosition = engine.NextWord(start the search at word 0, querystring); if(currentPosition == -1) return empty string; // Query is a-ok. while(currentPosition != -1) { queryString = engine.ReplaceWord(engine.CurrentWord, queryString, the suggestion with index 0); currentPosition = engine.NextWord(currentPosition, querystring); } return queryString; }
如果我们将字典存储为特里字典,则有一种相当简单的方法来查找最匹配的条目,可以在其中插入,删除或者替换字符。
void match(trie t, char* w, string s, int budget){ if (budget < 0) return; if (*w=='The full details of an industrial-strength spell corrector like Google's would be more confusing than enlightening, but I figured that on the plane flight home, in less than a page of code, I could write a toy spelling corrector that achieves 80 or 90% accuracy at a processing speed of at least 10 words per second.') print s; foreach (char c, subtrie t1 in t){ /* try matching or replacing c */ match(t1, w+1, s+c, (*w==c ? budget : budget-1)); /* try deleting c */ match(t1, w, s, budget-1); } /* try inserting *w */ match(t, w+1, s + *w, budget-1); }
这个想法是,首先用零预算来调用它,然后看看它是否可以打印出任何内容。然后尝试将预算设为1,依此类推,直到打印出一些匹配项为止。预算越大,花费的时间越长。我们可能只想将预算提高到2.
补充:扩展它以处理常见的前缀和后缀并不难。例如,英语前缀(例如" un"," anti"和" dis")可以在字典中,然后可以链接回字典的顶部。对于诸如" ism"," s"和" ed"之类的后缀,可以有一个仅包含后缀的单独的trie,大多数单词都可以链接到该后缀trie。然后,它可以处理诸如"反民族化"之类的奇怪词。
彼得·诺维格(Peter Norvig)在他的文章如何编写拼写校正器中,讨论了如何实现类似于Google的拼写检查器。本文包含Python的20行实现,以及指向C,C ++和Cand Java的几种重新实现的链接。这是节选:
>>> import spellch >>> [spellch.correct(w) for w in 'fonetic wrd nterpreterr'.split()] ['phonetic', 'word', 'interpreters']
使用Norvig的代码和此文本作为训练集,我得到以下结果:
String[] l=spellChecker.suggestSimilar("sevanty", 2); //l[0] = "seventy"
由于没有人提及它,我将再提供一个短语来搜索:"编辑距离"(例如,链接文本)。
假设是拼写错误,其中的字母被转置,丢失或者添加,则可用于查找最接近的匹配项。
但是通常这还与某种相关性信息结合在一起。通过简单的流行度(假设最常用的近似匹配是最有可能的正确单词),或者通过上下文相似性(在正确单词之前或者之后的单词)。这进入了信息检索;一种开始的方法是看二元组和三元组(一起看到的单词序列)。 Google拥有非常丰富的免费数据集。
对于简单的初始解决方案,字典与基于Levenshtein的匹配器结合使用的效果出乎意料。
Google SOAP搜索API可以做到这一点。
我们可以插入Lucene,后者具有实现Levenshtein距离方法的字典功能。
这是Wiki中的示例,其中2是距离。
##代码##- http://wiki.apache.org/lucene-java/SpellChecker
- 较旧的链接http://today.java.net/pub/a/today/2005/08/09/didyoumean.html