web-dev-qa-db-ja.com

Word2vecを使用してテキスト分類を行う方法

Word2vecでテキスト分類を行いたい。単語のベクトルを取得しました。

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

出力:

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

分類(製品と非製品)を実行するにはどうすればよいですか?

5
Shubham Agrawal

model.wv.syn0を使用したWordベクトルの配列が既にあります。印刷すると、Wordの対応する各ベクトルの配列が表示されます。

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]

ここで、ベクトルモデルを使用します。この例では、LogisticRegressionを計算します。

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)

作成したモデル辞書に属する単語の類似度を計算することもできます。

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

here を使用するための関数をさらに見つけることができます。

4
Joel Carneiro

あなたの質問はかなり広いですが、私はあなたにテキスト文書を分類するための最初のアプローチを提供しようとします。

まず、各ドキュメントを1つのベクトルとして表現する方法を決定します。したがって、(単語の)ベクトルのリストを受け取り、1つのベクトルを返すメソッドが必要です。文書の長さが、このベクトルが表すものに影響を与えることを避けたいとします。たとえば、平均を選択できます。

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

どこ array_of_Word_vectorsは、たとえばコード内のdataです。

これで、距離を少し変えて(たとえば、コサイン距離が最初の選択肢として最適です)、特定のドキュメントが互いにどのくらい離れているかを確認できます。または、これがおそらくより高速な結果をもたらすアプローチです。ドキュメントベクトルを使用して、 scikit learn から選択した分類アルゴリズムのトレーニングセットを作成します(例:ロジスティック回帰)。

ドキュメントベクトルは行列Xになり、ベクトルyは、ドキュメントを分類するバイナリカテゴリに応じて、1と0の配列になります。

1
Jérôme Bau