2010-10-21 24 views
1

J'ai actuellement un code python qui compare deux textes en utilisant la mesure de similarité de cosinus. J'ai le code here. Ce que je veux faire est de prendre les deux textes et de les passer à travers un dictionnaire (pas un dictionnaire python, juste un dictionnaire de mots) d'abord avant de calculer la mesure de similarité. Le dictionnaire sera juste une liste de mots, même si ce sera une grande liste. Je sais que ça ne devrait pas être difficile et que je pourrais peut-être trébucher sur quelque chose, mais j'aimerais aussi que ce soit efficace. Merci.passage de texte à travers un dictionnaire en Python

+0

Que voulez-vous dire «les transmettre dans un dictionnaire»? Que va-t-il ressortir après que vous les ayez «passés»? –

+0

Pour calculer la similarité de cosinus, le texte est segmenté et segmenté. Je veux prendre cette liste de mots coupés et filtrer tous les mots qui ne sont pas dans une liste principale de mots. Par exemple, disons que mon dictionnaire de mots n'incluait aucune ville. Si le nom d'une ville existait dans le texte, il ignorait ces mots lors du calcul de la similarité de cosinus. – KyleP

Répondre

1

Si le Fites dictionnaire dans la mémoire, utilisez un ensemble Python:

ok_words = set(["a", "b", "c", "e"]) 

def filter_words(words): 
    return [word for word in words if word in ok_words] 

Si elle ne correspond pas à la mémoire, vous pouvez utiliser l'écart

+0

Je crois que la dernière chaîne doit être 'return [mot pour mot dans les mots ** si ** mot dans ok_words]'? – ffriend

+0

J'ai mis à jour la faute de frappe. –

+0

Les ensembles ne sont pas la même chose que les dictionnaires (bien que l'implémentation soit similaire). – intuited

0

La structure que vous essayez de créer est connu sous le nom Indice inversé. Here vous pouvez trouver des informations générales à ce sujet et des extraits de la mise en œuvre de Heaps and Mills. Malheureusement, je n'ai pas pu trouver sa source, ni aucune autre implémentation efficace. (. S'il vous plaît laisser un commentaire si vous trouverez tout)

Si vous avez pas un objectif de créer une bibliothèque en Python pur, vous pouvez utiliser PyLucene - extension Python pour accéder Lucene, ce qui est dans son tour le moteur de recherche très puissant en Java. Lucene implémente l'index inversé et peut facilement vous fournir des informations sur la fréquence des mots. Il prend également en charge une large gamme d'analyseurs (parseurs + stemmers) pour une douzaine de langues.
(A noter également, que Lucene a déjà sa propre classe de mesure Similarity.)

Quelques mots sur la similitude et modèles espace vectoriel. C'est une abstraction très puissante, mais votre implémentation souffre de plusieurs inconvénients. Avec une augmentation du nombre de documents dans votre index, votre matrice de cooccurrence deviendra trop grande pour tenir dans la mémoire, et la recherche dans celle-ci prendra du temps. Pour arrêter cet effet la réduction de dimension est utilisée. Dans les méthodes comme LSA ceci est fait par Singular Value Decomposition. Portez également attention aux techniques telles que PLSA, qui utilise la théorie probabiliste, et Random Indexing, qui est la seule méthode VSM incrémentielle (et donc la seule appropriée pour les grands index).

+0

Depuis ce sujet ne concerne pas VSM, je ne vais pas donner plus d'informations à ce sujet ici, mais si vous en avez besoin, s'il vous plaît créer un nouveau sujet et poster un commentaire ici. – ffriend

+0

Merci pour les liens. – KyleP