web-dev-qa-db-fra.com

Comment faire la classification de texte à l'aide de Word2vec

Je souhaite effectuer une classification de texte à l'aide de Word2vec. J'ai des vecteurs de mots.

ls = []
sentences = lines.split(".")
for i in sentences:
    ls.append(i.split())
model = Word2Vec(ls, min_count=1, size = 4)
words = list(model.wv.vocab)
print(words)
vectors = []
for Word in words:
    vectors.append(model[Word].tolist())
data = np.array(vectors)
data

production:

array([[ 0.00933912,  0.07960335, -0.04559333,  0.10600036],
       [ 0.10576613,  0.07267512, -0.10718666, -0.00804013],
       [ 0.09459028, -0.09901826, -0.07074171, -0.12022413],
       [-0.09893986,  0.01500741, -0.04796079, -0.04447284],
       [ 0.04403428, -0.07966098, -0.06460238, -0.07369237],
       [ 0.09352681, -0.03864434, -0.01743148,  0.11251986],.....])

Comment puis-je effectuer une classification (produit et non produit)?

5
Shubham Agrawal

Vous disposez déjà du tableau de vecteurs Word utilisant model.wv.syn0. Si vous l'imprimez, vous pouvez voir un tableau avec chaque vecteur correspondant d'un mot.

Vous pouvez voir un exemple ici en utilisant Python3 :

import pandas as pd
import os
import gensim
import nltk as nl
from sklearn.linear_model import LogisticRegression


#Reading a csv file with text data
dbFilepandas = pd.read_csv('machine learning\\Python\\dbSubset.csv').apply(lambda x: x.astype(str).str.lower())

train = []
#getting only the first 4 columns of the file 
for sentences in dbFilepandas[dbFilepandas.columns[0:4]].values:
    train.extend(sentences)

# Create an array of tokens using nltk
tokens = [nl.Word_tokenize(sentences) for sentences in train]

Il est maintenant temps d'utiliser le modèle vectoriel, dans cet exemple, nous allons calculer la régression logistique.

model = gensim.models.Word2Vec(tokens, size=300, min_count=1, workers=4)
print("\n Training the Word2vec model...\n")
# reducing the epochs will decrease the computation time
model.train(tokens, total_examples=len(tokens), epochs=4000)
# You can save your model if you want....

# The two datasets must be the same size
max_dataset_size = len(model.wv.syn0)

Y_dataset = []
# get the last number of each file. In this case is the department number
# this will be the 0 or 1, or another kind of classification. ( to use words you need to extract them differently, this way is to numbers)
with open("dbSubset.csv", "r") as f:
    for line in f:
        lastchar = line.strip()[-1]
        if lastchar.isdigit():
            result = int(lastchar) 
            Y_dataset.append(result) 
        else:
            result = 40 


clf = LogisticRegression(random_state=0, solver='lbfgs', multi_class='multinomial').fit(model.wv.syn0, Y_dataset[:max_dataset_size])

# Prediction of the first 15 samples of all features
predict = clf.predict(model.wv.syn0[:15, :])
# Calculating the score of the predictions
score = clf.score(model.wv.syn0, Y_dataset[:max_dataset_size])
print("\nPrediction Word2vec : \n", predict)
print("Score Word2vec : \n", score)

Vous pouvez également calculer la similitude des mots appartenant à votre dictionnaire de modèles créé:

print("\n\nSimilarity value : ",model.wv.similarity('women','men'))

Vous pouvez trouver plus de fonctions à utiliser ici .

4
Joel Carneiro

Votre question est assez large mais je vais essayer de vous donner une première approche pour classer les documents texte.

Tout d'abord, je déciderais comment je veux représenter chaque document comme un seul vecteur. Vous avez donc besoin d'une méthode qui prend une liste de vecteurs (de mots) et renvoie un seul vecteur. Vous voulez éviter que la longueur du document influence ce que ce vecteur représente. Vous pouvez par exemple choisir la moyenne.

def document_vector(array_of_Word_vectors):
    return array_of_Word_vectors.mean(axis=0) 

array_of_Word_vectors est par exemple data dans votre code.

Maintenant, vous pouvez soit jouer un peu avec les distances (par exemple, la distance cosinus serait un bon premier choix) et voir à quelle distance certains documents sont les uns des autres ou - et c'est probablement l'approche qui apporte des résultats plus rapides - vous pouvez utiliser les vecteurs de document pour créer un ensemble de formation pour un algorithme de classification de votre choix à partir de scikit learn , par exemple Régression logistique.

Les vecteurs de documents deviendront votre matrice X et votre vecteur y est un tableau de 1 et 0, selon la catégorie binaire dans laquelle vous souhaitez classer les documents.

1
Jérôme Bau