信息提取

信息熵和互信息

信息熵

即信息杂乱程度.计算公式为Σp(x) * log p(x)

互信息

表示表示两信息的关联程度.计算公式为p(x,y)/p(x)*p(y)

关键词提取

1.词频统计

原理:
  比较朴素,认为文章中出现频率高的词语即关键词。
实现:
  分词,停用词过滤,计算词频并排序。(取m个元素中的前n个可以用最大堆算法,数据结构学过。书上有勘误,堆排序的时间复杂度为nlogn,直接排序的复杂度才是mlogn)
不足之处:
   非常明显,因为高频词不一定就是关键词。
改进:
   引入 TF-IDF

2.TF-IDF

原理:
   文章中的高频词即关键词的想法过于朴素,关键词不仅与该文章中的词频有关,还与有多少文档包含他相关(当然,是反相关),即IDF值。即,某个词语在多个文档中同时出现,那么它能体现某文章主题的能力就越低。
实现
   分词,停用词过滤,排除不可能成为主题词的词性,计算词频和逆文档频率(IDF)。
计算公式:
   TF:count(w)/D ,其中w为某次在文章中出现的次数,D为文章总词数。
    IDF:log( N  / 1+ ∑(i=1->n)(w, DI)), 即文档总数除以所有文档中出现词语w的次数
    取对数的原因:1.对于出现频次很高的词语,将其IDF值趋近于0    2.防止权重过小
    分母加一的原因:拉普拉斯平滑,防止分母为0的情况出现。
不足之处:
    第一点,没有考虑特征在类间的分布。
    即,特征在某一类中出现的次数过大,该类中该词的TF-IDF值显然应该变大才能符合真实情况。但是根据IDF值的计算公式。IDF值却在减小,这显然不合理。
    第二点,没有考虑特征在类内的分布。
    即,特征词在类内可能会分布异常(只出现于很少的几个文档中)
适合场景
    因为要计算IDF值,所以需要大型语料库。适合具有大语料库的场景

3.textrank

    针对缺少大型语料库的场景,可以使用textrank
    ##  原理:脱胎于pagerank。将单词视为节点,单词之间有相连的关系则为边(不一定要直接相连)。同时,在给定窗口内,中心词的左右搭配词语会给中心词投票。即左右搭配越多,给自己投票的机会越多。

计算公式

    可以看出,与pagerank的不同之处在于,多了一个参数Wji,以表示节点之间边连接的重要程度。
实现过程:
    1.分词,词性标注,去除停用词
    2.构建词图。节点为词语,边为窗口内词语的关联关系。(这里体现了对词频统计的改进思想,即,并不是说,外链越多就越重要。因为参照公式,外链的增多会导致权重的下降。如果与一个节点连接的外链都是低权重外链,那么在下面的迭代中,该节点的textrank值会下降。)
    3.迭代。初始时每个节点的权重都是 1 .通过迭代来更新词语的权重。结束之后取出指定数目的高频词语
Java–核心代码实现(此处参照HanLP)

for (int i=0; i<max_iter;++i)
{
Map<String, Float> m = new HashMap<String, Float>();
float max_diff = 0;
for (Map.Entry<String, Set> entry: words.entrySet()))//words为单词到邻居节点的映射
{
String key = entry.getKey();
Set value = entry.getValue();
m.put(key, 1-d);//根据公式,节点的值设置为1-d,而后迭代更新
for (String element:value):
{
int size = word.get(element).size();//某节点邻接节点的邻接节点个数。有点拗口,分局公式,要计算某节点的权值,就需要知道其每个邻接节点有多少个邻接节点
if(key.equals(element) || size == 0) continue;//如果某节点与其邻接节点相同或者邻接节点没有邻接节点,则不进行后面的计算
m.put (key, m.get(key) + d/size*(score.get(element) == null? 0:score.get(element)))//根据前面的公式,循环迭代。其中score存放的是上一次循环计算结果
}
max_diff = Math.max(max_diff,Math.abs(m.get(key) - (score.get(key) == null ? score.get(key))))//两次计算的权重的最大值小于阈值,则停止迭代

}
score = m;
if (max_diff <= min_diff)break;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值