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])))