2016-07-08 1 views
5

Une pratique particulière du langage naturel consiste à calculer la similarité entre deux mots en utilisant WordNet. Je commence ma question avec le code python suivant:Comment calculer la similarité des mots anglais qui n'apparaissent pas dans WordNet?

from nltk.corpus import wordnet 
sport = wordnet.synsets("sport")[0] 
badminton = wordnet.synsets("badminton")[0] 
print(sport.wup_similarity(badminton)) 

Nous aurons 0,8421

Maintenant, si je cherche "haha" et "lol" comme suit:

haha = wordnet.synsets("haha") 
lol = wordnet.synsets("lol") 
print(haha) 
print(lol) 

Nous allons obtenir

[] 
[] 

Ensuite, nous ne pouvons pas considérer la similitude entre eux. Que pouvons-nous faire dans ce cas?

+1

Quel genre de la similitude essayez-vous de calculer? Similitude sémantique? Vous ne serez pas en mesure de le calculer sans une sorte de base de données de significations de mots (comme WordNet). – BrenBarn

+0

Que voulez-vous dire? J'utilise déjà WordNet, la similitude est calculée en utilisant Wu-Palmer Similarity. S'il vous plaît, lisez attentivement le code. –

+0

Jetez un oeil à la tâche STS: http://alt.qcri.org/semeval2016/task1/ Et une prise éhontée: https://github.com/alvations/stasis – alvas

Répondre

6

Vous pouvez créer un espace sémantique à partir des matrices de cooccurrences à l'aide d'un outil comme Disséquer(DIStributional SEmantics Composition Toolkit) et vous sont fixés pour mesurer la similarité sémantique entre les mots ou expressions (si vous rédigez des mots).

Dans votre cas pour ha et lol vous devez recueillir les cooccurrences.

Une autre chose à essayer est word2vec.

+0

Pouvez-vous affiner à quelques conseils ou quelques démarrages points que je peux me chercher? –

+1

Je pense qu'un point de départ facile est simplement de calculer des collocations bigram à partir de votre ensemble de données, c'est-à-dire quel mot apparaît très fréquemment à côté d'un autre mot. Vous constaterez ensuite que, par ex. * ha * et * lol * ont des voisins très similaires. Afaik c'est l'idée derrière [word2vec] (https://en.wikipedia.org/wiki/Word2vec) etc. – patrick

5

Il existe deux possibilités d'autres façons:

CBOW: sac continu de mot

sauter modèle gramme: Ce modèle est vice-versa du modèle CBOW

oeil à ceci: https://www.quora.com/What-are-the-continuous-bag-of-words-and-skip-gram-architectures-in-laymans-terms

Ces modèles sont bien réédités ici: https://www.tensorflow.org/tutorials/word2vec, aussi GENSIM est une bonne bibliothèque python pour faire de telles choses


Essayez de chercher Tensorflow Solutions, par exemple ceci: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py

Ou essayer de chercher word2vec: https://en.wikipedia.org/wiki/Word2vec

2

Il existe différents modèles de mesure de similitude, comme word2vec ou un gant, mais vous semblez être plus à la recherche d'un corpus comprenant des phrases sociales et informelles comme 'lol'.

Cependant, je vais parler de word2vec parce que cela mène à ce que je pense être une réponse à votre question.

Le concept fondamental de word2vec (et d'autres modèles d'inclusion de mots comme le gant) est la représentation de mots dans un espace vectoriel qui incorpore des relations entre les mots. Cela se prête très bien à la mesure de la similarité, puisque les vecteurs ont beaucoup de mathématiques établies pour en tirer parti. Vous pouvez en lire plus sur les détails techniques de word2vec dans l'original paper, mais j'aime assez this blog post car il est bien écrit et concis. Encore une fois, puisque word2vec est juste un modèle, vous devez le coupler avec le bon ensemble d'entraînement pour obtenir le type de portée que vous recherchez.Il existe des modèles pré-formés qui circulent sur le Web, tels que this bunch. L'ensemble d'apprentissage est vraiment ce qui vous permet d'interroger une plus grande variété de termes, plutôt que le modèle.

Vous pouvez certainement utiliser ces modèles pré-formés s'ils ont des expressions sociales comme celles que vous recherchez. Cependant, si vous ne voyez pas un modèle qui a été formé sur un corpus approprié, vous pouvez facilement former un modèle vous-même. Je suggère Twitter ou Wikipedia pour les corpus (ensembles de formation), et la mise en œuvre de word2vec dans gensim comme un modèle d'intégration de mots.

2

Vous pouvez utiliser d'autres cadres. J'essayais aussi NLTK mais finalement atterri sur spacy (spacy.io) cadre très rapide et fonctionnel. Il y a une méthode pour les mots appelés «similitude» qui compense les autres mots (mais cela fonctionne également pour les phrases, les docs, etc.). Il est implémenté en utilisant word2vec. En fait, je ne sais pas quelle est la taille de leur vocabulaire et comment il se débat dans le cas où le mot est inconnu, mais il pourrait être utile d'essayer.

je aussi jouer un peu avec celui-ci: https://radimrehurek.com/gensim/models/word2vec.html Où accessible ici en 2 lignes, vous pouvez charger le modèle big word2vec de google (ce ports projet google word2vec C++ bibliothèque en python): https://docs.google.com/file/d/0B7XkCwpI5KDYaDBDQm1tZGNDRHc/edit