A StringToken Analisador que dá Google Search estilo “Você quis dizer:” Sugestões

StackOverflow https://stackoverflow.com/questions/135777

  •  02-07-2019
  •  | 
  •  

Pergunta

Buscando um método para:

Leve espaços separados fichas numa cadeia; retornar um sugeriu Palavra


ou seja:
Google Search pode tomar "nterpreterr wrd fonetic" ,
e no topo da página de resultados mostra "Você quis dizer: intérprete palavra fonética"

Uma solução em qualquer um dos C * idiomas ou Java seria preferível.


Existem quaisquer bibliotecas abertas existentes que realizam essa funcionalidade?

Ou há uma maneira de utilizar a API do Google para solicitar uma palavra sugerida?

Foi útil?

Solução

Em seu artigo Como escrever um Spelling Corrector , discute Peter Norvig como um Google- como corretor ortográfico poderia ser implementado. O artigo contém uma implementação de 20 linhas em Python, bem como links para vários reimplementações em C, C ++, C # e Java. Aqui está um trecho:

Os detalhes completos de um de força industrial corrector feitiço como o Google de seria mais confuso que ilumina, mas eu percebi que sobre a viagem de avião para casa, em menos de uma página de código, eu poderia escrever um brinquedo corrector de ortografia que atinge 80 ou 90% de precisão a uma velocidade de processamento de pelo menos 10 palavras por segundo.

Usando o código e este texto como conjunto de treinamento, eu recebo os seguintes resultados:

>>> import spellch
>>> [spellch.correct(w) for w in 'fonetic wrd nterpreterr'.split()]
['phonetic', 'word', 'interpreters']

Outras dicas

Você pode usar o serviço web yahoo aqui: http://developer.yahoo.com/search/web/V1/spellingSuggestion. html

No entanto é apenas um serviço web ... (ou seja, não há APIs para outra língua etc ..), mas ele gera JSON ou XML, então ... muito fácil de se adaptar a qualquer idioma ...

Você também pode usar a API do Google é a verificação ortográfica. Existe uma implementação ASP aqui (eu não sou a crédito para isso, embora).

Primeiro:

Use a uma de sua escolha. Eu suspeito que executa a consulta contra um motor de verificação ortográfica com um limite de palavras de exatamente um, então não faz nada se toda a consulta é válida, caso contrário, ele substitui cada palavra com melhor correspondência que de palavra. Em outras palavras, o seguinte algoritmo (um vazio meio de cordas de retorno que a consulta não tinha problemas):

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;
}

Uma vez que ninguém ainda mencionou isso, eu vou dar mais uma frase para pesquisar: "editar distância" (por exemplo, link texto ). Isso pode ser usado para localizar correspondências mais próximos, assumindo que é erros de digitação, onde as letras são transpostas, em falta ou adicionados.

Mas, geralmente, este também é acoplado com algum tipo de informação de relevância; quer por popularidade simples (para assumir mais comumente usado fósforo perto o suficiente é mais provável palavra correta), ou por probabilidade contextual (palavras que se seguem anterior palavra correta, ou vêm antes de um). Este fica em recuperação de informação; Uma maneira de começar é a olhar para bigram e trigramas (sequências de palavras vistos juntos). Google tem muito extensos conjuntos de dados disponíveis gratuitamente para estes.

Para solução inicial simples embora um par dicionário com matchers baseados em Levenshtein funciona surpreendentemente bem.

Você pode ligar Lucene, que tem uma facilidade dicionário implementar o método de distância Levenshtein.

Aqui está um exemplo do Wiki, onde 2 é a distância.

String[] l=spellChecker.suggestSimilar("sevanty", 2);
//l[0] = "seventy"

Se você tiver um dicionário armazenado como um trie, há uma maneira bastante simples para encontrar entradas melhor de correspondência, onde os personagens podem ser inseridos, eliminados ou substituídos.

void match(trie t, char* w, string s, int budget){
  if (budget < 0) return;
  if (*w=='\0') 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);
}

A idéia é que primeiro você chamá-lo com um orçamento de zero, e ver se ele imprime nada de fora. Em seguida, tente um orçamento de 1, e assim por diante, até que ele imprime algumas partidas. Quanto maior o orçamento mais tempo demora. Você pode querer ir apenas até um orçamento de 2.

Adicionado: Não é muito difícil de estender isso para lidar com prefixos e sufixos comuns. Por exemplo, Inglês prefixos como "un", "anti" e "dis" pode estar no dicionário, e pode então ligar de volta para o topo do dicionário. Para sufixos como "ismo", "'s", e 'Ed' pode haver uma trie separado contendo apenas os sufixos, ea maioria das palavras pode conectar-se a que trie sufixo. Em seguida, ele pode lidar com palavras estranhas como "antinationalizationalization".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top