在sci-kit tfidf Vectorizer中恢复原始术语doc-id

时间:2015-12-16 17:35:56

标签: python csv scikit-learn tf-idf

我在tdidf vectorizer中使用sci-kit learn来计算不同电影评论的td-idf值。我已成功实现了代码,但现在我正在尝试优化它以优化输出。话虽如此,我想在我的输出CSV中包含有关原始movie的信息或每个术语所属的文档。

要解决这个问题,我已经看过herehere,但没有取得任何成功。

为此,我正在尝试恢复密集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

按如下方式构建输出时,我不确定如何将rowword相关联,以便为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 }

1 个答案:

答案 0 :(得分:0)

我已经能够通过创建另一个字典来解决问题,该字典在将数据转换为矩阵之前将docID与文本相关联。

然后,我能够在输出中将单个单词与其原始文档相关联。

这是我实现的代码,我仍在运行测试,但似乎已经解决了这个问题。

idTracker = {}
idCounter = 1
for id, movie in movies.iteritems():
    corpus.append(movie)
    idTracker[idCounter] = id
    idCounter +=1