2017-07-16 5 views
2

私はそれらのテキストファイルを読み込み、それらにラベルを付ける2つのディレクトリがありますが、TaggedDocument経由でこれを行う方法がわかりません、TaggedDocument([Strings]、[Labels])として機能すると思っていましたが、明らかに仕事をしている。これは私のコードです:どのようにgensimでTaggedDocumentを使用しますか?

from gensim import models 
from gensim.models.doc2vec import TaggedDocument 
import utilities as util 
import os 
from sklearn import svm 
from nltk.tokenize import sent_tokenize 
CogPath = "./FixedCog/" 
NotCogPath = "./FixedNotCog/" 
SamplePath ="./Sample/" 
docs = [] 
tags = [] 
CogList = [p for p in os.listdir(CogPath) if p.endswith('.txt')] 
NotCogList = [p for p in os.listdir(NotCogPath) if p.endswith('.txt')] 
SampleList = [p for p in os.listdir(SamplePath) if p.endswith('.txt')] 
for doc in CogList: 
    str = open(CogPath+doc,'r').read().decode("utf-8") 
    docs.append(str) 
    print docs 
    tags.append(doc) 
    print "###########" 
    print tags 
    print "!!!!!!!!!!!" 
for doc in NotCogList: 
    str = open(NotCogPath+doc,'r').read().decode("utf-8") 
    docs.append(str) 
    tags.append(doc) 
for doc in SampleList: 
    str = open(SamplePath + doc, 'r').read().decode("utf-8") 
    docs.append(str) 
    tags.append(doc) 

T = TaggedDocument(docs,tags) 

model = models.Doc2Vec(T,alpha=.025, min_alpha=.025, min_count=1,size=50) 

、これは私が取得エラーです:

Traceback (most recent call last): 
    File "/home/farhood/PycharmProjects/word2vec_prj/doc2vec.py", line 34, in <module> 
    model = models.Doc2Vec(T,alpha=.025, min_alpha=.025, min_count=1,size=50) 
    File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 635, in __init__ 
    self.build_vocab(documents, trim_rule=trim_rule) 
    File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/word2vec.py", line 544, in build_vocab 
    self.scan_vocab(sentences, progress_per=progress_per, trim_rule=trim_rule) # initial survey 
    File "/home/farhood/anaconda2/lib/python2.7/site-packages/gensim/models/doc2vec.py", line 674, in scan_vocab 
    if isinstance(document.words, string_types): 
AttributeError: 'list' object has no attribute 'words' 
+0

あなたの主な質問とは別に、「min_alpha」の終わりを「alpha」と同じ値にすることは、あなたのトレーニングが適切な確率的勾配降下をしていないことを意味します。また、「min_count = 1」はWor​​d2Vec/Doc2Vecトレーニングで役立つことはまれです。このような珍しい単語を保持することは、トレーニングに時間がかかり、残りの単語vecs/doc-vecsの品質を妨害する傾向があります。 – gojomo

+0

min_alpha'、私はこのコードに続いて、サンプルコードからそれをコピーした 'について: '範囲のエポックのために(10): model.train(ドキュメント) model.alpha - = 0.002 #学習率を下げる model.min_alpha = model.alpha#は学習率を固定し、減衰はない ' と約「min_count」について:私のデータセットは非常に限られていて、それほど頻繁ではない意味では、私はまた、ほとんどのストップワードと頻繁な毎日の単語をフィルタリングしました。 – Farhood

+0

これは悪いサンプルです。 Doc2Vecインスタンスを作成するときにコーパスを渡していると、自動的にすべてのトレーニングパスが実行され、学習率が 'alpha'から' min_alpha'まで自動的に管理されます。あなた自身。 (そして、あなたがそうしたのであれば、他の特質がなくても表示されているように、最新のgensimのバージョンは間違いがあるので、間違いがあります)。デフォルトの 'alpha' /' min_alpha'です。 – gojomo

答えて

2

だから私は少しだけ実験し、githubの上でこれを見つけた:

class TaggedDocument(namedtuple('TaggedDocument', 'words tags')): 
    """ 
    A single document, made up of `words` (a list of unicode string tokens) 
    and `tags` (a list of tokens). Tags may be one or more unicode string 
    tokens, but typical practice (which will also be most memory-efficient) is 
    for the tags list to include a unique integer id as the only tag. 

    Replaces "sentence as a list of words" from Word2Vec. 

ので、私はすることを決めました各ドキュメントのTaggedDocumentクラスを生成してTaggedDocument関数をどのように使用するかを変更してください。重要なのは、タグをリストとして渡す必要があることです。

for doc in CogList: 
    str = open(CogPath+doc,'r').read().decode("utf-8") 
    str_list = str.split() 
    T = TaggedDocument(str_list,[doc]) 
    docs.append(T) 
+0

はい: 'Doc2Vec'は、コーパスが反復可能なコレクションであることを期待しています。ここで、個々のアイテム(ドキュメント)は' TaggedDocument'のような形をしています。 (つまり、 'words'リストと' tags'リストを持っています。) – gojomo

関連する問題