language agnostic - propn - Un analizador StringToken que da el estilo de búsqueda de Google "Quiso decir:" Sugerencias
spacy spanish nlp (8)
Buscando un método para:
Tome tokens separados por espacios en blanco en una cadena; devolver una palabra sugerida
es decir:
La búsqueda de Google puede tomar "fonetic wrd nterpreterr" ,
y en la parte superior de la página de resultados se muestra "¿Quisiste decir: intérprete fonético de palabras"
Sería preferible una solución en cualquiera de los lenguajes C * o Java.
¿Hay alguna biblioteca abierta existente que realice dicha funcionalidad?
¿O hay una forma de utilizar una API de Google para solicitar una palabra sugerida?
Puede usar el servicio web de yahoo aquí: http://developer.yahoo.com/search/web/V1/spellingSuggestion.html
Sin embargo, es solo un servicio web ... (es decir, no hay API para otro idioma, etc.) pero genera JSON o XML, así que ... es bastante fácil de adaptar a cualquier idioma ...
También puede usar la API de Google para revisar la ortografía. Aquí hay una implementación de ASP (aunque no estoy de acuerdo con esto).
Antes que nada:
Usa el que elijas. Sospecho que ejecuta la consulta en un motor de corrección ortográfica con un límite de palabras de exactamente uno, y luego no hace nada si toda la consulta es válida, de lo contrario reemplaza cada palabra con la mejor coincidencia de esa palabra. En otras palabras, el siguiente algoritmo (una cadena de retorno vacía significa que la consulta no tuvo 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;
}
En su artículo Cómo escribir un corrector ortográfico, Peter Norvig analiza cómo se podría implementar un corrector ortográfico similar a Google. El artículo contiene una implementación de 20 líneas en Python, así como enlaces a varias reimplementaciones en C, C ++, C # y Java. Aquí hay un extracto:
Los detalles completos de un corrector ortográfico de fuerza industrial como el de Google serían más confusos que esclarecedores, pero pensé que en el vuelo de regreso a casa, en menos de una página de código, podría escribir un corrector ortográfico de juguete que logre 80 o 90% precisión a una velocidad de procesamiento de al menos 10 palabras por segundo.
Usando el código de Norvig y este texto como conjunto de entrenamiento, obtengo los siguientes resultados:
>>> import spellch
>>> [spellch.correct(w) for w in ''fonetic wrd nterpreterr''.split()]
[''phonetic'', ''word'', ''interpreters'']
Como nadie lo ha mencionado todavía, daré una frase más para buscar: "editar distancia" (por ejemplo, texto del enlace ). Eso se puede usar para encontrar las coincidencias más cercanas, suponiendo que sean errores ortográficos en los que se transponen, desaparecen o se agregan letras.
Pero generalmente esto también se combina con algún tipo de información de relevancia; ya sea por popularidad simple (para suponer que la coincidencia lo suficientemente común es lo más probable), o por probabilidad contextual (palabras que siguen a la palabra correcta anterior, o vienen antes de una). Esto entra en la recuperación de información; Una forma de comenzar es observar el bigram y los trigramas (secuencias de palabras vistas juntas). Google tiene conjuntos de datos ampliamente disponibles de forma gratuita para estos.
Para la solución inicial simple, aunque un par de diccionarios con emparejamientos basados en Levenshtein funciona sorprendentemente bien.
Las API de Google SOAP Search lo hacen.
Si tiene un diccionario almacenado como un trie, hay una forma bastante sencilla de encontrar las entradas que mejor coinciden, donde los caracteres se pueden insertar, eliminar o reemplazar.
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);
}
La idea es que primero la llames con un presupuesto de cero y veas si imprime algo. Luego pruebe un presupuesto de 1, y así sucesivamente, hasta que imprima algunas coincidencias. Cuanto más grande es el presupuesto, más tiempo lleva. Es posible que desee subir solo a un presupuesto de 2.
Agregado: no es demasiado difícil extender esto para manejar prefijos y sufijos comunes. Por ejemplo, los prefijos en inglés como "un", "anti" y "dis" pueden estar en el diccionario, y luego pueden vincularse a la parte superior del diccionario. Para sufijos como "ismo", "" s "y" ed "puede haber un trie por separado que contenga solo los sufijos, y la mayoría de las palabras pueden vincularse a ese sufijo trie. Entonces puede manejar palabras extrañas como "antinacionalización".
Puede conectar Lucene, que tiene una función de diccionario que implementa el método de distancia Levenshtein.
Aquí hay un ejemplo de Wiki, donde 2 es la distancia.
String[] l=spellChecker.suggestSimilar("sevanty", 2);
//l[0] = "seventy"