个人学习nlp笔记:学习材料CS124、COSC572和《Speech and Language Processing》第三版
1.朴素贝叶斯
本质上就是机器学习中的监督学习的分类方法,情感是否正向(0或1)就是我们所预测
y
^
\hat{y}
y^等等等等
1.1 朴素贝叶斯推导
本文提到的是multinomial 朴素贝叶斯,即特征向量不是连续的,是0~x的整数。其中的特征向量其实就是词袋向量(bag-of-words),即每个单词在一篇文章或句子中的计数组成的一维向量。
P
(
d
)
P(d)
P(d)是参数,省略
最大后验的贝叶斯和朴素贝叶斯分类器
1.2 朴素贝叶斯训练
先验
P
(
c
)
P(c)
P(c)等于类别c出现的概率
假定
P
(
w
i
∣
c
)
P(w_{i}|c)
P(wi∣c)是独立的,则likelihood
P
(
w
i
∣
c
)
P(w_{i}|c)
P(wi∣c)等于在c类中,单词
w
i
w_{i}
wi出现的概率(出现的次数处以c类中出现的所有单词次数合)
朴素贝叶斯中的Laplace平滑:
下面是简化版流程和伪代码
1.3朴素贝叶斯和语言模型
朴素贝叶斯有点像多个unigram,以情感positive或者negative为例子,就像训练了一个
L
M
n
e
g
LM_{neg}
LMneg和一个
L
M
p
o
s
LM_{pos}
LMpos,如果
L
M
n
e
g
LM_{neg}
LMneg的概率较大,则句子的情感被分为negative
我们也可以使用词袋模型的子空间(去掉很多诸如I,and等中性词),不过词袋模型丢失了很多信息,比如词在原文中的位置等等。
1.4效果评估:Precision,Recall, F-measure & accuracy
以二分类问题为例:
contingency table -> 列联表
gold label -> 人类给定的标签,也就是所谓正确的label
false positive -> select as positive falsely
在一些例子中,比如判断一个词是不是一个鞋的品牌名字,这种情况下,可能我们99.9%的词都不是鞋的品牌(eg.1000个词,只有十个positive的),那我们岂不是所以都标“negative”,那准确率也有99.9%了?所以此时就应该考虑召回率或准确度,在这个例子中:
R
e
c
a
l
l
=
#
o
f
p
o
s
i
t
i
v
e
t
r
u
e
l
y
#
o
f
(
p
o
s
i
t
i
v
e
t
r
u
e
l
y
+
n
e
g
a
t
i
v
e
f
a
l
s
e
l
y
)
=
0
0
+
10
=
0.0
%
Recall = \frac{\# of\ positive\ truely}{\# of\ (positive\ truely+negative\ falsely)} = \frac{0}{0+10}=0.0\%
Recall=#of (positive truely+negative falsely)#of positive truely=0+100=0.0%
P
r
e
c
i
s
i
o
n
=
#
o
f
p
o
s
i
t
i
v
e
t
r
u
e
l
y
#
o
f
(
p
o
s
i
t
i
v
e
t
r
u
e
l
y
+
p
o
s
i
t
i
v
e
f
a
l
s
e
l
y
)
=
0
0
+
0
=
e
m
m
m
m
Precision= \frac{\# of\ positive\ truely}{\# of\ (positive\ truely+positive\ falsely)} = \frac{0}{0+0}= emmmm
Precision=#of (positive truely+positive falsely)#of positive truely=0+00=emmmm
换个例子
分类器选出来40个positive,其中8个正确
gold positive | gold negative | |
---|---|---|
system positive | 8 | 32 |
system negative | 2 | 958 |
此时
R
e
c
a
l
l
=
#
o
f
p
o
s
i
t
i
v
e
t
r
u
e
l
y
#
o
f
(
p
o
s
i
t
i
v
e
t
r
u
e
l
y
+
n
e
g
a
t
i
v
e
f
a
l
s
e
l
y
)
=
8
8
+
2
=
80.0
%
Recall = \frac{\# of\ positive\ truely}{\# of\ (positive\ truely+negative\ falsely)} = \frac{8}{8+2}=80.0\%
Recall=#of (positive truely+negative falsely)#of positive truely=8+28=80.0%
P
r
e
c
i
s
i
o
n
=
#
o
f
p
o
s
i
t
i
v
e
t
r
u
e
l
y
#
o
f
(
p
o
s
i
t
i
v
e
t
r
u
e
l
y
+
p
o
s
i
t
i
v
e
f
a
l
s
e
l
y
)
=
8
8
+
32
=
20.0
%
Precision= \frac{\# of\ positive\ truely}{\# of\ (positive\ truely+positive\ falsely)} = \frac{8}{8+32}= 20.0\%
Precision=#of (positive truely+positive falsely)#of positive truely=8+328=20.0%
Recall和Precision之间存在一种权衡的关系,增加Recall的同时Precision会降低,所以我们可以用F-score,一个recall和precision的结合(调和平均)来计算
调和平均是一个比较保守的评估方法,对比于算术平均,其的值会更接近两个数中比较小的那个,所以其给Recall和Precion中比较小的那个更大的权重。
多分类问题:
使用microaverage和macroaverage使数据更直观:
macroaverage是从宏观角度上,总和,再求准确度,而microaverage是按每个类求准确度再平均
交叉验证:
1.5 实践经验
朴素贝叶斯很适合小数据,而且即使在这样的情况下也不会过拟合
数据量合适时候
数据量足够时,分类器的影响不大
不同领域的特征和术语的处理也很重要,而词干提取帮助不大。给与比如标题等更大的权重也是不错的选择
part number 零件号码
1.6 模型比较的统计检验
我们可以通过macro-averaged F1进行比较,看那个得分高,但是你不知道是不是因为test分割的巧合,导致其恰巧准确率高,所以我们可以引入统计学的方法来检验。模型A和B的分类结果的差为 δ ( x ) \delta(x) δ(x),为了验证这个 δ ( x ) \delta(x) δ(x)大概率不是靠运气的,我们用统计推断方法。
我们可以使用一种非参的方法,bootstrap 检验。bootstrapping 这个词指的是从原始的大样本中反复地有放回地抽取大量较小的样本。引导测试的直观性在于,我们可以通过重复地从观察到的测试集中进行采样来创建许多虚拟(virtual)测试集。该方法假设样本代表总体。
intuition就是若随机样本的准确率差大于
δ
(
x
)
\delta(x)
δ(x),则我们拒绝原假设,并且高概率(1-p值)下,认定我们的
δ
(
x
)
\delta(x)
δ(x)不是一个随机的,偶然的结果。
比如,每次从test set在随机抽10个,用AB两个模型进行比较,得到A和B两个模型在b轮分类的准确性的差。
因为我们是从训练集中抽样,所以我们得到的模型A和模型B的分类准确率差
δ
(
x
∗
(
i
)
)
\delta(x^{*(i)})
δ(x∗(i))和在整个测试集中得到的
δ
(
x
)
\delta(x)
δ(x)相近或说散布在其周围,即大约有一半的A能超过B,
δ
(
x
)
\delta(x)
δ(x)大小的准确率。然后
δ
(
x
∗
(
i
)
)
−
δ
(
x
)
\delta(x^{*(i)})-\delta(x)
δ(x∗(i))−δ(x)(中心化),再进行比较,也就是看是否
δ
(
x
∗
(
i
)
)
−
δ
(
x
)
>
δ
(
x
)
\delta(x^{*(i)})-\delta(x)>\delta(x)
δ(x∗(i))−δ(x)>δ(x)或者说,是否
δ
(
x
∗
(
i
)
)
>
2
δ
(
x
)
\delta(x^{*(i)})>2\delta(x)
δ(x∗(i))>2δ(x)。
至于为什么是 δ ( x ) \delta(x) δ(x)而不是0什么的…作者这么解释的, δ ( x i ) \delta(x^{i}) δ(xi)是对称且其的均值为 δ ( x ) \delta(x) δ(x)是,这样就等于 δ ( x i ) < 0 \delta(x^{i})<0 δ(xi)<0…emmmmm…不懂。这tm,怎么想都是对称啊。。因为是有对称界的区间,而且有均值$\delta(x)。
从直觉试着解释。。这应该是个枢轴量置信区间,也就是原假设不是高斯分布,不能用方差来规划置信区间,直接由
α
\alpha
α的分位数计算。好像挺可能是这样的
具体的过程:
1.7 特征选择
可以使用类似决策树中信息增益的方法来挑选
2.情感分析
书:J+M (3ed) Chapter 19, "Lexicons for Sentiment, Affect, and Connotation" pages 1-6 plus section 19.6 (pages 14-15)
看法的好坏是最常见的一个研究,其的发出者,接收者,何种态度都很关键。
由易至难的情绪分析
2.1 情绪词汇(sentiment lexicons)
每个词可能都代表着不同的情感色彩
本节介绍了几种情绪词汇的数据集:
①The General Inquirer
②LIWC
③MPQA
④Bing Liu opinion lexicons
这些词库不仅有重叠,而且在一些字词上有着不同的意见
在IMDB评论集里分析词的两面性,其实也就是不同评价(评分或星数)中出现的概率
再看看逻辑否定词no, not, never,果然也是在低评分上出现的频繁
2.2 句子中的情绪(sentiment)
2.2.1 寻找情绪的目标
感觉sentiment翻译成观点更好些。
上文主要说了一段话的正负情感,这里介绍了句子中的情感分析,比如找到下面这句话的情感,和这个情感是对谁的(food还是service),比如food->great,service->awful,显然更微观。
可以根据频繁出现的短语和基于规则来找到target也就是情绪针对的词,比如great fish tacos, fish tacos在great(情感词)后,所以fish tacos很可能是一个目标(target)或者,比如短语fish tacos经常在这段话里,说明其很可能是target
如果我们做一个很有针对性的任务,比如做酒店的评论训练,我们可以提前指定target再找哪句话和哪个target有关。这时候我们可以加入一个监督学习分类器,以hotel为例子,看是否这个句子/短语/从句能被归类到food,serviece…或者None(也就是他说不定只是瞎扯没提到具体的),而restaurant这是我们已知的条件,我们针对这个类型的评论做数据集,再训练分类器
2.2.2 Goldenson 算法
Goldenson 算法:
①爬取评论,抽取文本进行预处理,获得句子和短语。
②使用情绪分类器识别是positive还是negative
③看这个句子和哪个特征短语有关(前文的target,也就是hotel例子中的food)并合并food +; decor -;
④总结
结果
2.2.3 实践上的细节
如果获得的正负情绪评论很不平均,如10w个positive但是只有1w个negative的,可以用F-score做评价,也可以随机的欠采样,使得近似;或者用代价敏感学习,比如分错了就给分类器更高的惩罚等等。
如果我们的评价是有打分的,比如0到7分,我们可以设其一半边界,把分数映射到二分类的好和坏(如大于3.5就算好),或者是线性或者序数回归,也可以用特殊的模型,比如metric labeling。
不过如果是1-7的打分,是不是应该标准化,毕竟这个开头为1而不为0
总结:
2.3 情感词汇学习
2.3.1 一个半监督学习方法
可以通过semi-supervised的方法来学习,bootstrap感觉和决策树中的有些不同,查了查,其英文含义为自助产生,所以…emmm, make sense
intuition:出现and的就算同一属性,出现but的就算相反的
第一步:手工进行分类
第二部,输入was adj and 看谷歌或其他语料库关联出来什么(关联出来的形容词就是adj的情感同向词)
第三部,用共同出现的次数来表示出词的情感情绪的相似度
第四部,进行聚类
结果,不过显然还是有挺多错误。
2.3.2 Turney 算法
第一步,提取符合这些条件的phrase(短语)特征,JJ:形容词,NN:名词单数,NNS:名词复数,RB\RBR\RBS:副词副词比较级和副词最高级
RBR就是比如 I run faster than you中的faster,RBS就是I do best in this project 的best。
VB,VBD,VBN,VBG动词、动词过去式,完成时,现在时
这属于part of speech中的内容,也就是词性判断,以后才讲到,这里都是提取修饰或能表达情绪的词
第二步,计算词组的极性(偏好偏坏)
这个方法的intuition就是在负面短语与poor共同出现的频率高,而正面的与excellent出现频率高,我们可以用逐点的互信息(PMI)计算
PMI是用来测量两个变量相关性的,从公式上理解,若在x的条件下,
p
(
x
)
>
0
p(x)>0
p(x)>0时,
P
M
I
=
l
o
g
2
p
(
x
,
y
)
p
(
x
)
p
(
y
)
=
l
o
g
2
p
(
y
∣
x
)
p
(
y
)
PMI=log_{2}\frac{p(x,y)}{p(x)p(y)}=log_{2}\frac{p(y|x)}{p(y)}
PMI=log2p(x)p(y)p(x,y)=log2p(y)p(y∣x)
以good和like为例子,
p
(
l
i
k
e
)
>
0
p(like)>0
p(like)>0时候
l
o
g
2
p
(
g
o
o
d
∣
l
i
k
e
)
p
(
g
o
o
d
)
log_{2}\frac{p(good|like)}{p(good)}
log2p(good)p(good∣like)
若good和like经常一起出现,则数值就大,而若两个字符从不一起出现,就是0
加个正
ϵ
\epsilon
ϵ),
l
o
g
2
log_{2}
log2就是信息论中转成bits计数
在 x ⊂ y x\subset{y} x⊂y时, p ( x ∣ y ) p(x|y) p(x∣y)会小于 p ( x ) p(x) p(x),若 x y = ∅ xy=\varnothing xy=∅,则为0,也就 p ( x ∣ y ) < p ( x ) p(x|y)<p(x) p(x∣y)<p(x)
hits就是出现次数
一些baby math
在点赞和踩中的结果
结果还不错,而且能得到专业相关的信息(获得的phrase)
使用更多的(比起excellent和poor),filter就是把一些明显错误的例子剔除
2.4 其他的情绪任务
可以用在相亲啥的(speed dates)
2.5 一个baseline算法
2.5.1 Tokenization
Tokenization 中可能遇到的麻烦:
其中的颜文字/表情也是同样需要处理,因为同样传递了一定的信息
2.5.2 Feature Extraction
特征提取中,如何处理否定词(negation)非常关键,不然一个isn’t good只被抓到一个good就放进positive就尴尬了。
一个处理方法就是,创造一个前面加个NOT_的新词,把标点前和否定词后的词全都改为这个形式。
2.5.3 伯努利(布尔型)朴素贝叶斯
有一些情况下,文字的出现与否要比出现多少次更加重要,这就是伯努利朴素贝叶斯的intuition。其中,我们把所有非零计数改为1
其与普通的朴素贝叶斯对比:
但是在其他文本任务中,伯努利型的就不大行了,同时,
l
o
g
(
f
r
e
q
(
w
)
)
log(freq(w))
log(freq(w))来处理词频也是一种可行的方法
2.5.5 一些无法解决的问题
语言是很巧妙的,比如第一个评论偏负面,但是没有负面的词,而是用比较形象生动甚至有些讽刺的方法来给差评,这就很难识别出来