-
Notifications
You must be signed in to change notification settings - Fork 18
文本挖掘
为了帮助大家对项目的各个方面有快速认识,负责此块的同学将运营维护这个页面;我们希望,大家在做项目的过程中,通过知识分享、交流,让每一个人都尽可能多的学到东西,并且各有所长。
SNS用户主要以文字形式进行交流、互动。引入文本挖掘技术,就是为了解决与此相关的一些问题。
开始之前,先推荐给大家一个专注于自然语义处理的网站52nlp,下面介绍的内容都是从这里学习到的。
关于文本相似度,我们学习与之相关的两个话题: 自动提取关键词 、 找出相似文章 ,对于这两个话题,均可以用TF-IDF算法进行表现,算法思想很简单,也体现了数学之美。
1. 对于一篇很长的文章,什么样的词是关键词?
一个很自然的想法就是进行词频分析,也就是统计该词在文章中出现的次数,越多便越有可能是关键词。不同于英文文章,词已经被分好了;而中文文章的长句,如何把“词”找出来,便是做词频分析的第一步。我们把这个步骤叫做分词,稍后会介绍分词的基本原理和开源工具。
假设我们已经用分词工具把一篇文章做好了划分,下面进行词频(Term Frequency,TF)统计。大家肯定会发现,出现最多的词是“的”,“是”等我们不需要的词,称为停用词(Stop Words);我们需要把这些词去掉,因为它是这个系统中的“噪音”。
去掉这些停用词后,随之产生一个问题,出现频率相同的词,重要性就一样大吗?比如“中国”,“蜜蜂”,“养殖”均出现了20次,但我们显然会更关注后面两个,为什么?原因就在于后者是日常生活中出现频率较小的词, 它突然如此密集地出现在一篇文章中 ,重要性可想而知。
如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。
于是在计算“重要性指数”的时候,可以为这些词引入一个权重,赋予最常见的词(的、是、在)最小的权,常见的词(中国)较小的权、不常见的词(蜜蜂、养殖)最大的权。这个权重叫做"逆文档频率"(Inverse Document Frequency,IDF),它的大小与一个词的常见程度成反比。
知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。
具体算法
词频(TF)=该词在文章中出现的次数/文章总词数
逆文档频率(IDF)=log(语料库的文档总数/包含该词的文档总数+1)
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
IDF的计算需要有一个语料库,我们稍后具体举例的时候谈这个问题。
TF-IDF=TF X IDF
可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。
以《中国的蜜蜂养殖》为例,假定该文长度为1000个词,"中国"、"蜜蜂"、"养殖"各出现20次,则这三个词的"词频"(TF)都为0.02。然后, 搜索Google发现,包含"的"字的网页共有250亿张,假定这就是中文网页总数 (这就解决了语料库的问题)。包含"中国"的网页共有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:
TF-IDF算法的优点是简单快速,结果比较符合实际情况。缺点是,单纯以"词频"衡量一个词的重要性,不够全面,有时重要的词可能出现次数并不多。而且,这种算法无法体现词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。(一种解决方法是,对全文的第一段和每一段的第一句话,给予较大的权重。)
在上一节的基础上,我们可以进一步介绍文章相似度的问题了,即找到/评价手头上两篇文章的相似度。关键字提取可以让我们用“人脑/感觉”去对比两篇文章的主要话题是否相关,这里我们引入“余弦相似性”量化相关度的概念。先聊聊这个技术对此项目的意义和作用:
- 以帖子标题为目标,抓取某个特定话题的所有相关帖子的标题,进行相似性计算。目的在于,这些帖子是不是在问同一个问题?当然,这只是第一步;
- 如果帖子标题相似,则进入页面内部抓取具体内容(包括问题补充、回答)进行对比。
这样就可以大致判断是否有冗余,冗余有多大。(这个问题还需要跟你们一起商量)
算法介绍完毕,我们试着做一下。文本相似度的问题开始之前,需要准备好分词工具,我们很幸运地直接在GitHub找到了中文分词工具。
我在知乎上找与“地震”相关的帖子,找到了两篇标题是《地震可以预测吗?》,第一篇和第二篇 可以说这两篇文章的标题相似度是100%,我们用分词工具小试牛刀:
进一步地,我们把问题补充切下来: