我在tdidf vectorizer
中使用sci-kit learn
来计算不同电影评论的td-idf值。我已成功实现了代码,但现在我正在尝试优化它以优化输出。话虽如此,我想在我的输出CSV
中包含有关原始movie
的信息或每个术语所属的文档。
要解决这个问题,我已经看过here和here,但没有取得任何成功。
为此,我正在尝试恢复密集td-idf
矩阵中的doc id或行id。非常重要的是,我知道我评估的术语也属于哪个文档。
目前,我已经尝试了
counter = 0
corpus = []
key = {}
for id, movie in sorted(movies.iteritems(), key=lambda t: int(t[0])):
corpus.append(movie)
key[id] = counter
counter+=1
tf = TfidfVectorizer(analyzer='word', ngram_range=(1,1), min_df = 0)
tfidf_matrix = tf.fit_transform(corpus)
feature_names = tf.get_feature_names()
def get_doc_row(docid):
rowid = key[docid]
row = tf[rowid,:]
return row
按如下方式构建输出时,我不确定如何将row
与word
相关联,以便为movie
CSV
中的with open("output.csv", "w") as file:
writer = csv.writer(file, delimiter=",")
writer.writerow(["Col1", "Col2", "Col3", "Col4"])
word_list = "words.txt"
word_dict = {}
with open(word_list) as f:
for line in f:
depurated_line = line.rstrip()
(key, val) = depurated_line.split("\t")
word_dict[key] = val
doc_id = 0
for doc in tfidf_matrix.todense():
word_id = 0
for score in doc.tolist()[0]:
if score > 0:
word = feature_names[word_id].encode("utf-8")
wordPosish = row(word)
print wordPosish
if word in word_dict:
scoreWeight = score * 100
writer.writerow([doc_id+1, word.decode("utf-8"), scoreWeight, word_dict[word]])
word_id +=1
doc_id +=1
提供正确的标识符:
doc_id
目前,我所拥有的row
的顺序与文件输入系统的顺序不对应,这就是为什么我找到一种方法以某种方式将这些信息恢复到包含的原因它在输出中。
是否有特定的地方我应该包含上面定义的doc
,以便恢复该词最初所涉及的具体labels: {
align: 'right',
x: 20
}
?
答案 0 :(得分:0)
我已经能够通过创建另一个字典来解决问题,该字典在将数据转换为矩阵之前将docID与文本相关联。
然后,我能够在输出中将单个单词与其原始文档相关联。
这是我实现的代码,我仍在运行测试,但似乎已经解决了这个问题。
idTracker = {}
idCounter = 1
for id, movie in movies.iteritems():
corpus.append(movie)
idTracker[idCounter] = id
idCounter +=1