Ich habe zwei Verzeichnisse, aus denen ich ihre Textdateien lesen und beschriften möchte, aber ich weiß nicht, wie ich dies über TaggedDocument
tun soll. Ich dachte, es würde als TaggedDocument ([Strings], [Labels]) funktionieren, aber das funktioniert anscheinend nicht.
Das ist mein Code:
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)
und das ist der Fehler, den ich bekomme:
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'
Also habe ich einfach ein bisschen experimentiert und dies auf github gefunden:
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.
daher habe ich beschlossen, die Verwendung der TaggedDocument-Funktion zu ändern, indem für jedes Dokument eine TaggedDocument-Klasse generiert wurde.
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)
Sie können gensims common_texts als Beispiel verwenden:
from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec, TaggedDocument
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(common_texts)]
model = Doc2Vec(documents, vector_size=5, window=2, min_count=1, workers=4)
Dabei werden common_texts und TaggedDocument verwendet, um die vom Doc2Vec-Algorithmus erwartete Dokumentdarstellung zu erstellen.
Die Eingabe für ein Doc2Vec-Modell sollte eine Liste von TaggedDocument sein (['list', 'of', 'word'], [TAG_001]). Eine gute Praxis ist die Verwendung der Indexe von Sätzen als Tags. Zum Beispiel, um ein Doc2Vec-Modell mit zwei Sätzen (d. H. Dokumenten, Absätzen) zu trainieren:
s1 = 'the quick fox brown fox jumps over the lazy dog'
s1_tag = '001'
s2 = 'i want to burn a zero-day'
s2_tag = '002'
docs = []
docs.append(TaggedDocument(words=s1.split(), tags=[s1_tag])
docs.append(TaggedDocument(words=s2.split(), tags=[s2_tag])
model = gensim.models.Doc2Vec(vector_size=300, window=5, min_count=5, workers=4, epochs=20)
model.build_vocab(docs)
print 'Start training process...'
model.train(docs, total_examples=model.corpus_count, epochs=model.iter)
#save model
model.save(model_path)