1. 刘知远:
链接:https://www.zhihu.com/question/21104071/answer/24556905
我博士阶段的研究课题就是关键词抽取,欢迎下载阅读我的论文“基于文档主题结构的关键词抽取方法研究”。以我做关键词抽取的经验,建议如下:
1. TFIDF是很强的baseline,具有较强的普适性,如果没有太多经验的话,可以实现该算法基本能应付大部分关键词抽取的场景了。
2. 对于中文而言,中文分词和词性标注的性能对关键词抽取的效果至关重要。
3. 较复杂的算法各自有些问题,如Topic Model,它的主要问题是抽取的关键词一般过于宽泛,不能较好反映文章主题。这在我的博士论文中有专门实验和论述;TextRank实际应用效果并不比TFIDF有明显优势,而且由于涉及网络构建和随机游走的迭代算法,效率极低。这些复杂算法集中想要解决的问题,是如何利用更丰富的文档外部和内部信息进行抽取。如果有兴趣尝试更复杂的算法,我认为我们提出的基于SMT(统计机器翻译)的模型,可以较好地兼顾效率和效果。
4. 以上都是无监督算法,即没有事先标注好的数据集合。而如果我们有事先标注好的数据集合的话,就可以将关键词抽取问题转换为 有监督的分类问题。这在我博士论文中的相关工作介绍中均有提到。从性能上来讲,利用有监督模型的效果普遍要优于无监督模型,对关键词抽取来讲亦是如此。在Web 2.0时代的社会标签推荐问题,就是典型的有监督的关键词推荐问题,也是典型的多分类、多标签的分类问题,有很多高效算法可以使用2.rake关键词提取
假如来了一个query,那么我们要判断里面的哪个词是关键词,我们会给每一个term都打一个分(term weight),分高的就是关键词,分低的就是垃圾词。那么这个分怎么来打比较合理呢?下面讲两个算法,都是基于海量数据统计的(query数目大约60亿);
第一个:上下文无关的weight算法一个term单独出现的频次越高,而且和其他term搭配出现的机会越少,那么我们可以肯定,这个term表达意图的能力越强,越重要。
所以有公式:
![](https://i-blog.csdnimg.cn/blog_migrate/a8fed3e338b136e960c0b227f221439e.png)
一看就知道是一个迭代的公式。初始化的时候,每一个query的所有term权重之和等于1,所以每一个term的权重就是1/m;m是当前query的term数目。
4.
曾经在微博上试过TF-IDF,LDA 和TextRank,感觉LDA在短文本上完全不靠谱,在文档级应用上应该可以(没试过,这方面的论文应该很多)
5.
facebookresearch/fastText 这个也不错,用起来挺好,也是基于 topic 来打标签
思路:term 词向量求和取平均 -> logistic regression,只不过由于标签过多,所以用层次 softmax 或者 negative sampling 来优化性能。
当前关键词提取算法主要可以分成两个流派:
1. Statistical
2. Rule Based
本文提供的是一种比较大的分类方法,也有很多reivew的文章分成3类、4类、5类种种,都不重要,关键把思路理清就好。
1) Statistical
统计流派,其思路是,先定义一个关键词指标,然后为文章中所有词汇计算关键词指标,把词汇按照指标从大到小排列,指标大的优先选为关键词。这种思路很简单,有点儿像班里选班长,老师说选学习成绩最好的同学当班长,那么选拔方法就是,先定义一个指标,比如考试总分,然后,给每个学生的语文、数学、物理成绩加总,排名,总分排第一的当班长(关键词)。当然,老师可以指定班里有任意多个班长,例如选K个班长,那么就是成绩排名前K个学生当班长。统计流派的关键在于,计算每个词汇的关键词指标,这个指标是根据词汇在文章中的表现统计并计算出来的,所以有Statistical其名。
在对关键词进行提取时,可以有多种指标,影响力最大的两个是:TF-IDF指标和 PageRank指标。TF-IDF基于词袋模型(Bag-of-Words),把文章表示成词汇的集合,由于集合中词汇元素之间的顺序位置与集合内容无关,所以TF-IDF指标不能有效反映文章内部的词汇组织结构。PageRank指标,基于网络模型(Graph Model),把文章表示成网络的结构,网络中的节点表示词汇,节点之间的边为词汇之间的位置邻接关系,网络结构比集合结构包含信息多,考虑了文章内词汇的顺序,所以PageRank指标一般比TF-IDF指标表现更好。
2) Rule Based
规则流派,其思路是,将关键词提取任务,定义为一个对词汇进行二元分类的任务。即给定一个词汇,要么是关键词,要么不是关键词,对其分类,是关键词为1,不是就是0。那么,关键词提取问题就变成了一个预测问题。预测问题,需要一个预测函数,这个函数就是规则,给定词汇,获得该词汇的特征(
),然后预测该词汇是否为关键词 。规则可以人工指定,也可以通过机器学习(Machine Learning)的方法获得。人工指定规则,一般比较难,费脑子,谁也不清楚究竟到底啥样儿的词是关键词....所以大家就想着让程序自己去获得规则,即通过机器学习。机器学习的方法相对省脑子,但是费体力,要一堆闲的蛋疼的人到网上找一堆文章手工标关键词,然后把标记过的样本扔到模型里去把规则给学习出来。机器学习过程中,需要指定一些词汇特征,用于训练。这些特征,一般也不知道,所以也需要人工指定,比如,考虑词频、词汇包含的字数、词性、词汇的位置等等。所以,前十年,做机器学习进行关键词提取的论文,特别好搞,你选几个指标,发一篇,他选几个指标,又发一篇,也不太费脑子,就是各种拍脑袋想指标,然后把想出的指标各种排列组合丢到模型里去跑,找个相对好的结果就行。这几年,深度学习比较火,有人说了,我想规则费脑子,想指标也费脑子,我就是懒,我直接搞个神经网络让他连词汇特征都一起给学习了。所以,现在深度学习成为关键词提取新的发展方向,但是深度学习的方法只能通过复杂网络的训练帮你抽象出词汇特征,但是还得依赖于人工标注,依然需要闲的蛋疼的人去标记文章。当然了,深度学习的一大好处在于,有一些模型支持对没标记的数据进行学习,可以优化词汇特征的表示。例如,自动编码器,深度玻尔兹曼机...什么的...
总结:
基于此,我想说的是,虽然关键词提取的算法很多,也很花哨,但是思路比较简单,应当在写Paper之前,或者开发技术应用之前,做好技术定位。另外,几乎没有论文回答最基础的一个问题,什么是关键词?为什么某些词应当被提取出来给阅读者看而另外一些词应当忽略?哪些词应当展示给用户看?太多研究关注算法的精度和效率,而忽视了关键词的本质内涵。关键词不是一个客观存在的东西,而本身也是人为标注的,因此模型的评估和优化,本身也是一个主观的东西。这种主观的东西,不应当以算法开发者的意志所左右,而是应当关注用户的需求,想用户之所想,把用户真正关心的那些关键词展示出来。因此,虽然关键词提取算法当前停滞不前,但是从用户的角度重新去考虑关键词的定义,把用户的特征与词汇的特征相结合,进行指标的构建(Statistical)或者规则模型的学习(Rule Based),或许是可以为关键词提取算法的未来研究提供新的发展契机。
http://blog.csdn.net/shijiebei2009/article/details/39696571
另外的一种方法,可以利用词性过滤,只保留指定词性的单词即可,类似的python有jieba分词,java有hanlp,ansj-seg,这些在分词的时候都有词性的标注,都可以很方便的处理
8.
如果是单文档,用textrank,另外你需要注意停用词处理。或者把单文档中按段或句分割成多文档
如果是多文档,那就更简单了,tf-idf是最简单的,也可用lda, 词嵌入svd,w2v,获取文档语义,然后找出与文档语义相关度最大的几个词就可