一个StringToken解析器,它赋予Google搜索样式"我们是不是要:"

时间:2020-03-06 14:44:48  来源:igfitidea点击:

寻求一种方法来:

在字符串中使用空格分隔的标记;返回建议的单词

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