2017-09-11 3 views
4

Je veux obtenir des bigrammes et des trigrammes à partir des exemples de phrases que j'ai mentionnés.Problèmes lors de l'obtention de trigrammes en utilisant Gensim

Mon code fonctionne bien pour les bigrams. Cependant, il ne tient pas compte trigrammes dans les données (par exemple, l'interaction homme-machine, qui est mentionné dans 5 lieux de mes phrases)

approche 1 Mentionnés ci-dessous est mon code en utilisant des phrases dans Gensim.

from gensim.models import Phrases 
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"] 
sentence_stream = [doc.split(" ") for doc in documents] 

bigram = Phrases(sentence_stream, min_count=1, threshold=1, delimiter=b' ') 
trigram = Phrases(bigram_phraser[sentence_stream]) 

for sent in sentence_stream: 
    bigrams_ = bigram_phraser[sent] 
    trigrams_ = trigram[bigrams_] 

    print(bigrams_) 
    print(trigrams_) 

Approche 2 J'ai même essayé d'utiliser Phraser et phrases à la fois, mais cela n'a pas fonctionné.

from gensim.models import Phrases 
from gensim.models.phrases import Phraser 
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"] 
sentence_stream = [doc.split(" ") for doc in documents] 

bigram = Phrases(sentence_stream, min_count=1, threshold=2, delimiter=b' ') 
bigram_phraser = Phraser(bigram) 
trigram = Phrases(bigram_phraser[sentence_stream]) 

for sent in sentence_stream: 
    bigrams_ = bigram_phraser[sent] 
    trigrams_ = trigram[bigrams_] 

    print(bigrams_) 
    print(trigrams_) 

S'il vous plaît aidez-moi à résoudre ce problème d'obtention de trigrammes. Je suis le example documentation de Gensim.

Répondre

1

j'ai pu obtenir bigrammes et trigrammes avec quelques modifications à votre code:

from gensim.models import Phrases 
documents = ["the mayor of new york was there", "human computer interaction and machine learning has now become a trending research area","human computer interaction is interesting","human computer interaction is a pretty interesting subject", "human computer interaction is a great and new subject", "machine learning can be useful sometimes","new york mayor was present", "I love machine learning because it is a new subject area", "human computer interaction helps people to get user friendly applications"] 
sentence_stream = [doc.split(" ") for doc in documents] 

bigram = Phrases(sentence_stream, min_count=1, delimiter=b' ') 
trigram = Phrases(bigram[sentence_stream], min_count=1, delimiter=b' ') 

for sent in sentence_stream: 
    bigrams_ = [b for b in bigram[sent] if b.count(' ') == 1] 
    trigrams_ = [t for t in trigram[bigram[sent]] if t.count(' ') == 2] 

    print(bigrams_) 
    print(trigrams_) 

J'ai supprimé le paramètre threshold = 1 du bigramme Phrases car sinon il semble former digrammes étranges qui permettent la construction de trigrammes étranges (notez que bigram est utilisé pour construire le trigramme Phrases); ce paramètre serait probablement utile lorsque vous avez plus de données. Pour les trigrammes, le paramètre min_count doit également être spécifié car sa valeur par défaut est 5 s'il n'est pas fourni. Pour récupérer les bigrammes et trigrammes de chaque document, vous pouvez utiliser cette astuce de compréhension de liste pour filtrer les éléments qui ne sont pas formés par deux ou trois mots, respectivement.


Modifier - quelques détails sur le paramètre threshold:

Ce paramètre est utilisé par l'estimateur pour déterminer si deux mots une forme et b une phrase, et qui est seulement si:

(count(a followed by b) - min_count) * N/(count(a) * count(b)) > threshold 

N est la taille totale du vocabulaire. Par défaut, la valeur du paramètre est 10 (voir docs). Ainsi, plus le threshold est élevé, plus les contraintes de mots pour former des phrases sont dures. Par exemple, dans votre première approche, vous essayiez d'utiliser threshold = 1, donc vous obtiendriez ['human computer','interaction is'] comme digrammes de 3 de vos 5 phrases commençant par «interaction ordinateur-homme»; ce second digramme bizarre est le résultat du seuil plus détendu.

Ensuite, lorsque vous essayez d'obtenir des trigrammes avec threshold = 10 par défaut, vous obtenez seulement ['human computer interaction is'] pour ces 3 phrases, et rien pour les deux autres (filtré par le seuil); et parce que c'était un 4 grammes au lieu d'un trigramme, il serait également filtré par if t.count(' ') == 2.Dans le cas où, par exemple, vous abaissez le seuil trigramme à 1, vous pouvez obtenir ['interaction homme-machine'] comme trigramme pour les deux phrases restantes. Il ne semble pas facile d'obtenir une bonne combinaison de paramètres, here's plus à ce sujet. Je ne suis pas un expert, alors prenez cette conclusion avec un grain de sel: je pense qu'il vaut mieux d'abord obtenir de bons résultats digram (pas comme 'interaction is') avant de continuer, car des digrams étranges peuvent ajouter de la confusion à trigrammes supplémentaires, 4 grammes ...

+0

Merci beaucoup pour votre réponse très précieuse. À votre santé! :) En passant, pouvez-vous me dire ce qu'il se passe avec la valeur "seuil", car ce n'est pas très clair pour moi? –

+1

De rien! Oui, j'ai édité la réponse, j'espère que maintenant c'est un peu plus clair. – stjernaluiht

+0

Merci beaucoup! J'ai trouvé votre réponse très utile :) –