写在博客前的话:
本文主要阐述如何对一段简短的文本做特征提取的处理以及如何对文本进行分析。
本文主要脉络以一个故事 s t o r y story story 为主线,以该主线逐步延申,涉及到:文本特征提取、词汇频率统计 (TF),反文档频率 (IDF) 以及 余弦相似度 计算的概念,读者可以按照自己需求通过目录直接抵达,同时更建议从上到下按照本文介绍依次对概念逐个理解。
文本特征提取与文本分析
文本特征提取
文本特征提取的步骤一览图:
《故事 s t o r y story story 在此》:
在情人节的那天,南方小镇的大街上,下着毛毛细雨,女朋友坐在V90CC的副驾驶上,看着车载导航,说到:前面一共有三个酒店,三个酒店的点评如下:
酒店一: "It is a hotel; quiet hotel, cheap hotel; ¥200 at hotel, Nice hotel;”
酒店二: “It is a quiet hotel, Nice!”
酒店三: “It is OK with the noise, since the hotel is cheapest among hotels.”
你说,哪个酒店都行,但是女朋友说到她想去的酒店的类型:
想去的类型: {cheap, quiet, nice ,hotel},让你按照这个决定从三个酒店中选择最符合她心意的,否则晚上睡地板。
第一步:分割句子
按照空格分割
将三个酒店的点评按照空格拆分开:
酒店一: "It is a hotel; quiet hotel, cheap hotel; ¥200 at hotel, Nice hotel;”
酒店二: “It is a quiet hotel, Nice!”
酒店三: “It is OK with the noise, since the hotel is cheapest among hotels.”
拆分结果:
酒店 | 拆分结果 |
---|---|
酒店1 | { I t , i s , a , h o t e l , ; , q u i e t , , , h o t e l , c h e a p , h o t e l , ; , ¥ 200 , a t , h o t e l , , , N i c e , h o t e l , ; It, is, a, hotel, ; , quiet, , , hotel, cheap, hotel, ; , ¥200, at, hotel, , , Nice, hotel,; It,is,a,hotel,;,quiet,,,hotel,cheap,hotel,;,¥200,at,hotel,,,Nice,hotel,;} |
酒店2 | { I t , i s , a , q u i e t , h o t e l , , , N i c e , ! It, is, a, quiet, hotel, , , Nice,! It,is,a,quiet,hotel,,,Nice,!} |
酒店3 | { I t , i s , O K , w i t h , t h e , n o i s e , , , s i n c e , t h e , h o t e l , i s , c h e a p e s t , a m o n g , h o t e l s , . It, is, OK, with, the, noise, , , since, the, hotel, is, cheapest, among, hotels,. It,is,OK,with,the,noise,,,since,the,hotel,is,cheapest,among,hotels,.} |
去除数字以及标点符号
将上一步的结果进行去除数字以及标点符号的操作,去除结果为:
酒店 | 去除结果 |
---|---|
酒店1 | { I t , i s , a , h o t e l , q u i e t , h o t e l , c h e a p , h o t e l , a t , h o t e l , N i c e , h o t e l It, is, a, hotel, quiet, hotel, cheap, hotel, at, hotel, Nice, hotel It,is,a,hotel,quiet,hotel,cheap,hotel,at,hotel,Nice,hotel} |
酒店2 | { I t , i s , a , q u i e t , h o t e l , N i c e It, is, a, quiet, hotel, Nice It,is,a,quiet,hotel,Nice} |
酒店3 | { I t , i s , O K , w i t h , t h e , n o i s e , s i n c e , t h e , h o t e l , i s , c h e a p e s t , a m o n g , h o t e l s It, is, OK, with, the, noise, since, the, hotel, is, cheapest, among, hotels It,is,OK,with,the,noise,since,the,hotel,is,cheapest,among,hotels} |
所有字符全部小写
将上一步的结果进行改进,将所有的字符全部小写,结果为:
酒店 | 小写结果 |
---|---|
酒店1 | { i t , i s , a , h o t e l , q u i e t , h o t e l , c h e a p , h o t e l , a t , h o t e l , n i c e , h o t e l it, is, a, hotel, quiet, hotel, cheap, hotel, at, hotel, nice, hotel it,is,a,hotel,quiet,hotel,cheap,hotel,at,hotel,nice,hotel} |
酒店2 | { i t , i s , a , q u i e t , h o t e l , n i c e it, is, a, quiet, hotel, nice it,is,a,quiet,hotel,nice} |
酒店3 | { i t , i s , o k , w i t h , t h e , n o i s e , s i n c e , t h e , h o t e l , i s , c h e a p e s t , a m o n g , h o t e l s it, is, ok, with, the, noise, since, the, hotel, is, cheapest, among, hotels it,is,ok,with,the,noise,since,the,hotel,is,cheapest,among,hotels} |
第一步骤分割句子到此完成!
下面进行第二步去除词汇!!
第二步:去除词汇
在完成分割句子的步骤之后,此时需要对句子中一些常用词,不如代词,冠词以及功能词进行清除,原因在于这些词汇其实对我们的分析并没有用处,知识为了保证句子的完整性与语法才用的词汇,去除之。
需要去除的代词与冠词功能词包含: " a " , " t h e " , " i n " , " t o " , " I " , " h e " , " s h e " "a","the","in","to","I","he","she" "a","the","in","to","I","he","she" 等。
继续进行改进,将所有代词冠词等清除:
酒店 | 清除后结果 |
---|---|
酒店1 | { h o t e l , q u i e t , h o t e l , c h e a p , h o t e l , h o t e l , n i c e , h o t e l hotel, quiet, hotel, cheap, hotel, hotel, nice, hotel hotel,quiet,hotel,cheap,hotel,hotel,nice,hotel} |
酒店2 | { q u i e t , h o t e l , n i c e quiet, hotel, nice quiet,hotel,nice} |
酒店3 | { n o i s e , h o t e l , c h e a p e s t , h o t e l s noise, hotel, cheapest, hotels noise,hotel,cheapest,hotels} |
第三步:标准化
在完成上述的两个步骤后,接近处理的尾声,最后一步进一步对剩下的词汇做处理,去除复数的形式,去除比较级与最高级形式,修改同义词汇不同形式的词语。若上述理解起来有些不明白,可以看如下的举例:
e
.
g
.
e.g.
e.g.
(1)去除复数形式
“hotels” to “hotel”
(2)去除最高级形式
“cheapest” to “cheap”
(3)去除同义不同词
“computational” to “compute”
“computation” to “compute”
将上一步处理好的三个酒店的结果再做进一步处理,作为最终处理结果:
酒店 | 处理后结果 |
---|---|
酒店1 | { h o t e l , q u i e t , h o t e l , c h e a p , h o t e l , h o t e l , n i c e , h o t e l hotel, quiet, hotel, cheap, hotel, hotel, nice, hotel hotel,quiet,hotel,cheap,hotel,hotel,nice,hotel} |
酒店2 | { q u i e t , h o t e l , n i c e quiet, hotel, nice quiet,hotel,nice} |
酒店3 | { n o i s e , h o t e l , c h e a p , h o t e l noise, hotel, cheap, hotel noise,hotel,cheap,hotel} |
“你怎么才弄完??”女朋友埋怨道,我早就整理好了!!!
至此,我们对三个酒店的信息处理完成,即 文本特征提取 完成。
词汇频率统计(TF)
我们此步骤为将处理好的三个酒店的信息进行词汇频率统计:
Hotel1: {
h
o
t
e
l
:
5
,
q
u
i
e
t
:
1
,
c
h
e
a
p
:
1
,
n
i
c
e
:
1
hotel:5, quiet:1, cheap:1, nice:1
hotel:5,quiet:1,cheap:1,nice:1}
Hotel2: {
q
u
i
e
t
:
1
,
h
o
t
e
l
:
1
,
n
i
c
e
:
1
quiet:1, hotel:1, nice:1
quiet:1,hotel:1,nice:1}
Hotel3: {
n
o
i
s
e
:
1
,
h
o
t
e
l
:
2
,
c
h
e
a
p
:
1
noise:1, hotel:2, cheap:1
noise:1,hotel:2,cheap:1}
我们根据上面的结果构造 词频统计表格:
Vocabulary | quiet | cheap | hotel | noise | nice |
---|---|---|---|---|---|
Hotel1 | 1 | 1 | 5 | 0 | 1 |
Hotel2 | 1 | 0 | 1 | 0 | 1 |
Hotel3 | 0 | 1 | 2 | 1 | 0 |
至此,我们可以尝试去判断女朋友所求的酒店是哪个酒店了。
还记得女朋友的要求吗?
她的想法我怎么会不记得 😃
想去的类型: {cheap, quiet, nice ,hotel}
我们将首先尝试用余弦相似度来判别哪个酒店符合,不了解余弦相似度没关系,我将详细介绍一下余弦相似度与内积。
内积与余弦相似度
内积
内积可以理解为:第一个向量投影到第二个向量上,我们来举个例子:
所以,两个向量:
q
=
[
q
1
,
q
2
,
.
.
.
,
q
n
]
q=[q_1,q_2,...,q_n]
q=[q1,q2,...,qn] 与
x
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
x=[x_1,x_2,...,x_n]
x=[x1,x2,...,xn],他们的内积为:
q
⋅
x
=
∑
i
=
1
n
x
i
q
i
=
x
1
q
1
+
x
2
q
2
+
.
.
.
+
x
n
q
n
q·x=\sum_{i=1}^{n} x_iq_i=x_1q_1+x_2q_2+...+x_nq_n
q⋅x=∑i=1nxiqi=x1q1+x2q2+...+xnqn,内积的几何含义为:两个向量之间夹角的余弦。
余弦相似度
余弦相似度通过计算两个向量之间的夹角余弦值来评估两个向量的相似度。
计算 向量
q
q
q 与 向量
x
x
x 的余弦相似度公式为:
C
o
s
S
i
m
(
q
,
x
)
=
q
⋅
w
∣
∣
q
∣
∣
∣
∣
x
∣
∣
CosSim(q,x) = \frac {q·w} {||q||||x||}
CosSim(q,x)=∣∣q∣∣∣∣x∣∣q⋅w
其中,
q
⋅
w
q·w
q⋅w 为 向量
q
q
q 与 向量
x
x
x 的内积,
∣
∣
q
∣
∣
||q||
∣∣q∣∣ 代表着向量
q
q
q 的长度。
为什么我们可以用余弦来判定两个向量的相似度?下面我们论证一下余弦相似度的可行性:
第一,什么是向量的相似?
第二,为什么两个向量的余弦值可以用来判断其相似度?
我们从而两个向量之间的角度的余弦值确定两个向量是否大致指向相同的方向。
两个向量有相同的指向时,余弦相似度的值为1;
两个向量夹角为90°时,余弦相似度的值为0;
两个向量指向完全相反的方向时,余弦相似度的值为-1。
需要注意的是,余弦的相似度,与向量的长度无关的,仅仅与向量的指向方向相关
所以当求出的余弦相似度的值为1时,我们说这两个向量相似,因为他们会指向相同的方向,而相反的方向是必然其值为-1。
@GF:第一次选择酒店 ❌
我们开始根据余弦相似度来第一次选择酒店,我把上面处理好的词频统计表格粘贴来,然后将女朋友的期待 {cheap, quiet, nice ,hotel} 也按照格式放到表格中:
Vocabulary | quiet | cheap | hotel | noise | nice |
---|---|---|---|---|---|
Hotel1 | 1 | 1 | 5 | 0 | 1 |
Hotel2 | 1 | 0 | 1 | 0 | 1 |
Hotel3 | 0 | 1 | 2 | 1 | 0 |
GF_want | 1 | 1 | 1 | 0 | 1 |
我们可以将表格中 三个酒店词频统计 以及 女朋友的期待 转换成向量:
GF_want:
[
1
,
1
,
1
,
0
,
1
]
[1,1,1,0,1]
[1,1,1,0,1],记为:
G
F
GF
GF
Hotel1:
[
1
,
1
,
5
,
0
,
1
]
[1,1,5,0,1]
[1,1,5,0,1],记为:
H
1
H_1
H1
Hotel2:
[
1
,
0
,
1
,
0
,
1
]
[1,0,1,0,1]
[1,0,1,0,1],记为:
H
2
H_2
H2
Hotel3:
[
0
,
1
,
2
,
1
,
0
]
[0,1,2,1,0]
[0,1,2,1,0],记为:
H
3
H_3
H3
至此,我们可以求每个酒店向量与女朋友的期待向量的余弦相似度了!
C
o
s
S
i
m
(
G
F
,
H
1
)
=
1
∗
1
+
1
∗
1
+
1
∗
5
+
0
∗
0
+
1
∗
1
1
2
+
1
2
+
1
2
+
0
2
+
1
2
+
1
2
+
1
2
+
5
2
+
0
2
+
1
2
=
8
4
28
≈
0.756
CosSim(GF, H_1)=\frac {1*1+1*1+1*5+0*0+1*1} {\sqrt {1^2+1^2+1^2+0^2+1^2}+\sqrt {1^2+1^2+5^2+0^2+1^2}}=\frac 8 {\sqrt 4 \sqrt {28}}≈0.756
CosSim(GF,H1)=12+12+12+02+12+12+12+52+02+121∗1+1∗1+1∗5+0∗0+1∗1=4288≈0.756
C
o
s
S
i
m
(
G
F
,
H
2
)
=
1
∗
1
+
1
∗
0
+
1
∗
1
+
0
∗
0
+
1
∗
1
1
2
+
1
2
+
1
2
+
0
2
+
1
2
+
1
2
+
0
2
+
1
2
+
0
2
+
1
2
=
3
4
3
≈
0.866
CosSim(GF, H_2)=\frac {1*1+1*0+1*1+0*0+1*1} {\sqrt {1^2+1^2+1^2+0^2+1^2}+\sqrt {1^2+0^2+1^2+0^2+1^2}}=\frac 3 {\sqrt 4 \sqrt 3}≈0.866
CosSim(GF,H2)=12+12+12+02+12+12+02+12+02+121∗1+1∗0+1∗1+0∗0+1∗1=433≈0.866
C
o
s
S
i
m
(
G
F
,
H
3
)
=
1
∗
0
+
1
∗
1
+
1
∗
2
+
0
∗
1
+
1
∗
0
1
2
+
1
2
+
1
2
+
0
2
+
1
2
+
0
2
+
1
2
+
2
2
+
1
2
+
0
2
=
3
4
8
≈
0.530
CosSim(GF, H_3)=\frac {1*0+1*1+1*2+0*1+1*0} {\sqrt {1^2+1^2+1^2+0^2+1^2}+\sqrt {0^2+1^2+2^2+1^2+0^2}}=\frac 3 {\sqrt 4 \sqrt 8}≈0.530
CosSim(GF,H3)=12+12+12+02+12+02+12+22+12+021∗0+1∗1+1∗2+0∗1+1∗0=483≈0.530
对比来看,最大值为酒店2,所以告诉女朋友,那咱们去第二个酒店!结果没有想到的是,女朋友很不高兴,说你不了解她了,这,真的错了吗?
拿出之前各个酒店的详情一对比,欸,还真错了,应该选第一个,这咋回事??余弦相似度不好用了???
仔细观察上面的三个计算公式,对比一下,发现了点东西:
这个值异常的大,导致我们在计算余弦相似度时,分母过大使得结果变小。
那么我们该如何做???这就是我们的下一个要学习的部分反文档频率(IDF)
反文档频率(IDF)
我们现在试想这个问题:如果所有的酒店都具有这个特征,那么这个特征还叫特征吗?
我们能区分这三个酒店的不同,通过其所包含的不同的特征。但是要是所有的酒店都包含该特征,那么该特征就显得有些无足轻重。本案例中 “hotel” 特征就是如此。
“如果你没理解,那我再来举一个例子”,副驾驶的女朋友调了调座椅说到,我在人群中,你是怎么一眼看到我的?你是根据我的很多特征,去判断哦,那个漂亮的女孩子是你的女朋友。但是如果你选择的特征里有一个是有眼睛,这个特征对不对?对,因为我有眼睛,但是有没有意义?没有,因为所有女孩子都有眼睛。就是这个意思。
我们回到 IDF。IDF (inverse document frequency),称为逆文档频率,又称为反文档频率,是文档频率的倒数。IDF用来判断该特征有没有意义。
第 i i i 个特征的 I D F IDF IDF 的计算公式为:
i d f i = l o g 2 ( N d f i ) idf_i = log_2(\frac N {df_i}) idfi=log2(dfiN),其中 N N N 为一共统计了多少个个体,即个体的总数;而 d f i df_i dfi,则是document frequency的缩写,含义为统计所有的个体中有多少个个体出现了第 i i i 个特征;
在本案例中,
i
d
f
q
u
i
e
t
=
l
o
g
2
3
2
=
0.585
idf_{quiet}=log_2 \frac 3 2=0.585
idfquiet=log223=0.585
N
=
3
N=3
N=3,含义为一共存在三个酒店;
d
f
i
=
2
df_i=2
dfi=2 意味着有两个酒店包含 quiet 这个特征。
根据下表,计算所有特征的 i d f idf idf
Vocabulary | quiet | cheap | hotel | noise | nice |
---|---|---|---|---|---|
Hotel1 | 1 | 1 | 5 | 0 | 1 |
Hotel2 | 1 | 0 | 1 | 0 | 1 |
Hotel3 | 0 | 1 | 2 | 1 | 0 |
i
d
f
q
u
i
e
t
=
l
o
g
2
3
2
=
0.585
idf_{quiet}=log_2 \frac 3 2=0.585
idfquiet=log223=0.585
i
d
f
c
h
e
a
p
=
l
o
g
2
3
2
=
0.585
idf_{cheap}=log_2 \frac 3 2=0.585
idfcheap=log223=0.585
i
d
f
h
o
t
e
l
=
l
o
g
2
3
3
=
0
idf_{hotel}=log_2 \frac 3 3=0
idfhotel=log233=0
i
d
f
n
o
i
s
e
=
l
o
g
2
3
1
=
1.585
idf_{noise}=log_2 \frac 3 1=1.585
idfnoise=log213=1.585
i
d
f
n
i
c
e
=
l
o
g
2
3
2
=
0.585
idf_{nice}=log_2 \frac 3 2=0.585
idfnice=log223=0.585
i d f i = 0 idf_i=0 idfi=0 意味着该特征对于判断向量相似度的影响最低。的确, h o t e l hotel hotel 这个属性大家都有。我们计算出所有的 i d f idf idf 了,下一步该做什么?
将TF与IDF结合!
构建TF-IDF
我们根据词频统计表与IDF的结合,得到新表(TF-IDF):
w
i
j
=
t
f
i
j
∗
i
d
f
i
w_{ij}=tf_{ij}*idf_{i}
wij=tfij∗idfi,
j
j
j 为酒店编号,
i
i
i 为特征编号。
IDF Vocabulary | quiet | cheap | hotel | noise | nice |
---|---|---|---|---|---|
Hotel1 | 0.585 | 0.585 | 0 | 0 | 0.585 |
Hotel2 | 0.585 | 0 | 0 | 0 | 0.585 |
Hotel3 | 0 | 0.585 | 0 | 1.585 | 0 |
TF-IDF 的主要思想是:如果某个词或短语在一篇文章中出现的 频率 (TF) 高,并且在其他文章中很少出现 (IDF高),则认为此词或者短语具有很好的类别区分能力,适合用来分类。
@GF:第二次选择酒店 ✔ 😃
我们再对上述的 TF-IDF表 使用余弦相似度方法进行计算,求与女朋友期待的相似度,试图找到女朋友喜欢的酒店。
IDF Vocabulary | quiet | cheap | hotel | noise | nice |
---|---|---|---|---|---|
Hotel1 | 0.585 | 0.585 | 0 | 0 | 0.585 |
Hotel2 | 0.585 | 0 | 0 | 0 | 0.585 |
Hotel3 | 0 | 0.585 | 0 | 1.585 | 0 |
GF_want | 1 | 1 | 1 | 0 | 1 |
C o s S i m ( G F , H 1 ) = 1 ∗ 0.585 + 1 ∗ 0.585 + 1 ∗ 0 + 0 ∗ 0 + 1 ∗ 0.585 1 2 + 1 2 + 1 2 + 0 2 + 1 2 + 0.58 5 2 + 0.58 5 2 + 0 2 + 0 2 + 0.58 5 2 = 0.866 CosSim(GF,H_1)=\frac {1*0.585+1*0.585+1*0+0*0+1*0.585} {\sqrt{1^2+1^2+1^2+0^2+1^2}+\sqrt{0.585^2+0.585^2+0^2+0^2+0.585^2}}=0.866 CosSim(GF,H1)=12+12+12+02+12+0.5852+0.5852+02+02+0.58521∗0.585+1∗0.585+1∗0+0∗0+1∗0.585=0.866
C o s S i m ( G F , H 2 ) = 1 ∗ 0.585 + 1 ∗ 0 + 1 ∗ 0 + 0 ∗ 0 + 1 ∗ 0.585 1 2 + 1 2 + 1 2 + 0 2 + 1 2 + 0.58 5 2 + 0 2 + 0 2 + 0 2 + 0.58 5 2 = 0.707 CosSim(GF,H_2)=\frac {1*0.585+1*0+1*0+0*0+1*0.585} {\sqrt{1^2+1^2+1^2+0^2+1^2}+\sqrt{0.585^2+0^2+0^2+0^2+0.585^2}}=0.707 CosSim(GF,H2)=12+12+12+02+12+0.5852+02+02+02+0.58521∗0.585+1∗0+1∗0+0∗0+1∗0.585=0.707
C o s S i m ( G F , H 3 ) = 1 ∗ 0 + 1 ∗ 0.585 + 1 ∗ 0 + 0 ∗ 1.585 + 1 ∗ 0 1 2 + 1 2 + 1 2 + 0 2 + 1 2 + 0 2 + 0.58 5 2 + 0 2 + 1.58 5 2 + 0 2 = 0.173 CosSim(GF,H_3)=\frac {1*0+1*0.585+1*0+0*1.585+1*0} {\sqrt{1^2+1^2+1^2+0^2+1^2}+\sqrt{0^2+0.585^2+0^2+1.585^2+0^2}}=0.173 CosSim(GF,H3)=12+12+12+02+12+02+0.5852+02+1.5852+021∗0+1∗0.585+1∗0+0∗1.585+1∗0=0.173
这次女朋友笑了,上来亲了一口,美滋滋啊! 😃
话不多说了,我开着V90CC去第一个酒店了,剩下晚上会发生什么,自己脑补吧。
2022年11月4日 2:07
海韵轩