任务描述:Task3特征选择
TF-IDF原理以及利用其进行特征筛选
互信息的原理以及利用其进行特征筛选
TFIDF
在将文本分词并向量化后,我们可以得到词汇表中每个词在各个文本中形成的词向量,如果直接将统计词频后的特征作为文本分类的输入,会出现词频不能反映词的重要性的问题。因此我们需要进一步的预处理来反应文本的这个特征,这个预处理就是TF-IDF。
- 每一个文档的关键词(或主题词)包括哪些?
- 给定一个(或一组)关键词,与这个(或组)词最相关的文档是哪一个?
- 给定一个文档,哪个(或哪些)文档与它具有最大的相似度呢?
回答上述三个问题的关键是:对于一个给定的词和一个给定的文档,定义一个可以用来衡量该词对该文档相关性(或重要性)的指标。这个指标就是——词频-逆文档技术(Term Frequency - Inverse Document Frequency,TF-IDF)技术,它是一种用于咨询检索与文本挖掘的常用加权技术,可以用来评估一个词对于一个文档集或语料库中某个文档的重要程度。
事实上,如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。用统计学语言表达,就是在词频的基础上,要对每个词分配一个"重要性"权重。最常见的词给予最小的权重,较常见的词给予较小的权重,较少见的词给予较大的权重。这个权重叫做“逆文档频率”,它的大小与一个词的常见程度成反比。
知道了“词频”和“逆文档频率”以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个值对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。IDF反应了一个词在所有文本中出现的概率,如果一个词在很多文本中出现,那么它的IDF值应该低。
计算词频:
词
频
=
某
个
词
在
文
章
中
出
现
次
数
词频 = 某个词在文章中出现次数
词频=某个词在文章中出现次数
考虑到文章有长短之分,为了便于不同文章的比较,进行词频标准化
词
频
=
某
个
词
在
文
章
中
出
现
次
数
文
章
的
总
词
数
词频 = \frac{某个词在文章中出现次数}{文章的总词数}
词频=文章的总词数某个词在文章中出现次数
或者
词
频
=
某
个
词
在
文
章
中
出
现
次
数
该
文
出
现
次
数
最
多
的
词
的
出
现
次
数
词频 = \frac{某个词在文章中出现次数}{该文出现次数最多的词的出现次数}
词频=该文出现次数最多的词的出现次数某个词在文章中出现次数
计算逆文档频率:
此时,需要一个语料库(corpus),来模拟语言的使用环境。
逆
文
档
频
率
=
log
(
语
料
库
的
文
档
总
数
包
含
该
词
的
文
档
数
+
1
)
逆文档频率 = \log(\frac{语料库的文档总数}{包含该词的文档数+1})
逆文档频率=log(包含该词的文档数+1语料库的文档总数)
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近于0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
计算TF-IDF:
T
F
−
I
D
F
(
x
)
=
T
F
(
x
)
∗
I
D
F
(
x
)
TF-IDF(x) = TF(x) * IDF(x)
TF−IDF(x)=TF(x)∗IDF(x)
可以看到,TF-IDF与一个词在文档中出现的次数成正比,与该词在整个语言中出现次数成反比。所以,自动提取关键词的算法就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
TF-IDF的实现
参考
用gensim库来计算tfidf值
# 语料库
corpus = [
'this is the first document',
'this is the second second document',
'and the third one',
'is this the first document'
]
# 分词处理
word_list = []
for i in range(len(corpus)):
word_list.append(corpus[i].split(' '))
print(word_list)
[['this', 'is', 'the', 'first', 'document'], ['this', 'is', 'the', 'second', 'second', 'document'], ['and', 'the', 'third', 'one'], ['is', 'this', 'the', 'first', 'document']]
# 得到每个词的id值及词频
from gensim import corpora
dictionary = corpora.Dictionary(word_list)
new_corpus = [dictionary.doc2bow(text) for text in word_list]
print(new_corpus) # 元组中第一个元素是词语在词典中对应的id,第二个元素是词语在文档中出现的次数
print(dictionary.token2id) # 查看语料库中每个词对应的id
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1)], [(0, 1), (2, 1), (3, 1), (4, 1), (5, 2)], [(3, 1), (6, 1), (7, 1), (8, 1)], [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1)]]
{'document': 0, 'first': 1, 'is': 2, 'the': 3, 'this': 4, 'second': 5, 'and': 6, 'one': 7, 'third': 8}
# 载入模型
from gensim import models
tfidf = models.TfidfModel(new_corpus)
tfidf.save("my_model.tfidf")
# 使用这个训练好的模型得到单词的tfidf值
tfidf_vec = []
for i in range(len(corpus)):
string = corpus[i]
string_bow = dictionary.doc2bow(string.lower().split())
string_tfidf = tfidf[string_bow]
tfidf_vec.append(string_tfidf)
print(tfidf_vec)
[[(0, 0.33699829595119235), (1, 0.81197071719242275), (2, 0.33699829595119235), (4, 0.33699829595119235)], [(0, 0.10212329019650272), (2, 0.10212329019650272), (4, 0.10212329019650272), (5, 0.98423193445362389)], [(6, 0.57735026918962584), (7, 0.57735026918962584), (8, 0.57735026918962584)], [(0, 0.33699829595119235), (1, 0.81197071719242275), (2, 0.33699829595119235), (4, 0.33699829595119235)]]
string = 'the i first second name'
随便拿几个单词来测试
string = 'the i first second name'
string_bow = dictionary.doc2bow(string.lower().split())
string_tfidf = tfidf[string_bow]
print(string_tfidf)
[(1, 0.44721359549995793), (5, 0.89442719099991586)]
- gensim训练出来的tf-idf值左边是词的id,右边是词的tfidf值
- gensim有自动去除停用词的功能,比如the
- gensim会自动取出单个字母,比如i
- gensim会去除没有训练到的词
- 所以通过gensim不能计算每个单词的tfidf值
互信息
点互信息PMI
点互信息(Pointwise Mutual Information)这个指标常常用来衡量两个事物之间的相关性(比如两个词)。公式如下:
PMI
(
x
;
y
)
=
log
p
(
x
,
y
)
p
(
x
)
p
(
y
)
=
log
p
(
x
∣
y
)
p
(
x
)
=
log
p
(
y
∣
x
)
p
(
y
)
\operatorname{PMI}(x ; y)=\log \frac{p(x, y)}{p(x) p(y)}=\log \frac{p(x | y)}{p(x) }=\log \frac{p(y | x)}{p(y)}
PMI(x;y)=logp(x)p(y)p(x,y)=logp(x)p(x∣y)=logp(y)p(y∣x)
如果x跟y不相关,则
p
(
x
,
y
)
=
p
(
x
)
p
(
y
)
p(x,y)=p(x)p(y)
p(x,y)=p(x)p(y)。二者相关性越大则p(x,y)相比于p(x)p(y)越大。
互信息MI
点互信息其实就是从信息论里面的互信息这个概念里衍生出来的。互信息为:
I
(
X
;
Y
)
=
∑
x
∈
X
∑
y
∈
Y
p
(
x
,
y
)
log
p
(
x
,
y
)
p
(
x
)
p
(
y
)
I(X ; Y)=\sum_{x \in X} \sum_{y \in Y} p(x, y) \log \frac{p(x, y)}{p(x) p(y)}
I(X;Y)=x∈X∑y∈Y∑p(x,y)logp(x)p(y)p(x,y)
其衡量的是两个随机变量之间的相关性,即一个随机变量包含的关于另一个随机变量的信息量。
可以看出,互信息其实就是对X和Y的所有可能取值情况的点互信息PMI的加权和。