web-dev-qa-db-ja.com

Doc2vec:ドキュメントベクトルを取得する方法

Doc2vecを使用して2つのテキストドキュメントのドキュメントベクトルを取得する方法は?私はこれが初めてなので、誰かが私を正しい方向に向けることができるか、いくつかのチュートリアルで私を助けてくれると便利です

私はgensimを使用しています。

doc1=["This is a sentence","This is another sentence"]
documents1=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents1, size = 100, window = 300, min_count = 10, workers=4)

私は得る

AttributeError: 'list'オブジェクトには属性 'words'がありません

これを実行するたびに。

51
bee2502

Doc2Vecモデルをトレーニングする場合は、データセットに単語(Word2Vec形式に類似)とタグ(ドキュメントのID)のリストを含める必要があります。また、いくつかの追加情報を含めることもできます(詳細については、 https://github.com/RaRe-Technologies/gensim/blob/develop/docs/notebooks/doc2vec-IMDB.ipynb を参照してください)。

# Import libraries

from gensim.models import doc2vec
from collections import namedtuple

# Load data

doc1 = ["This is a sentence", "This is another sentence"]

# Transform data (you can add more data preprocessing steps) 

docs = []
analyzedDocument = namedtuple('AnalyzedDocument', 'words tags')
for i, text in enumerate(doc1):
    words = text.lower().split()
    tags = [i]
    docs.append(analyzedDocument(words, tags))

# Train model (set min_count = 1, if you want the model to work with the provided example data set)

model = doc2vec.Doc2Vec(docs, size = 100, window = 300, min_count = 1, workers = 4)

# Get the vectors

model.docvecs[0]
model.docvecs[1]

更新(エポックでのトレーニング方法):この例は古くなったため、削除しました。エポックでのトレーニングの詳細については、 this answer または@gojomoのコメントを参照してください。

40
Lenka Vraná

Gensimが更新されました。 LabeledSentenceの構文には、labelsは含まれません。現在、tags-LabeledSentenceのドキュメントを参照してください https://radimrehurek.com/gensim/models/doc2vec.html

ただし、@ bee2502は正しい

docvec = model.docvecs[99] 

トレーニングされたモデルの100番目のベクトルの値になり、整数と文字列で動作します。

35
l.augustyniak
doc=["This is a sentence","This is another sentence"]
documents=[doc.strip().split(" ") for doc in doc1 ]
model = doc2vec.Doc2Vec(documents, size = 100, window = 300, min_count = 10, workers=4)

Doc2vec()への入力ドキュメントが正しいLabeledSentence形式ではなかったため、AttributeError: 'list'オブジェクトには属性 'words'がありません。以下の例を参考にしてください。

documents = LabeledSentence(words=[u'some', u'words', u'here'], labels=[u'SENT_1']) 

詳細はこちら: http://rare-technologies.com/doc2vec-tutorial/ ただし、TaggedLineDocument()を使用してファイルから入力データを取得することで問題を解決しました。
ファイル形式:1ドキュメント= 1行= 1 TaggedDocumentオブジェクト。単語はすでに前処理され、空白で区切られていることが予想され、タグはドキュメントの行番号から自動的に構築されます。

sentences=doc2vec.TaggedLineDocument(file_path)
model = doc2vec.Doc2Vec(sentences,size = 100, window = 300, min_count = 10, workers=4)

文書ベクトルを取得するには:docvecsを使用できます。詳細はこちら: https://radimrehurek.com/gensim/models/doc2vec.html#gensim.models.doc2vec.TaggedDocument

docvec = model.docvecs[99] 

99は、ベクターが必要なドキュメントIDです。ラベルが整数形式の場合(デフォルトでは、TaggedLineDocument()を使用してロードする場合)、私がしたように整数IDを直接使用します。ラベルが文字列形式の場合、「SENT_99」を使用します。これはWord2vecに似ています

26
bee2502
from gensim.models.doc2vec import Doc2Vec, TaggedDocument 
Documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(doc1)]
Model = Doc2Vec(Documents, other parameters~~)

これでうまくいくはずです。トレーニングdoc2vecモデルのドキュメントにタグを付ける必要があります。

0
MovingKyu