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.
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.
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_)
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,