NLTK El sinónimo más común (Wordnet) para cada palabra

¿Hay alguna manera de encontrar el sinónimo más común de una palabra con NLTK? Me gustaría simplificar una oración usando los sinónimos más comunes de cada palabra.

Si una palabra utilizada en la oración ya es la palabra más común de su grupo de sinónimos, no debe cambiarse.

Digamos que “Hola” es más común que “Hola”; “Querido” es más común que “Valorado”; y “Amigo” ya es la palabra más común de su grupo os sinónimos.

Input: "Hello my valued friend" Return: "Hi my dear friend" 

Los sinónimos son complicados, pero si está comenzando con un sincronismo desde Wordnet y simplemente quiere elegir el miembro más común en el conjunto, es bastante sencillo: simplemente cree su propia lista de frecuencias a partir de un corpus, y busque cada miembro del sincronizar para elegir el máximo.

El nltk le permitirá construir una tabla de frecuencia en solo unas pocas líneas de código. Aquí hay uno basado en el corpus de Brown:

 from nltk.corpus import brown freqs = nltk.FreqDist(w.lower() for w in brown.words()) 

A continuación, puede buscar la frecuencia de una palabra como esta:

 >>> print(freqs["valued"]) 14 

Por supuesto, necesitará hacer un poco más de trabajo: contaría las palabras por separado para cada una de las partes principales del discurso (wordnet proporciona n , v , a y r , noun , verb , adjective y adverb resp.), Y use estas frecuencias específicas de POS (después de ajustar las diferentes notaciones de conjunto de tags) para elegir el sustituto correcto.

 >>> freq2 = nltk.ConditionalFreqDist((tag, wrd.lower()) for wrd, tag in brown.tagged_words(tagset="universal")) >>> print(freq2["ADJ"]["valued"]) 0 >>> print(freq2["ADJ"]["dear"]) 45 

Los sinónimos son un área de trabajo enorme y abierta en el procesamiento de lenguaje natural.

En su ejemplo, ¿cómo se supone que el progtwig sepa cuáles son los sinónimos permitidos? Un método podría ser mantener un diccionario de conjuntos de sinónimos para cada palabra. Sin embargo, esto puede tener problemas debido a la superposición de partes del habla : “querido” es un adjetivo, pero “valorado” puede ser un adjetivo o un verbo en tiempo pasado.

El contexto también es importante: el bigtwig “amigo querido” puede ser más común que “amigo valioso”, pero “cliente valioso” sería más común que “cliente querido”. Por lo tanto, el sentido de una palabra dada también debe tenerse en cuenta.

Otro método podría ser simplemente mirar todo y ver qué palabras aparecen en contextos similares. Sin embargo, necesita un gran corpus para que esto sea efectivo, y tiene que decidir qué tamaño de ventana de n-gtwigs desea utilizar (¿un contexto de bigtwig? ¿Un contexto de 20 gramos?).

Te recomiendo que eches un vistazo a las aplicaciones de WordNet ( https://wordnet.princeton.edu/ ), que fue diseñada para ayudar a resolver algunas de estas cosas. Desafortunadamente, no estoy seguro de que encuentres la manera de “resolver” los sinónimos por tu cuenta, ¡pero sigue buscando y haciendo preguntas!

Edición : debería haber incluido este enlace a una pregunta anterior también:

Cómo obtener sinónimos de nltk WordNet Python

Y la documentación de NLTK en su interfaz con WordNet:

http://www.nltk.org/howto/wordnet.html

Sin embargo, no creo que estos respondan a su pregunta, ya que WordNet no tiene estadísticas de uso (que dependen del corpus que usa). Sin embargo, deberías poder aplicar sus synsets en un método como el anterior.

La otra respuesta te muestra cómo usar sinónimos:

 wn.synsets('small') [Synset('small.n.01'), Synset('small.n.02'), Synset('small.a.01'), Synset('minor.s.10'), Synset('little.s.03'), Synset('small.s.04'), Synset('humble.s.01'), Synset('little.s.07'), Synset('little.s.05'), Synset('small.s.08'), Synset('modest.s.02'), Synset('belittled.s.01'), Synset('small.r.01')] 

Ahora sabes cómo obtener todos los sinónimos para una palabra. Esa no es la parte difícil. La parte difícil es determinar cuál es el sinónimo más común. Esta pregunta es altamente dependiente del dominio. Sinónimo más común donde? ¿En literatura? ¿En vernáculo común? En lenguaje técnico?

Al igual que usted, quería hacerme una idea de cómo se usaba el idioma inglés. Descargué 15,000 libros enteros de ( Proyecto Gutenberg ) y procesé las frecuencias de pares de palabras y letras en todos ellos. Después de ingerir un corpus tan grande, pude ver qué palabras se usaban con mayor frecuencia. Sin embargo, como dije anteriormente, dependerá de lo que intentes procesar. Si es algo así como las publicaciones de Twitter, intente ingerir un montón de tweets. Aprende de lo que tienes que procesar eventualmente.