文本挖掘: 词语关联挖掘之平行关系发现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本挖掘: 词语关联挖掘之平行关系发现相关的知识,希望对你有一定的参考价值。
参考技术A 那么, 怎么如果有条件概率了, 我们怎么算联合概率呢? 可以倒腾一下条件概率公式, 得到 P(a, b) = P(b) · P(a|b), 也就是说两个事件ab共同发生的概率 = a发生的概率 x 已知a发生条件下b发生的概率;
于是, 我们得到了
信息熵 = 不确定性
note: 此处p(x)是x发生的概率.
注意观察这个定义函数, 就可以发现, 因为p(x)<1, 所以如果p(x)值越小且x数目越多的话, 这个H(X)将增大.
因此, 很容易知道, 汉语的信息熵是比英语大不少的, 因为汉语文字数目大于英语文字数目, 且汉语长尾词语非常多, 他们相对来说概率都比较小, 很容易拉高H的值.
联合熵: H(X, Y) = - Σp(x, y) log(p(x, y)), 其实就是把p(x)替换成了p(x,y)代表联合概率.
条件熵: 在一个随机变量已知的时候, 另外一个变量的不确定性
H(Y|X) = - Σp(x, y) log(p(y|x))
链式规则: H(X, Y) = H(X) + H(Y|X)
互信息: I(X; Y) = Σp(x, y) log p(x, y)/p(x)p(y)
互信息的性质: I(X; Y) = H(X) - H(X|Y)
I指标其实就是表现的两个实体之间的相关程度. 如果X和Y完全独立, 那么I(X; Y) = H(X)- H(X) = 0
举例子: I(计算机软件, 软件) > I(计算机, 汽车)
what:
两种关系,
聚合关系/平行关系: paradigmatic
组合关系/共同关系: syntagmatic
上下文中A能被B替换, 那这是聚合关系. //平行关系, 比如cat , dog
A和B能放在一起做搭配, 那么这是组合关系 //共同关系, 互补 比如cat, eat
why?
应用: 信息检索中的search suggestion, 主题图谱entity map.
How?
词语关联, 对于平行关系词语来说,他们往往有十分相似的context.
my cat eats fish on Saturday.
my dog eats meat on Monday.
平行关系: 按照常识, 上下文context相似度高的词是平行关系.
组合关系: 组合关系是一种词语的搭配关系. 按照常识, 这两个词会一起搭配使用. 如果共同出现的概率高, 而独自出现的概率低, 那么就是组合关系.
所以我们由此得出的初步结论:
对于平行关系的, 我们获取每个词语的context, 然后计算词语间context的相似度, 相似度高的就是平行关系.
对于组合关系的, 同时出现在某个语段context(比如一句话或者一段话)中的概率高, 而两个词语独自出现的概率比较低, 那么这两者就是组合关系.
有意思的是, 如果两个词语是平行关系的话, 那么他们往往有着相同的组合关系词语来搭配使用. 比如dog eats meat. cat eats meat.
那么接下去, 我们首先注意到一个问题, 如何获取每个词语的context?
我们可以把context转化为一个我们熟悉的概念 -- document, 这样我们就可以利用以前学过的文档相似度计算的很多方法了.
这里, 我们约定Context = pseudo doc = bag of words词袋
这里词袋的大小选择起来有很多种方法
比如下面这个公式
Sim("cat","dog") = Sim(Left1("cat"),Left1("dog")) + Sim(Right1("cat"), Right1("dog")) + ... + Sim(Win8("cat"), Win8("dog"))
其中, Window8("cat") = "my","his","big", "eats", "fish"
我们将使用Vector Space Model. 非常常见, 往往用在文本分类, 情感分类上.
当我们定好了词袋, 也就是我们的doc以后, 我们将会把它转化为多维度空间中的一个向量.
这个空间有n个维度, 这个维度大小取决于文本库corpus的总体独特单词数, 因此维度数目非常地大.
假设表示一个doc("cat") = "eats": 5, "ate":3, "is":10 , ...
doc("cat")可能被表示为如下:
表示成向量后, 我们的下一个问题是: 怎么计算相似度?
求相似度往往使用余弦定理: cos(a, b) = a · b / |a||b| ,
但是, 在我们真正开始算之前, 我们得先进行标准化(正规化), 否则各个维度上的向量长度不一, 会出现大数吃小数的现象. 要深刻理解余弦定理是为了求解向量之间夹角的大小, 或者说a向量在b向量单位化后方向上投影的长度(值是0~1)
因此,
d1 = (x1, x2, ... xn), 其中xi = c(wi, d1)/|d1|, c = count, 换句话说, xi是x在d1中出现的概率
Sim(d1, d2) = d1 · d2 = x1y1 + ... + xnyn = Σ(1~n) xiyi 求解向量内积
如果Sim = cos = 1, 夹角为0°, 那么就是完全的平行关系, 即同义词
这个模型还存在的问题:
某些频繁出现的词仍然存在压制其他词影响力的可能.
存在大量的废词, 比如and, or, the 等等...
对空间的浪费, 这个维度数过高了(n如果在这里可能>=10k, 毕竟英语还是汉语的词语都是非常多的)
为了解决上述简单模型条件下存在的问题, 我们引入TF-IDF term weighting.
我们首先重新定义怎么计算TermFrequency. 过去是出现一次我就+1, 所以在词袋中出现10次, TF=10
现在, 我们决定压制那些出现次数过多的词, 因此考虑引入两种朴素办法, 0/1 bit法, 或者对数函数法.
此处, 请务必记得我们约定y: 处理后的TF变形值, x : C(wi, d1) 词语出现频次
TF transformation method:
第二种对数函数的方法已经比较好用了, 但是我们追求完美! 于是乎我们又整出了第三种更牛逼一点的TF计算方法, 它是BM25算法的中对于TF部分的计算方法.
y = BM25(x) = (k+1)·x / (x+k), k是认为调整的参数, k是容忍参数. k越大, 对freq words越没有任何调整. 求导后, 可以看到当k->∞, y->x.
k=0, 其实就是bit hot.
所以, BM25的TF计算完美实现了可以自由设定对高频词语维度容忍参数k.
IDF: IDF(word) = log[(M+1)/m] ,
其中m = total number of docs containing word, 是一个变量, 可以看到, m越大, IDF会相应变得越小.
M: total number of docs in collection, 是一个常数
造成效果是: 文档出现频率m越高的词语word, 会相应有一个较低的IDF weight. 当一个词语几乎每篇文档都出现的时候, 那么 IDFweight会很接近 log(1) = 0. 而一个词语出现得非常罕见, 比如unicorn, 那么它的IDFweight会被对数函数限制增长速度, 而不至于变得过大.
我们约定word[i] = wi, document[1] = d1, i指的是第i个元素.
那么, 现在我们整篇文章的对于平行关系发现的论述就归于如下两步:
第一步:
第二步:
再次强调, 现在 xi, yi来自BM25(wi, d1) / ΣBM25(wj, d1) , 即BM25\'s TF of wi / BM25\'s TF sum of all, 是∈[0, 1]的标准化量.
相似度的计算例子
End.
R语言关联分析之啤酒和尿布
关联分析
概述
啤酒和尿布的故事,我估计大家都听过,这是数据挖掘里面最经典的案例之一。它分析的方法就关联分析。
关联分析,顾名思义,就是研究不同商品之前的关系。这里就发现了啤酒和尿布这两个看起来毫不相关的东西直接存在的微妙关系。
最经典的关联分析算法之一就是Apriori算法,也是数据挖掘十大算法之一。在R中就有一个包可以做关联分析——arules和arulesViz,前者用于关联规则的数字化生成而后者是前者的扩展包,它提供了几种对关联分析结果可视化技术,从分析到可视化一站式完成。
在了解学习关联分析之前,我们需要知道以下几个名词。
项集
英文名itemset,它是一个集合,举个例子,一个商场的所有商品的就是一个集合,也是一个项集。
关联规则
英文名Association Rule。一般记为X->Y,X成为关联规则的先决条件,Y称为关联规则的结果。关联规则有三个核心概念:支持度,置信度,提升度。
支持度
英文名Support。它表示的是项集{X,Y}同时含有X, Y的概率。该指标是建立强关联规则的第一个门槛,衡量所考察关联规则在量上的多少。我们可以通过最小阈值的设定,来剔除那些支持度较小的。
置信度
英文名 Confidence。它是第二个门槛
,在这里我们也可以设置最小阈值。置信度表示在关联规则的先决条件X发生的条件下,Y发生的概率。如果跟前面的项集的概念联系到一块,置信度的意思就是如果在含有X的项集里面也含有Y的可能性。
confidence(X—>Y)=P(Y|X)=P(X, Y)/P(X)
提升度
英文名lift。提升度可以看做是对置信度的一个补充。置信度是在X发生的情况下,Y发生的概率。而提升度是在X发生的情况下,Y发生的概率与没有这个条件下项集中出现Y的可能性之比。
当lift为1时,表示X和Y相互独立,当lift值越大,关联性越强。
关联分析步骤
选出满足支持度最小的阈值的所有项集。即频繁项集。该阈值一般设为5%—10%。
从频繁项集中找出最小置信度的所有规则。置信度的阈值一般设置的比较高,如70%—90%。当然你要是想获取较多的关联规则,该阈值可以设置的较低。
apriori算法
arules包提供的apriori算法函数原型如下:
apriori(data, parameter = NULL, appearance = NULL, control = NULL)
现在来给大家介绍一下这些参数。
参数 | 作用 |
---|---|
data | 数据 |
parameter | 参数可以是一个列表,可以对支持度,置信度,每个项集所含项数的最大值最小值,以及输出结果等重要参数进行设置 |
appearance | 可以对先决条件X和关联条件Y中具体包含的那些项目进行限制。默认是没有限制的。 |
control | 控制算法的性能,也可以进行排序和报告进程。 |
现在就来分析一下啤酒和尿布的案例,arules包含有一个Groceries的数据集,该数据集是某杂货店一个月的真实交易数据,我今天就有这份数据来看看啤酒和尿布的故事是不是都是大人们编出来骗我们的。
library(arules)
data("Groceries")
由于数据集中酒的种类比较多,有canned beer,bottled beer,wine等,所以我直接把尿布napkins作为后继。
rules<-apriori(Groceries,parameter = list(supp=0.001,conf=0.22), appearance = list(rhs="napkins",default="lhs"))
在不断调整支持度和置信度,最终调到0.001和0.22,结果还是比较理想的,如果再大一点,生成的频繁项集就会比较少,而且更重要的没有包含啤酒的的项集,如果再小一点,生成的项集又太多,但包含啤酒的项集也不是很多。此时支持度为0.001,置信度为0.22,总共有53个频繁项集,但只有一条包含啤酒的频繁项集。当把支持度或置信度再调大一点,就没有包含酒的频繁项。
现在使用arulesViz
包对结果进行可视化
library(arulesViz) plot(rules)
关联规则点的颜色深浅有提升度lift值得高低来决定的。
从图片中可以看到提升度高的,支持度比较低,置信度较高。
plot(x, method = NULL, measure = "support", shading = "lift", interactive = NULL, engine = "default", data = NULL, control = NULL, ...)
如果我们要查看每个点所代表的项集,可以使用参数interactive。这样绘制的图形是交互式的。点击inspect就可以获取选定点的详细信息,点击一个点,再点filter按钮,然后点击右侧颜色条,就可以将小于该关联规则lift的其他关联规则点都过滤掉。
当一块点比较密集时,可以选两个点构成一个矩形区域,再点击zoom in就可把该区域放大,点击zoom out就会缩小。点击end就是退出。可以看下面的演示图。
plot(rules, interactive=TRUE)
这个包对结果的可视化效果还是很棒的,函数也提供了许多参数。下面是我简单绘制的,仅供“观赏”。
plot(rules6, method = "grouped")
其中measure参数可以控制散点的大小和颜色。
plot(rules6, method = "grouped",measure = "lift")
plot(rules6, method = "graph")
还有其他参数,在用的时候可以再好好研究。
分析完之后我有种被骗的感觉,为什么会这样,53个频繁项集,但只有一条包含啤酒的频繁项集。也许关联最强的不用分析我们都知道,关联最强的也许就是常识,往往那些关联不太强且容易被忽视到的才是最值得我们去发现的。
退一步想想,也许因为该数据量太小,只有一个月的,另外,这是数据来自一个grocery,并不是像沃尔玛那种supermarket,而且这个杂货店也不一定是美国的。所以大家可以把这篇文章看做是一个关联算法的练习。
注:
作者:王亨
公众号:跟着菜鸟一起学R语言
原文链接:http://blog.csdn.net/wzgl__wh/
以上是关于文本挖掘: 词语关联挖掘之平行关系发现的主要内容,如果未能解决你的问题,请参考以下文章