前言
仅记录学习过程,有问题欢迎讨论
优势:
-
可解释性好
可以清晰地看到关键词
即使预测结果出错,也很容易找到原因 -
计算速度快
分词本身占耗时最多,其余为简单统计计算 -
对标注数据依赖小
可以使用无标注语料完成一部分工作 -
可以与很多算法组合使用
可以看做是词权重
劣势:
1.受分词效果影响大
2.词与词之间没有语义相似度
3.没有语序信息(词袋模型)
4.能力范围有限,无法完成复杂任务,如机器翻译和实体挖掘等
5.样本不均衡会对结果有很大影响
6.类内样本间分布不被考虑
代码
Demo1:手动实现TFIDF
"""
实现一个 TFIDF
"""
import jieba
import math
import os
import json
from collections import defaultdict
def build_tf_idf_dict(corpus):
tf_dict = defaultdict(dict) # key:文档序号,value:dict,文档中每个词出现的频率
idf_dict = defaultdict(set) # key:词, value:set,文档序号,最终用于计算每个词在多少篇文档中出现过
for text_index, text_words in enumerate(corpus):
for word in text_words:
if word not in tf_dict[text_index]:
tf_dict[text_index][word] = 0
tf_dict[text_index][word] += 1
idf_dict[word].add(text_index)
idf_dict = dict([(key, len(value)) for key, value in idf_dict.items()])
return tf_dict, idf_dict
# 根据tf值和idf值计算tfidf
def calculate_tf_idf(tf_dict, idf_dict):
tf_idf_dict = defaultdict(dict)
for text_index, word_tf_count_dict in tf_dict.items():
for word, tf_count in word_tf_count_dict.items():
tf = tf_count / sum(word_tf_count_dict.values())
# tf-idf = tf * log(D/(idf + 1))
tf_idf_dict[text_index][word] = tf * math.log(len(tf_dict) /