用python编写一个TF-IDF算法的完整代码。 要求:使用Counter包,语料库为整个csv文件,将已分词后的csv文件中的每行信息作为一个文档,并以列表形式呈现; 第一部分为导入信息; 第二部分为统计每个词语在所有文档中出现的次数; 第三部分为TF计算过程,计算每个文档中每个词语的TF值; 第四部分为IDF计算过程,计算每个词语在所有文档中出现的文档频率IDF值; 第五部分为TF-IDF的计算过程,计算每个词语的TF-IDF值; 第六部分为TF-IDF值排序(从大到小)及信息储存。 输入输出标注清楚;输入为已分词后的评论信息的csv文件(无需再分词),输出结果为排序后的词语及TF-IDF值,且无重复词语同时出现,输出形式为csv文档;标注详细清晰;以注释形式描述所使用的公式;计算过程均不运用向量。
时间: 2024-03-11 10:47:16 浏览: 37
以下是一个使用Counter包实现TF-IDF算法的Python代码,其中语料库为整个csv文件,将已分词后的csv文件中的每行信息作为一个文档,并以列表形式呈现:
```python
import csv
import math
from collections import Counter
# 输入:已分词后的评论信息的csv文件(无需再分词)
input_file = 'corpus.csv'
# 输出:排序后的词语及TF-IDF值,且无重复词语同时出现,输出形式为csv文档
output_file = 'tf_idf.csv'
# 第一部分:导入信息
corpus = []
with open(input_file, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
corpus.append(row)
# 第二部分:统计每个词语在所有文档中出现的次数
word_count = Counter()
for doc in corpus:
word_count.update(doc)
# 第三部分:TF计算过程
tf_scores = []
for doc in corpus:
tf_scores.append(Counter(doc))
# 第四部分:IDF计算过程
num_docs = len(corpus)
idf_scores = {}
for word in word_count:
doc_freq = sum(1 for doc in corpus if word in doc)
idf_scores[word] = math.log(num_docs / doc_freq)
# 第五部分:TF-IDF的计算过程
tf_idf_scores = []
for tf in tf_scores:
tf_idf_doc = {}
for word, freq in tf.items():
tf_idf_doc[word] = freq * idf_scores[word]
tf_idf_scores.append(tf_idf_doc)
# 第六部分:TF-IDF值排序(从大到小)及信息储存
sorted_words = sorted(word_count, key=lambda x: -sum(doc[x] for doc in tf_scores))
with open(output_file, 'w', encoding='utf-8', newline='') as f:
writer = csv.writer(f)
writer.writerow(['Word', 'TF-IDF'])
for word in sorted_words:
if word in idf_scores:
writer.writerow([word, idf_scores[word]])
```
其中,TF-IDF值的计算公式如下:
$$
\text{TF}(t,d) = \frac{n_{t,d}}{\sum_k n_{k,d}} \\
\text{IDF}(t,D) = \log\frac{N}{|\{d \in D : t \in d\}|} \\
\text{TF-IDF}(t,d,D) = \text{TF}(t,d) \times \text{IDF}(t,D)
$$
其中,$n_{t,d}$ 表示词语 $t$ 在文档 $d$ 中出现的次数,$\sum_k n_{k,d}$ 表示文档 $d$ 中所有词语的出现次数之和,$N$ 表示总文档数,$|\{d \in D : t \in d\}|$ 表示包含词语 $t$ 的文档数。
阅读全文
相关推荐















