2 votes

représentation vectorielle word2Vec pour l'algorithme de classification des textes

J'essaie d'utiliser word2vec dans un algorithme de classification de texte. Je veux créer un vecteur en utilisant word2vec, j'ai utilisé le script ci-dessous. Mais je ne suis pas en mesure d'obtenir une ligne pour chaque document au lieu de cela je reçois une matrice de dimension différente pour chaque document. Par exemple pour le 1er document matrice de 31X100, 2ème 163X100 et 3ème 73X100 et ainsi de suite. En fait, j'ai besoin d'une dimension de 1X100 pour chaque document, afin de pouvoir les utiliser comme caractéristiques d'entrée pour le modèle de formation.

Quelqu'un peut-il m'aider ?

import os
import pandas as pd       
from nltk.stem import WordNetLemmatizer
from bs4 import BeautifulSoup
import re
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords # Import the stop word list
import gensim
import numpy as np

train = pd.read_csv("Data.csv",encoding='cp1252')
wordnet_lemmatizer = WordNetLemmatizer()

def Description_to_words(raw_Description):
    Description_text = BeautifulSoup(raw_Description).get_text() 
    letters_only = re.sub("[^a-zA-Z]", " ", Description_text)
    words = word_tokenize(letters_only.lower())    
    stops = set(stopwords.words("english")) 
    meaningful_words = [w for w in words if not w in stops]
    return( " ".join(wordnet_lemmatizer.lemmatize(w) for w in meaningful_words))

num_Descriptions = train["Summary"].size
clean_train_Descriptions = []
print("Cleaning and parsing the training set ticket Descriptions...\n")
clean_train_Descriptions = []
for i in range( 0, num_Descriptions ):
    if( (i+1)%1000 == 0 ):
        print("Description %d of %d\n" % ( i+1, num_Descriptions ))
    clean_train_Descriptions.append(Description_to_words( train["Summary"][i] ))

model = gensim.models.Word2Vec(clean_train_Descriptions, size=100)
w2v = dict(zip(model.wv.index2word, model.wv.syn0))

class MeanEmbeddingVectorizer(object):
    def __init__(self, word2vec):
        self.word2vec = word2vec
        # if a text is empty we should return a vector of zeros
        # with the same dimensionality as all the other vectors
        #self.dim = len(word2vec.itervalues().next())
        self.dim = 100

    def fit(self, X, y):
        return self

    def transform(self, X):
        return np.array([
            np.mean([self.word2vec[w] for w in words if w in self.word2vec]
                    or [np.zeros(self.dim)], axis=0)
            for words in X
        ])

a=MeanEmbeddingVectorizer(w2v)
clean_train_Descriptions[1]
a.transform(clean_train_Descriptions[1])

train_Descriptions = []
for i in range( 0, num_Descriptions ):
    if( (i+1)%1000 == 0 ):
        print("Description %d of %d\n" % ( i+1, num_Descriptions ))
    train_Descriptions.append(a.transform(" ".join(clean_train_Descriptions[i])))

1voto

Ken Syme Points 1931

Vous avez deux problèmes dans votre code qui causent des problèmes, tous deux facilement résolus.

Tout d'abord, Word2Vec exige que les phrases soient en fait une liste de mots, plutôt qu'une phrase réelle sous forme de chaîne unique. Ainsi, à partir de votre Description_to_words Renvoyez juste la liste, ne vous inscrivez pas.

return [wordnet_lemmatizer.lemmatize(w) for w in meaningful_words]

Puisque word2vec itère sur chaque phrase pour obtenir les mots, auparavant il itérait sur une chaîne de caractères, et vous obteniez en fait un encastrement au niveau des caractères à partir de wv .

Deuxièmement, un problème similaire avec la façon dont vous appelez transformer - X est censé être une liste de documents, et non un document individuel. Ainsi, lorsque vous faites for words in X vous créez en fait une liste de caractères, puis vous l'itérez pour créer un encastrement. Donc votre résultat est en fait l'intégration de chaque caractère de vos phrases. Tout simplement modifié, il suffit de convertir tous les documents en une seule fois !

train_Descriptions = a.transform(clean_train_Descriptions)

(pour faire un à la fois, envelopper dans une liste ( [clean_train_Descriptions[1]] ), ou sélectionnez 1 en utilisant le sélecteur de gamme ( clean_train_Descriptions[1:2] ).

Avec ces deux changements, vous devriez récupérer 1 ligne par phrase d'entrée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X