在 scikit tfidfVectorizer 中恢复原始术语 doc-id
Recuperating original term doc-id in sci-kit tfidf Vectorizer
我在 sci-kit learn
中使用 tdidf vectorizer
来计算不同电影评论的 td-idf 值。我已经成功地实现了代码,但现在我正在尝试改进它以优化输出。话虽如此,我想在我的输出 CSV
中包含有关原始 movie
或每个术语也相关的文档的信息。
为了解决这个问题,我已经here and here寻找灵感但没有成功。
为此,我试图在我的密集 td-idf
矩阵中恢复文档 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
以便在我的 [=14] 中为 movie
提供正确的标识符=]:
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
?
我已经能够通过创建另一个字典来解决这个问题,该字典在将数据转换为矩阵之前将 docID 与文本相关联。
然后,我能够在输出中将单个词与其原始文档相关联。
这是我实现的代码,我还在运行测试中,不过好像已经解决了问题
idTracker = {}
idCounter = 1
for id, movie in movies.iteritems():
corpus.append(movie)
idTracker[idCounter] = id
idCounter +=1
我在 sci-kit learn
中使用 tdidf vectorizer
来计算不同电影评论的 td-idf 值。我已经成功地实现了代码,但现在我正在尝试改进它以优化输出。话虽如此,我想在我的输出 CSV
中包含有关原始 movie
或每个术语也相关的文档的信息。
为了解决这个问题,我已经here and here寻找灵感但没有成功。
为此,我试图在我的密集 td-idf
矩阵中恢复文档 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
以便在我的 [=14] 中为 movie
提供正确的标识符=]:
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
?
我已经能够通过创建另一个字典来解决这个问题,该字典在将数据转换为矩阵之前将 docID 与文本相关联。
然后,我能够在输出中将单个词与其原始文档相关联。
这是我实现的代码,我还在运行测试中,不过好像已经解决了问题
idTracker = {}
idCounter = 1
for id, movie in movies.iteritems():
corpus.append(movie)
idTracker[idCounter] = id
idCounter +=1