不可思议的Word2Vec之系列三-提取关键词

本文主要是给出了关键词的一种新的定义,并且基于Word2Vec给出了一个实现方案。这种关键词的定义是自然的、合理的,Word2Vec只是一个简化版的实现方案,可以基于同样的定义,换用其他的模型来实现。

说到提取关键词,一般会想到TF-IDF和TextRank,大家是否想过,Word2Vec还可以用来提取关键词?而且,用Word2Vec提取关键词,已经初步含有了语义上的理解,而不仅仅是简单的统计了,而且还是无监督的!

I. 什么是关键词?

诚然,TF-IDF和TextRank是两种提取关键词的很经典的算法,它们都有一定的合理性,但问题是,如果从来没看过这两个算法的读者,会感觉简直是异想天开的结果,估计很难能够从零把它们构造出来。也就是说,这两种算法虽然看上去简单,但并不容易想到。试想一下,没有学过信息相关理论的同学,估计怎么也难以理解为什么IDF要取一个对数?为什么不是其他函数?又有多少读者会破天荒地想到,用PageRank的思路,去判断一个词的重要性?

说到底,问题就在于:提取关键词和文本摘要,看上去都是一个很自然的任务,有谁真正思考过,关键词的定义是什么?这里不是要你去查汉语词典,获得一大堆文字的定义,而是问你数学上的定义。关键词在数学上的合理定义应该是什么?或者说,我们获取关键词的目的是什么?

很显然,关键词也好,摘要也好,我们希望能够尽可能快地获取文章的大意,如果一篇文章的关键词是“深度学习”,我们就会知道,这篇文章不可能大谈特谈“钢铁是怎么练成的”,也就是说,我们可以由关键词来猜到文本的大意,用数学来表示,那就是条件概率

p(s|wi)p(s|wi)

这里的ss代表着一段文本,wiwi是文本中的某个词,如果wiwi是文本的关键词,那么应该使得上述概率最大。也就是说,我们只需要对句子中所有的词,算一遍上述概率,然后降序排列,就可以提取关键词了。说白了,关键词就是最能让我们猜到原文的词语。怎么估算这个概率?简单使用朴素贝叶斯假设就好,如果ss由nn个词w1,w2,…,wnw1,w2,…,wn组成,那么

p(s|wi)=p(w1,w2,…,wn|wi)=∏k=1np(wk|wi)p(s|wi)=p(w1,w2,…,wn|wi)=∏k=1np(wk|wi)

这样,我们只需要估算词与词之间的转移概率p(wk|wi)p(wk|wi),就可以得到条件概率p(s|wi)p(s|wi)了,从而完成关键词的提取。

这跟Word2Vec又有什么联系呢?为了估算p(wk|wi)p(wk|wi),需要有大量的文本进行统计,好在这个过程是无监督的,统计是件很简单的事情。然而,我们有更好的工具,什么工具最擅长于对p(wk|wi)p(wk|wi)的建模呢?读者可能就已经猜到了,显然就是Word2Vec呀!Word2Vec的Skip-Gram模型,不就是用来对这个概率进行建模的么?鉴于Word2Vec的“快准狠”的特性,我们没理由弃之不用呀!(当然,按照文章开头的说法,并不一定要用贝叶斯假设,更加不一定要用Word2Vec来算,但是,关键词的定义本身应该是合理的)

II. Word2Vec算概率

这时候读者应该会明白,为什么我在前两篇文章中会那么强调Skip-Gram + Huffman Softmax这个组合了,因为这个组合就是对p(wk|wi)p(wk|wi)进行建模的。当然,由于Huffman Softmax的特性,我们要算p(wk|wi)p(wk|wi),需要费一些周折,参考代码如下:

import numpy as np
import gensim
model = gensim.models.word2vec.Word2Vec.load('word2vec_wx')

def predict_proba(oword, iword):
    iword_vec = model[iword]
    oword = model.wv.vocab[oword]
    oword_l = model.syn1[oword.point].T
    dot = np.dot(iword_vec, oword_l)
    lprob = -sum(np.logaddexp(0, -dot) + oword.code*dot)
    return lprob

这基本上就是直接参考gensim中的Word2Vec的score_sg_pair函数写的,简单的流程是:取出wkwk的Huffman编码(路径),取出wiwi的词向量,然后根据路径,要把路径上每个节点的概率都算出来,然后乘起来,得到p(wk|wi)p(wk|wi)。这是算得是概率对数,应该乘法变为加法。最后的概率是怎么计算的呢?事实上,按照Word2Vec的公式,每个节点的概率对数是:

==log(11+e−x⊤θ)1−d(1−11+e−x⊤θ)d−(1−d)log(1+e−x⊤θ)−dlog(1+e−x⊤θ)−dx⊤θ−log(1+e−x⊤θ)−dx⊤θlog⁡(11+e−x⊤θ)1−d(1−11+e−x⊤θ)d=−(1−d)log⁡(1+e−x⊤θ)−dlog⁡(1+e−x⊤θ)−dx⊤θ=−log⁡(1+e−x⊤θ)−dx⊤θ

