57

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

私はゲンシムを使用しています。

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' がありません

これを実行するたびに。

4

4 に答える 4

45

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]

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

于 2016-09-05T11:01:09.423 に答える
36

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

しかし、@ bee2502は正しかった

docvec = model.docvecs[99] 

トレーニング済みモデルの 100 番目のベクトルの値である必要があり、整数と文字列で機能します。

于 2015-10-28T23:21:45.040 に答える
27
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' object has no attribute '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 に似ています。

于 2015-07-09T18:19:46.127 に答える