用python编写一个TF-IDF算法的完整代码。 要求:使用Counter包,语料库为整个csv文件,将已分词后的csv文件中的每行信息作为一个文档,并以列表形式呈现。 第一部分为导入信息; 第二部分为统计词频; 第三部分为计算每个文档中每个词语的TF值; 第四部分为计算每个词语在所有文档中出现的文档频率IDF值; 第五部分为计算每个词语的TF-IDF值; 第六部分为TF-IDF值排序(从大到小)及信息储存。 输入输出标注清楚;输入为已分词后的评论信息的csv文件(无需再分词),输出结果为排序后的词语及TF-IDF值,且无重复词语同时出现,输出形式为csv文档;标注详细清晰;以注释形式描述所使用的公式。
时间: 2024-03-11 11:48:00 浏览: 62
以下是使用Python编写的TF-IDF算法的完整代码:
```python
import csv
import math
from collections import Counter
# 读入已分词的csv文件,将每行信息作为一个文档,并以列表形式呈现
def load_corpus(file_path):
corpus = []
with open(file_path, 'r', encoding='utf-8') as f:
reader = csv.reader(f)
for row in reader:
corpus.append(row)
return corpus
# 统计词频
def count_tf(corpus):
tf_corpus = []
for doc in corpus:
tf_doc = Counter(doc)
for word in tf_doc:
tf_doc[word] = tf_doc[word] / len(doc) # 计算TF值
tf_corpus.append(tf_doc)
return tf_corpus
# 计算每个词语在所有文档中出现的文档频率IDF值
def count_idf(corpus):
idf_dict = {}
N = len(corpus)
for doc in corpus:
for word in set(doc):
idf_dict[word] = idf_dict.get(word, 0) + 1
for word in idf_dict:
idf_dict[word] = math.log(N / (idf_dict[word] + 1)) # 计算IDF值
return idf_dict
# 计算每个词语的TF-IDF值
def count_tf_idf(tf_corpus, idf_dict):
tf_idf_corpus = []
for tf_doc in tf_corpus:
tf_idf_doc = {}
for word in tf_doc:
tf_idf_doc[word] = tf_doc[word] * idf_dict.get(word, 0) # 计算TF-IDF值
tf_idf_corpus.append(tf_idf_doc)
return tf_idf_corpus
# 对TF-IDF值进行排序,并保存结果到csv文件中
def sort_tf_idf(tf_idf_corpus, output_path):
sorted_dict_list = []
for tf_idf_doc in tf_idf_corpus:
sorted_dict = {k: v for k, v in sorted(tf_idf_doc.items(), key=lambda item: item[1], reverse=True)}
sorted_dict_list.append(sorted_dict)
words = set()
for sorted_dict in sorted_dict_list:
words.update(sorted_dict.keys())
with open(output_path, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f)
writer.writerow(['word', 'tf-idf'])
for word in words:
for i, sorted_dict in enumerate(sorted_dict_list):
tf_idf_value = sorted_dict.get(word, '')
if tf_idf_value != '':
writer.writerow([word, tf_idf_value])
break
# 主函数
def main(input_path, output_path):
corpus = load_corpus(input_path)
tf_corpus = count_tf(corpus)
idf_dict = count_idf(corpus)
tf_idf_corpus = count_tf_idf(tf_corpus, idf_dict)
sort_tf_idf(tf_idf_corpus, output_path)
if __name__ == '__main__':
input_path = 'input.csv' # 输入文件路径
output_path = 'output.csv' # 输出文件路径
main(input_path, output_path)
```
注释:
- `load_corpus`函数:读入已分词的csv文件,将每行信息作为一个文档,并以列表形式呈现。
- `count_tf`函数:统计词频,并计算每个文档中每个词语的TF值。
- `count_idf`函数:计算每个词语在所有文档中出现的文档频率IDF值。
- `count_tf_idf`函数:计算每个词语的TF-IDF值。
- `sort_tf_idf`函数:对TF-IDF值进行排序,并保存结果到csv文件中。
- `main`函数:主函数,依次调用上述函数。
阅读全文