这里的θθ是节点向量,xx是输入词向量,dd是该节点的编码(非0即1)。但是,官方的score_sg_pair函数并不是这样写的,那是因为

===−log(1+e−x⊤θ)−dx⊤θ−log[edx⊤θ(1+e−x⊤θ)]−log(edx⊤θ+e(d−1)x⊤θ)−log(1+e−(−1)dx⊤θ)−log⁡(1+e−x⊤θ)−dx⊤θ=−log⁡[edx⊤θ(1+e−x⊤θ)]=−log⁡(edx⊤θ+e(d−1)x⊤θ)=−log⁡(1+e−(−1)dx⊤θ)

III. 实践为上

有了上面的铺垫,现在算关键词就简单了:

from collections import Counter
def keywords(s):
    s = [w for w in s if w in model]
    ws = {w:sum([predict_proba(u, w) for u in s]) for w in s}
    return Counter(ws).most_common()

import pandas as pd #引入它主要是为了更好的显示效果
import jieba
s = u'太阳是一颗恒星'
pd.Series(keywords(jieba.cut(s)))

输出结果是

0 (恒星, -27.9013707845)
1 (太阳, -28.1072913493)
2 (一颗, -30.482187911)
3 (是, -36.3372344659)

其它例子:

>>> s=u'昌平区政府网站显示,明十三陵是世界上保存完整、埋葬皇帝最多的墓葬群,1961年被国务院公布为第一批全国重点文物保护单位,并于2003年被列为世界遗产名录。'
>>> pd.Series(keywords(jieba.cut(s)))
0 (文物保护, -261.691625676)
1 (名录, -272.297758506)
2 (世界遗产, -273.943120665)
3 (第一批, -280.781786703)
4 (列为, -281.663865896)
5 (明十三陵, -286.298893108)
6 (墓葬群, -287.463013816)
...

>>> s=u'雄安新区横空出世,吸引了众多外地炒房客前去购房。然而,在当地政府重拳遏制非法炒房、楼市冻结的背景下,那些怀揣买房钱却在雄安新区无处下手的投资需求,被挤出到周边地区。'
>>> pd.Series(keywords(jieba.cut(s)))
0 (炒房客, -326.997266407)
1 (楼市, -336.176584187)
2 (炒房, -337.190896137)
3 (买房, -344.613473556)
4 (购房, -346.396359454)
5 (重拳, -350.207272082)
6 (外地, -355.860419218)

>>> s=u'如果给一部古装电影设计服装,必须要考虑故事发生在哪个朝代,汉朝为宽袍大袖,清朝则是马褂旗袍。可在京剧舞台上,几乎任何一个历史人物,根据他的性别年龄、身份地位、基本性格等等,都可以在现有的服饰里找到合适的行头。 '
>>> pd.Series(keywords(jieba.cut(s)))
0 (朝代, -485.150966757)
1 (人物, -493.759615898)
2 (古装, -495.478962392)
3 (汉朝, -503.409908377)
4 (清朝, -503.45656029)
5 (旗袍, -504.76313228)
6 (身份, -507.624260109)

大家可以自己尝试。如果要在自己的语料上尝试,那就直接在语料上训练一个Word2Vec(Skip-Gram + Huffman Softmax)模型即可,然后调用上述代码就可以了。

IV. 应该会有疑惑

按照我们一开始的想法,p(wk|wi)p(wk|wi)应该要在整个句子内统计计算,而Word2Vec仅仅开了个窗口来计算,这合理吗?事实上,Word2Vec虽然仅仅开了窗口,但已经成功建立了相似词之间的联系,也就是说,用Word2Vec做上述过程,事实上将“相似词语”进行叠加起来进行评估,相比之下,TF-IDF的方法,仅仅是将“相同词”叠加起来进行评估,因此,我们说Word2Vec提取关键词,能够初步结合语义来判断了。而且,Word2Vec通过考虑p(wk|wi)p(wk|wi)来考虑了文章内部的关联,这里有点TextRank的味道了,是一个二元模型,而TF-IDF仅仅考虑词本身的信息量,仅仅是一个一元模型。

而且,Word2Vec是基于神经网络训练的,自带平滑功能,哪怕两个词语在文本中未曾共现,也能得到一个较为合理的概率。

当然这样做的代价就是:TF-IDF算法的效率是

时间: 2024-08-03 05:44:12

不可思议的Word2Vec之系列三-提取关键词的相关文章

不可思议的Word2Vec之系列四- 不一样的“相似”

I. 相似度的定义 当用Word2Vec得到词向量后,一般我们会用余弦相似度来比较两个词的相似程度,定义为 cos(x,y)=x⋅y|x|×|y|cos⁡(x,y)=x⋅y|x|×|y| 有了这个相似度概念,我们既可以比较任意两个词之间的相似度,也可以找出跟给定词最相近的词语.这在gensim的Word2Vec中,由most_similar函数实现. 等等!我们很快给出了相似度的计算公式,可是我们居然还没有"定义"相似!连相似都没有定义,怎么就得到了评估相似度的数学公式了呢? 要注意,

