¿Cuál es la mejor manera de descubrir la similitud semántica de las palabras? Word2Vec está bien, pero no es ideal:
# Using the 840B word Common Crawl GloVe vectors with gensim:
# 'hot' is closer to 'cold' than 'warm'
In [7]: model.similarity('hot', 'cold')
Out[7]: 0.59720456121072973
In [8]: model.similarity('hot', 'warm')
Out[8]: 0.56784095376659627
# Cold is much closer to 'hot' than 'popular'
In [9]: model.similarity('hot', 'popular')
Out[9]: 0.33708479049537632
Los métodos de Wordnet de NLTK parecen simplemente rendirse:
In [25]: print wn.synset('hot.a.01').path_similarity(wn.synset('warm.a.01'))
None
¿Cuáles son otras opciones?
nlp
word-embeddings
word2vec
nltk
Thomas Johnson
fuente
fuente
Respuestas:
Word2vec no captura similitudes basadas en antónimos y sinónimos. Word2vec daría una mayor similitud si las dos palabras tienen el contexto similar. Por ejemplo, el clima en California fue _____. El espacio en blanco podría llenarse con calor y frío, por lo tanto, la similitud sería mayor. Este concepto se llama relaciones paradigmáticas.
Si está interesado en capturar relaciones como hipernimos, hipónimos, sinónimos y antónimos, deberá usar cualquier medida de similitud basada en Wordnet. Existen muchas medidas de similitud basadas en Wordnet. Puede consultar este enlace http://ws4jdemo.appspot.com/
fuente
En Text Analytic Tools for Semantic Similarity , desarrollaron un algoritmo para encontrar la similitud entre 2 oraciones. Pero si lees atentamente, encuentran la similitud de la palabra en una matriz y la suman para descubrir la similitud entre oraciones. Por lo tanto, podría ser una oportunidad para verificar la similitud de palabras.
También en SimLex-999: Evaluación de modelos semánticos con estimación de similitud (genuina) , explican la diferencia entre
association
ysimilarity
cuál es probablemente la razón de su observación también. Por ejemplo, café y una taza. No son similares pero son asociativos. Entonces, solo considerar la similitud daría un resultado diferente. Los autores sugieren varios modelos para estimarlos.fuente
Word2vec es un buen punto de partida para la mayoría de los escenarios. Se hace la semántica de captura a modo de predicción utilizando el método CBOW. Permite traducciones (como el ejemplo más repetido que puedo poner aquí de nuevo), V (Rey) - V (Reina) ~~ V (hombres) - V (mujeres) y así sucesivamente.
Entonces, ¿cuál es el problema? El problema radica en la ambigüedad del sentido de las palabras. Siempre que la palabra en sí tenga dos significados diferentes en dos contextos diferentes, la palabra vector tenderá a estar realmente lejos de cualquiera de los contextos. Python ~ Boa (ambas serpientes) y Python - Java (ambos lenguajes de programación).
Alguna alternativa?
Para el propósito muy específico de "sinónimos" si desea Wordnet sería el lugar ideal. Captura la relación explícita de dos palabras en lugar de la relación implícita basada en el uso y las ocurrencias.
Wordnet está principalmente diseñado como un diccionario, donde word2vec se extrae por el uso.
fuente
En una gramática libre de contexto, creo que es realmente imposible determinar la cercanía de las palabras. Lo que puede hacer es usar vectores de léxico y luego, si una palabra tiene valores cercanos entre dos léxicos, entonces el valor debe estar cerca.
fuente