针对应用于文本分类问题的TF-IDF改进方法_F_Guardian的博客-CSDN博客_tf-idf改进TF-IDF是一种统计方法,用以评估某一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。二、传统TF-IDF的不足对于传统的TF-IDF而言,可以计算出在一文档集合中特定文档里所包含的区别于其他文档的重要词语,换言之就是关键词。三、TF-IDF的改进1、TF部分的改进这里考虑将文档内的词频率更改为同一类文档内的词频率可以在一定程度上解决上面提到的第2项不足之处。2、IDF部分的改进传统的IDF通https://blog.csdn.net/fyfmfof/article/details/44034401文中所提到IF-IDF算法的改进方法进行了代码实现,实现方式仅供参考,IDF的改进方式采用的是第二种方案。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import math
# 由上面方法调用,计算类别中每个词在当前类别中出现的文档频率,返回所有文档集合中,每个词汇对应的文档频率
def getclassWordTextNumber(texts, classWordNumber):
classWordTextNumber = {}
wordTextNumber = {}
for className in texts:
# 初始化对应类别
classWordTextNumber[className] = {}
# 获取本分类所有文档
classTexts = texts[className]
# 获取本分类所有词汇
classWords = classWordNumber[className]
for word in classWords:
# 初始化
classWordTextNumber[className][word] = 0
for text in classTexts:
if text.count(word) > 0:
classWordTextNumber[className][word] += 1
# 统计在所有文本集合中含有该词汇的文档数
if wordTextNumber.__contains__(word):
wordTextNumber[word] += classWordTextNumber[className][word]
else:
wordTextNumber[word] = classWordTextNumber[className][word]
return classWordTextNumber, wordTextNumber
# 统计每个词在自己类别对应的数量
def compute(texts):
classWordNumber = {}
wordNumber = {}
classWordSum = {}
# 总文本数
textSum = 0
# 词汇总数
wordSum = 0
for className in texts:
# 一类文本中的词汇总和
classSum = 0
# 如果不存在就初始化一个
if classWordNumber.__contains__(className) == False:
classWordNumber[className] = {}
# 获取对应数据
classTexts = texts[className]
for text in classTexts:
textSum += 1
for word in text:
classSum += 1
wordSum += 1
# 类别字典中添加
if classWordNumber[className].__contains__(word):
classWordNumber[className][word] += 1
else:
classWordNumber[className][word] = 1
# 非类别字典中添加
if wordNumber.__contains__(word):
wordNumber[word] += 1
else:
wordNumber[word] = 1
# 统计一类文档的词汇总和
classWordSum[className] = classSum
# 计算每个词汇在所有类别文档当中出现的文档数
classWordTextNumber, wordTextNumber = getclassWordTextNumber(texts, classWordNumber)
return classWordNumber, classWordTextNumber, wordNumber, wordTextNumber, classWordSum, textSum, wordSum
# 计算每个类别中词汇的重要程度排名,核心方法
def computeIfIdf(texts):
classWordWeight = {}
# 获取结果值
# 1.每类文档中单个词出现的次数
# 2.每类文档中单个词:每类文档出现了此词的文档数
# 3.每个词在文档集合中出现的次数
# 4.文档中的单个词:所有文档出现了此词的文档数
# 5.每类文档的词汇总数
# 6.文档数量总和
# 7.文档集合总的词汇总和
classWordNumber, classWordTextNumber, wordNumber, wordTextNumber, classWordSum, textSum, wordSum = compute(texts)
# classWordNumber, classWordTextNumber, wordNumber, wordTextNumber, classWordSum, textSum, wordSum = compute(texts)
# print(classWordNumber)
# print(classWordTextNumber)
# print(wordNumber)
# print(wordTextNumber)
# print(classWordSum)
# print(textSum)
# print(wordSum)
for className in classWordNumber:
# 初始化
classWordWeight[className] = []
textWordNumber = classWordNumber[className]
for word in textWordNumber:
# IF = 同一类文档中的词频率
IF = textWordNumber[word] / classWordSum[className]
# IDF = ln(1 + (词当前类别词频率) / (词其它类别词频率))
# 词当前类别词频率
x = classWordNumber[className][word] / classWordSum[className]
# 词其它类别词频率, 说明:出现这种情况说明这个词是这个类文档中独一无二的词,非常重要
y = (wordNumber[word] - classWordNumber[className][word]) / (wordSum - classWordSum[className])
# 这里计算IDF,0.001做平滑处理
IDF = math.log(1 + x / (y + 0.001))
# 计算权重
wight = IF * IDF
# 将计算出的权重值记录下来
classWordWeight[className].append((word, wight))
# 对返回结果进行排序处理
# sorted(res, key=lambda x: x[1], reverse=True)
for className in classWordWeight:
val = classWordWeight[className]
classWordWeight[className] = sorted(val, key=lambda x: x[1], reverse=True)
return classWordWeight
# 测试使用
if __name__ == '__main__':
# 用来存储类别文档集合数据,输入格式
texts = {'class1': [['我', '我', '高兴', '的'], ['做', '这'], ['件', '事']],
'class2': [['我', '是'], ['中国', '人'], ['人']],
'class3': [['我', '非常'], ['的', '开心'], ['今天']]}
res = computeIfIdf(texts)
print(res)
for name in res:
print(res[name])