快速提高网站权重方法三:关键词制胜

大家好,我是虚子雨.前面给大家写过两篇文章<快速提高网站权重方法一:内容捷径><快速提高网站权重方法二:外链王者>,都是介绍快速提高网站权重的,说实话,写这几篇文章我花费了一定的功夫来研究网站权重这一块,也想过做一个系列,想让自己在这个方面更加的系统化,也给大家一个非常完整的概念,希望大家持续关注我的更新. 废话少说,来说说今天我要和大家分享的一些经验,也就是关于快速提高网站权重的第三种方法:关键词制胜.关键词是我们优化的主要方向,无论是从开始选择到具体的优化,都是相当重要的,利用

百度推广过程怎样合理提取关键词

首先为大家解释下什么是关键词,关键词是我们在推广中经常提到的一个名词,各位站长各位高手,就无需多看这段文字了^.^,关键词在百度推广的过程中是指企业用来寻找潜在客户的特征字.词.句子.网民搜索时,百度会挑选符合需求的关键词,将对应的推广信息展现在结果里.简单来说,关键词就是你每天在凤巢系统里提交的词;你提交了什么词,网民就能通过这个词或跟这个词相关的词找到你. 因此,关键词,是真真正正打开商机之门的钥匙,非常非常重要.然而关键词的选择绝对不是一件轻而易举的事,要考虑诸多因素,比如关键词是否跟你的

郭烨晔:百度推广过程怎样合理提取关键词

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 做了网站,做了百度推广,为什么客户还没有自动上门?为什么成交率这么低?有很多的投资者,在投资百度后都会有这个困惑.其实网络推广中有很多的技巧,只不过可能由于投资者太忙了,也没有时间去打理这些事情,网站的客户体验度,电话客服的话术,网站的打开速度等很多因素都会直接影响到客户对投资者反应的程度,环环相扣,每个环节都很重要.今天我将百度推广中最重要

iOS开发UINavigation系列三——工具栏UIToolBar

iOS开发UINavigation系列三--工具栏UIToolBar         iOS中除了UINavinationBar之外,还有工具栏UIToolBar可以供我们使用,工具栏和导航栏十分类似,只是功能更加简单,工具栏中也有UIBarButtonItem按钮,在前两篇博客中,对导航栏和导航项都进行的讨论,地址如下: UINavigationBar:http://my.oschina.net/u/2340880/blog/527706 UINavigationItem:http://my.

巧用三种关键词构建你的站点优化结构

对于我们优化人员来说,在每一个网站的建设之初我们都想我们的站点载优化竞争中赢在起跑线上.为此在建站之初,网站的结构是否有利于我们的优化使我们不得不考虑的一件重要的事情.对于一个好的网站结构来说,它不仅可以对你的排名起到很好的促进作用,对于你的投资回报率提高来说也有很好的作用.如果你的站点有一个用关键词构架的优化结构的话,那么对于你的优化来说将起到事半功倍的效果.我们可以将关键词区分为主关键词.次关键词和长尾关键词,这三种都有各自的优势,那么本文将围绕着这三种关键词阐述如何构建你的站点的优化结构,

浅析热中冷三种关键词的优化技巧

网站优化就是为了提高关键词在搜索引挚中的排名,而对于关键词常见的有三种,每种又有不同的优化方法,所以这就造就了千奇百怪的优化手段了.一般来 说,站长都喜欢选择流量越大越好,而且竞争度还比较低的,这类关键词却是很容易获取好排名.但是却很稀少,有时候找几天都找不到一两个.所以好的关键词虽 然可以得到好的回报,但是寻找起来也比较困难.今天笔者说说常见的三种关键词优化方法: 一.超级热门的关键词 热门关键词肯定是竞争特别的激烈,一般的小站长应该避开这类关键词,有信心是好事,但是也看自己的能力能否合用.对

企业站点三种关键词协调搭配提高转化率

  当我们选好关键词后,往往开始对关键词进行相应的布局.而关键词布局也非常的简单,主页选主关键词,比如企业站的主页关键词一般是公司名称和主要产品.分类目录选择次关键词,比如公司的产品是疏水阀,次关键词基本是这种产品的具体类型,像蒸汽疏水阀这样次关键词.而内容页关键词就是我们熟知的长尾关键词,它的存在是对产品的补充说明,比如述说产品的功能,怎么使用这种类型.长尾关键词有效的引来访客,增加用户购买的基数.三种关键词协调搭配,在站点提高PV,IP的同时,也有利用提高UV,即我们所说的转化率. 一.主关

走近Flex组件系列(三):按扭组件

走近Flex组件系列(三):按扭组件(Button,CheckBox,LinkBar,LinkButton,PopUpButton,RadioButton,ToggleButtonBar) 本文主要介绍Flex的Button.ButtonBar.CheckBox.LinkBar.LinkButton.PopUpButton.RadioButton.RadioButtonGroup和ToggleButtonBar组件,这些组件是非常基础的组件,如果你是学习过Flex组件的可以飘过,本文主要是针对F