web-dev-qa-db-fra.com

Obtenez des bigrammes et des trigrammes dans Word2vec Gensim

J'utilise actuellement des grammes dans mon modèle Word2vec comme suit.

def review_to_sentences( review, tokenizer, remove_stopwords=False ):
    #Returns a list of sentences, where each sentence is a list of words
    #
    #NLTK tokenizer to split the paragraph into sentences
    raw_sentences = tokenizer.tokenize(review.strip())

    sentences = []
    for raw_sentence in raw_sentences:
        # If a sentence is empty, skip it
        if len(raw_sentence) > 0:
            # Otherwise, call review_to_wordlist to get a list of words
            sentences.append( review_to_wordlist( raw_sentence, \
              remove_stopwords ))
    #
    # Return the list of sentences (each sentence is a list of words,
    # so this returns a list of lists
    return sentences

Cependant, je manquerai alors des bigrammes et trigrammes importants dans mon ensemble de données.

E.g.,
"team work" -> I am currently getting it as "team", "work"
"New York" -> I am currently getting it as "New", "York"

Par conséquent, je veux capturer les bigrammes, trigrammes, etc. importants dans mon ensemble de données et les saisir dans mon modèle Word2vec.

Je suis nouveau sur wordvec et j'ai du mal à le faire. Aidez-moi, s'il vous plaît.

10
user8566323

Tout d'abord, vous devez utiliser la classe de gensim Phrases afin d'obtenir des bigrammes, qui fonctionnent comme indiqué dans la doc

>>> bigram = Phraser(phrases)
>>> sent = [u'the', u'mayor', u'of', u'new', u'york', u'was', u'there']
>>> print(bigram[sent])
[u'the', u'mayor', u'of', u'new_york', u'was', u'there']

Pour obtenir des trigrammes et ainsi de suite, vous devez utiliser le modèle bigram que vous avez déjà et lui appliquer à nouveau des phrases, etc. Exemple:

trigram_model = Phrases(bigram_sentences)

Il y a aussi un bon cahier et une bonne vidéo qui explique comment l'utiliser .... le cahier , la vidéo

La partie la plus importante est de savoir comment l'utiliser dans des phrases de la vie réelle, comme suit:

// to create the bigrams
bigram_model = Phrases(unigram_sentences)

// apply the trained model to a sentence
 for unigram_sentence in unigram_sentences:                
            bigram_sentence = u' '.join(bigram_model[unigram_sentence])

// get a trigram model out of the bigram
trigram_model = Phrases(bigram_sentences)

J'espère que cela vous aidera, mais la prochaine fois, donnez-nous plus d'informations sur ce que vous utilisez, etc.

P.S: Maintenant que vous l'avez édité, vous ne faites rien pour que les bigrammes le séparent, vous devez utiliser des phrases pour obtenir des mots comme New York en tant que bigrammes.

16
nitheism
from gensim.models import Phrases

from gensim.models.phrases import Phraser

documents = 
["the mayor of new york was there", "machine learning can be useful sometimes","new york mayor was present"]

sentence_stream = [doc.split(" ") for doc in documents]
print(sentence_stream)

bigram = Phrases(sentence_stream, min_count=1, threshold=2, delimiter=b' ')

bigram_phraser = Phraser(bigram)


print(bigram_phraser)

for sent in sentence_stream:
    tokens_ = bigram_phraser[sent]

    print(tokens_)
6
brb

Phrases et Phraser sont celles que vous devriez rechercher

bigram = gensim.models.Phrases(data_words, min_count=1, threshold=10) # higher threshold fewer phrases.
trigram = gensim.models.Phrases(bigram[data_words], threshold=100) 

Une fois que vous avez terminé l'ajout de vocabulaire, utilisez Phraser pour un accès plus rapide et une utilisation efficace de la mémoire. Pas obligatoire mais utile.

bigram_mod = gensim.models.phrases.Phraser(bigram)
trigram_mod = gensim.models.phrases.Phraser(trigram)

Merci,

1
Vivek Ananthan