毕业之后到公司工作,一直在做和文本相关的工作,最先接触的就是文本语料的标签提取,也就是关键词提取。最开始的业务背景是这样的,从google play上抓取了300万+的app信息,其中包含各个app对应的描述,而我接下来的任务就是对抓取下来的app描述进行标签提取。因为很多国家的开发者都可以向google play上传自己开发的应用,因此,对应的描述信息是多语种的,抓取的时候将英语作为首选,抓取不到英文描述时,只能抓取其原生描述信息。据统计,抓取下来的信息中,英语的占比为68.70%,其次是西班牙语,占4.42%,再者为韩语、葡萄牙语、日语等,当然,这和公司的用户群体是有很大关联的,中文占比只占1.50%,因为公司的主要市场不在中国。简要说一下现有的处理流程:原始语料 -> 进行停用词过滤、词形还原、(可能还有词性标注)、分词 -> 利用算法进行关键词提取 -> 多算法结果融合,生成最终关键词
一、关键词的特点:
关键词是指能够反映文本语料主题的词语或短语。在实际业务中,单个词语的意义不大,主要是短语,而且大多数关键词是名词短语。
1.一段语料中的关键词在该段语料中可能频繁出现,而在其他语料中出现次数较少。
2.针对于总分总结构的文本(如新闻报道),出现在文章首部和尾部位置的词语成为关键词的可能性要远大于只出现在文章中部的词语。
3.在文本中反复出现且关键词附近出现关键词的概率非常大
4.在文本中反复出现且左右出现不同词语的概率非常大
二、关键词抽取概述
关键词抽取从最终的结果反馈上来看,大体可以分为两大类,一是关键词分配,另一个是关键词提取。关键词分配是指,给定一个指定的词库,选取和文章关联度最大的几个词作为该文章的关键词。关键词提取是指,没有指定的词库,从文章中抽取代表性词作为该文章的关键词。(这里存在一个问题,如果关键词是隐性的,不是显性出现在文章中的该怎么办...后边再介绍)目前,大多数领域无关(即无论什么主题什么领域都可以进行关键词提取的)关键词抽取算法和它对应的库都是基于后者的,因此,关键词提取对工业界来说更有意义,后边也主要阐述一些现有的关键词提取的算法。
从现有的算法来看,根据其是否依赖外部知识库,大致可以分为两大类:一是依赖外部知识库:如TF-IDF、KEA、RAKE等算法;另一类则是不依赖外部知识库,该类算法可以解决语言无关以及避免词表中不存在词语所造成的问题,主要是根据文本本身的特征去提取:如Textrank、基于互信息和左右熵的算法等。下面对各类算法的代表性算法进行阐述。
1.TF-IDF:属于是IR领域的入门级经典算法了,其中tf是指单词在该文章的词频(即出现的次数),idf是指逆文件频率,该算法最终的评判标准是对(tf×idf)的值进行降序排序。该算法倾向于找出在某篇文章中经常出现,但在其他文章中不常见的单词。(jieba分词中有应用)
2.KEA:在TF-IDF的基础上,加入利用词语在文章中首次出现的位置作为特征,主要针对总分总结构的语料。出现在文章首部和尾部的词语成为关键词的概率较大,因此根据各个词在文章首次出现的位置赋予不同的权值,在此基础上结合tf-idf以及连续数据离散化来进行关键词提取。
3.RAKE:可进行关键短语的提取。先利用停用词表生成候选词,再计算各个候选词和短语的得分,最终基于score进行最终降序排序。在计算各个候选词得分的时候,引用词频、度的概念,由各个单词自成一列,生成一个方阵,也是一个对角阵,其中对角线上的数值表示的是该单词的词频,其余第i行第j列表示的是i单词和j单词共同出现的频率。对于单词i,其度即为第i行所有值之和(理论上是一个图的概念)。最终,该单词i的得分是指(度/词频)所得的值,而短语的得分指的是短语中各个单词的得分之和。
4.Textrank:是Pagerank的一个引申。该算法中,将文本中每个词看成是一个page,文本中某一个词语与之周围N个词存在一个link,然后在这个网络中使用pagerank算出每个词语的权值,把权值最高的几个词作为关键词(在FudanNLP和SnowNLP中有实现)。textrank有一定的局限性,抽取出来的词也是偏向于是高频词,因为高频词才更有可能和其他的词组成link,进而相应的词或短语的权重较高,最终形成关键词。
5.基于左右熵的算法:若一个词是关键词,则它反复出现且左右出现不同词语的概率非常高,即左右熵较高(在ICTCLAS中有实现)。实际中,这种算法主要是用于新词的发现,如果是用在关键词提取的领域的话,对所有词计算左右熵,如果某个词的左右信息上都很大,那么该词很可能是关键词。如果某个词,左侧信息熵很大,右侧信息熵很小,而它右侧的词左侧信息熵很小,右侧信息熵很大,可描述为X B C Y,则可认为B与C经常一同出现,把B和C组合起来作为关键词组,也可以基于同样的原理发现新词。同样,该算法可用于短语发现。
6.基于互信息的算法:互信息表示了两个变量之间的相互依赖程度,互信息值越高,表示二者的相关性越高,组成短语的可能性越大,反之,值越低,二者存在词语边界的可能性越低。这个算法更适合于进行短语发现。
其他:
7.LDA:这个主要是文本主题分布模型,可以用LDA先sample出一些主题分布,找出跟文本主题向量空间夹角最近的词作为关键词。
8.word2vec:将词语进行向量话表示,然后对词聚类,找出文本中哪些簇的词占多数,关键词就从这些类团中提取。
隐性主题关键词:并未在文章中显性频繁出现。情景:如ipad、iphone都属于apple公司产品,但文章中并未显性频繁提及apple,但最终应将apple作为关键词之一加入关键词列表。理论上,textrank可以在一定程度上缓解这种隐性关键词的问题,但是由于textrank在本质上还是偏向于高频词,因此对隐性关键词的问题解决的并不是很好,而且会将非语义相联的词结合进来,造成一定噪音。为了改善这个问题,有ExpandRank算法,引入数字k,即在构成word graph的时候综合k个语义相近的k个邻居文档,但是仍存在邻居文档界定的问题,若界定不当,则对结果的影响会非常大。另一种缓解方法是利用主题模型,最典型的是LDA,但是LDA生成的最终主题非常粗糙,不够细化,拿前边apple的例子来讲,很可能最终确定的主题是electronics,而不是apple,是从topic level来进行这种问题的解决。11年刘知远提出了一种从word level来解决隐性关键词的算法,论文中把这种隐性关键词定义为vocabulary gap。
在刘知远的模型中,将这种隐性主题关键词提取问题视作是一种翻译问题,是从文本语言到关键词语言的一种翻译。大体涉及到三个步骤,准备翻译对 -> 进行模型训练 -> 进行关键词提取。其中,翻译对的准备可以是基于文章标题,也可以是基于文章摘要。进行模型训练时,采用IBM-Model 1,是统计机器翻译词对齐模型,使用EM算法用非监督学习方式进行训练。得到的模型是非对称的,因此可得到两个模型(文章 -> 标题)和(标题 -> 文章)用二者的调和平均值作为最终的翻译概率模型。在最后的关键词提取阶段,用POS标签选出文章中的名词短语作为候选词,计算每个单词与文章d的相似度,用短语中的各个单词得分作为短语的得分。选出top k个作为这篇文章最终的关键词。??????本质上不还是在文章中选择词语做关键词么??哪里解决了隐形问题???
三、多语种关键词抽取
第二部分中提及的那些算法对英文有很好的抽取效果,英文的分词和词形还原相对简单且可参考的资源丰富,可以满足基本的业务需求。但是对于西班牙语、俄语、韩语等小语种...在分词和词形还原阶段就会遇到不小的问题。因此,对于小语种的关键词抽取,难点在于分词和词形还原。
做NLP这个方向的应该对Stanford的NLP小组都会有所了解,CoreNLP是用Java进行编译的,到目前为止,支持的语言有6种,中文、英文、阿拉伯语、法语、德语、西班牙语,讲真,语种数真心不多,而且对于每一个语种都要写一个模板,用起来有点费劲。虽然比较权威,但是综合考虑,在我们的实际业务里并没有使用这个库作为最终的实现方案。
经调研,最终使用python第三方库,利用pyspark进行dataframe数据读取,调用api接口进行关键词抽取。