python 中的 tf-idf 函数需要帮助才能满足我的输出要求
tf-idf function in python need help to satisfy my output
我写了一个函数,基本上计算逆向文档频率(以 10 为底的对数(总共 no.of 个文档/ no.of 个包含特定单词的文档))
我的代码:
def tfidf(docs,doc_freqs):
res = []
t = sum(isinstance(i, list) for i in docs)
for key,val in doc_freqs.items():
res.append(math.log10(t/val))
pos = defaultdict(lambda:[])
for docID, lists in enumerate(docs):
for element in set(lists):
pos[element].append([docID] + res)
return pos
我的输出:
index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812], [1, 0.0, 0.3010299956639812, 0.3010299956639812]]
index['b']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812]]
期望的输出:
index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0], [1, 0.0]]
index['b']
[[0, 0.3010299956639812]]
所以基本上我只想显示出现该术语的 docid,后跟单独的 idf 值。 (即,)在上面的示例中,因为术语“a”出现在两个文档中,所以 idf 值为 0 .
任何人都可以建议我需要在我的代码中进行哪些修改才能根据 运行 时间指定的术语仅打印相应的 idf 值吗??
求助!!!
提前致谢。
狼,
现在您正在将整个 res
附加到 [docID]
,但您只关心与 element
关联的值。我建议将 res
更改为 dict
,如以下代码:
import math
def tfidf(docs,doc_freqs):
res = {}
t = sum(isinstance(i, list) for i in docs)
for key,val in doc_freqs.items():
res[key] = math.log10(t/val)
pos = defaultdict(lambda:[])
for docID, lists in enumerate(docs):
for element in set(lists):
pos[element].append([docID, res[element]])
return pos
docs = [['a', 'b', 'a'], ['a']]
doc_freqs = {'a': 2., 'b': 1., 'c': 1.}
index = tfidf(docs, doc_freqs)
这就是你的输出:
index['a']
[[0, 0.0], [1, 0.0]]
index['b']
[[0, 0.3010299956639812]]
我写了一个函数,基本上计算逆向文档频率(以 10 为底的对数(总共 no.of 个文档/ no.of 个包含特定单词的文档))
我的代码:
def tfidf(docs,doc_freqs):
res = []
t = sum(isinstance(i, list) for i in docs)
for key,val in doc_freqs.items():
res.append(math.log10(t/val))
pos = defaultdict(lambda:[])
for docID, lists in enumerate(docs):
for element in set(lists):
pos[element].append([docID] + res)
return pos
我的输出:
index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812], [1, 0.0, 0.3010299956639812, 0.3010299956639812]]
index['b']
[[0, 0.0, 0.3010299956639812, 0.3010299956639812]]
期望的输出:
index = tfidf([['a', 'b', 'c'], ['a']], {'a': 2., 'b': 1., 'c': 1.})
index['a']
[[0, 0.0], [1, 0.0]]
index['b']
[[0, 0.3010299956639812]]
所以基本上我只想显示出现该术语的 docid,后跟单独的 idf 值。 (即,)在上面的示例中,因为术语“a”出现在两个文档中,所以 idf 值为 0 .
任何人都可以建议我需要在我的代码中进行哪些修改才能根据 运行 时间指定的术语仅打印相应的 idf 值吗??
求助!!! 提前致谢。
狼,
现在您正在将整个 res
附加到 [docID]
,但您只关心与 element
关联的值。我建议将 res
更改为 dict
,如以下代码:
import math
def tfidf(docs,doc_freqs):
res = {}
t = sum(isinstance(i, list) for i in docs)
for key,val in doc_freqs.items():
res[key] = math.log10(t/val)
pos = defaultdict(lambda:[])
for docID, lists in enumerate(docs):
for element in set(lists):
pos[element].append([docID, res[element]])
return pos
docs = [['a', 'b', 'a'], ['a']]
doc_freqs = {'a': 2., 'b': 1., 'c': 1.}
index = tfidf(docs, doc_freqs)
这就是你的输出:
index['a']
[[0, 0.0], [1, 0.0]]
index['b']
[[0, 0.3010299956639812]]