TF-IDF原理。
TF-IDF即是词频-逆文本频率指数,词频是某词汇在该文件中所占词汇的比例,逆文本频率指数是指拥有该词汇的文本数量与总文本数量的反比的对数。一个词汇的占有该文件的总词汇比例越大说明该词汇在该文件中越重要,越能代表该文件,但若拥有该词汇的文本越多,则越说明该词汇是一个常见词汇,不能显著地体现文本的差异性。因此取TF和IDF的乘积来代表某文件内的某词汇,当输入关键字对文件集进行搜索时,某文件中该关键字的TF-IDF值在文件集中值最大,权重最大,则该文件即是匹配度最高的文件。
文本矩阵化
使用词袋模型,以TF-IDF特征值为权重。(可以使用Python中TfidfTransformer库)
可以使用nltk来生成TF-IDF的值。
import os
import json
from multiprocessing.pool import Pool
import nltk
from nltk import Text
F_ALL = list()
def ReadFiles(filename):
global F_ALL
f = open('VOA3/' + filename, 'r', encoding='utf-8')
F = json.loads(f.read())
f.close()
print(F)
F_ALL.append(F)
def GenerateTF(test):
D_ALL = list(dict())
i = 0
for F in F_ALL:
D = dict()
j = 0 ##标记接下来的colletion的位置
print(F)
for collection in collections:
if test.tf(collection, F) != 0:
D[j] = test.tf(collection, F)
print(collection, j, D[j])
j += 1
D_ALL.append(D)
print(str(i) + '个完成')
i += 1
f = open('TF_ALL/tf_all2.txt', 'w', encoding='utf-8')
f.write(json.dumps(D_ALL))
f.close()
print('TF写入成功')
def GenerateIDF(test, colletions):
IDF = dict()
for collection in collections:
IDF[collection] = test.idf(collection)
print(IDF)
f = open('IDF/idf.txt', 'w', encoding='utf-8')
f.write(json.dumps(IDF))
f.close()
if __name__ == '__main__':
f = open('FILES/files.txt', 'r', encoding='utf-8')
filenames = json.loads(f.read())
for filename in filenames:
ReadFiles(filename)
# print(filename)
print(len(F_ALL))
print(F_ALL[-1])
f = open('DICTIONARY/dictionary.txt', 'r', encoding='utf-8')
collections = json.loads(f.read())
f.close()
print(collections)
for collection in collections:
print(collection)
test = nltk.text.TextCollection(F_ALL)
# GenerateTF(test)
GenerateIDF(test, collections)
主要代码在
test = nltk.text.TextCollection(F_ALL)
test.idf(collection)
test.tf(collection, F)
互信息
熵: 信息是不是可以量化?为什么有的信息量大有的信息量小?那么,不确定性的变化跟什么有关呢?
一,跟事情的可能结果的数量有关;二,跟概率有关。
那么,怎么衡量不确定性的变化的大小呢?怎么定义呢?
一,起码不是个负数吧,不然说句话还偷走信息呢~
二,起码信息量和信息量之间可以相加吧!
三,刚刚已经提过,信息量跟概率有关系,但我们应该会觉得,信息量是连续依赖于概率的吧!
四,刚刚也提过,信息量大小跟可能结果数量有关。假如每一个可能的结果出现的概率一样,那么对于可能结果数量多的那个事件,新信息有更大的潜力具有更大的信息量,因为初始状态下不确定性更大。
信息熵就是平均而言发生一个事件我们得到的信息量大小。所以数学上,信息熵其实是信息量的期望。
H
=
−
∑
x
ϵ
U
P
(
x
)
log
P
(
x
)
H=-\sum_{x\epsilon U}{P(x)\log P(x)}
H=−xϵU∑P(x)logP(x)
讨论下二元随机变量的情况,为了直观解释和记忆,先给出如下图解:
联合熵: 先说联合熵的定义,代表X,Y同时发生的不确定性;公式为
从上图中理解就是两个大圆的面积。
再说条件熵,代表在已知一个变量发生的条件下,另一个变量发生所新增的不确定性;公式为:
有兴趣的朋友可以自己推导一下是如何从(1)式到(2)式的,从上图中理解就是两个大圆去掉其中一个大圆所剩下的面积。
最后定义互信息,其中的一个定义就是在已知X发生的条件下,Y不确定性减少的程度,这个定义在ID3算法中也叫信息增益,计算公式可以理解为:
有兴趣的朋友可以自己推导一下是如何从(1)式到(2)式的,从上图理解就是两个大圆相交的面积,所以互信息是对偶的。