TF-IDF计算方法和基于图迭代的TextRank


文本处理方法概述

说明:本篇以实践为主,理论部分会尽量给出参考链接

摘要:
  1.分词
  2.关键词提取

  3.主题模型(LDA/TWE)
  4.词的两种表现形式(词袋模型和分布式词向量)
  5.关于文本的特征工程
  6.文本挖掘(文本分类,文本用户画像)

内容:

  1.分词

  分词是文本处理的第一步,词是语言的最基本单元,在后面的文本挖掘中无论是词袋表示还是词向量形式都是依赖于分词的,所以一个好的分词工具是非常重要的。
这里以python的jieba分词进行讲解分词的基本流程,在讲解之前还是想说一下jieba分词的整个工作流程:

 

图1是jieba切词函数的4个可能过程,图2是一个根据DAG图计算最大概率路径,具体的代码走读请参考jieba cut源码
讲了这么多,我们还是要回归到实践中去,看下jieba的分词接口

复制代码
 1 # encoding=utf-8
 2 import jieba
 3 
 4 seg_list = jieba.cut("我来到北京清华大学", cut_all=True)
 5 print("Full Mode: " + "/ ".join(seg_list))  # 全模式
 9 
10 seg_list = jieba.cut("他来到了网易杭研大厦")  # 默认是精确模式
11 print(", ".join(seg_list))
12 
13 seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造")  # 搜索引擎模式
14 print(", ".join(seg_list))
复制代码
【全模式】: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学

【精确模式】: 他, 来到, 了, 网易, 杭研, 大厦    (此处,“杭研”并没有在词典中,但是也被Viterbi算法识别出来了)

【搜索引擎模式】: 小明, 硕士, 毕业, 于, 中国, 科学, 学院, 科学院, 中国科学院, 计算, 计算所, 后, 在, 日本, 京都, 大学, 日本京都大学, 深造

其中全模式切词不会发生图1中的第3,4步,也不会发现新词,是一种完全依赖于词典的分词方式
精确模式是会全部计算最大概率路径和新词发现的。

我们都知道分词最重要的是字典,所以jieba也提供了若干方法对词典进行设置:

复制代码
 jieba.load_userdict(file_name) # file_name 为文件类对象或自定义词典的路径
#词典文件举例:
#创新办 3 i
#云计算 5
#凱特琳 nz
#台中

add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来
复制代码

  2.关键词提取

文本被分词之后和数据处理一样,也会有如下两个问题:

其一,并不是所有的词都是有用的;其二,一个语料库的词量是非常大的,传统的文本挖掘方法又是基于向量空间模型表示的,所以这会造成数据过于稀疏。

为了解决这两个问题一般会进行停用词过滤和关键字提取,而后者现有基于频率的TF-IDF计算方法和基于图迭代的TextRank的计算方法两种。下面看看这两种方法是怎么工作的

 

 这里TF表示词在文章中的重要性,因为我们知道一个文章的主题一多次出现;IDF表示词的区分度,因为专业词汇在整个语料库中出现越少,越能关联文章主题。具体来说就是信息熵越低。

   

图1是一个文章的上下文词构造的无向加权图(UWG),图2是叶结点的权重迭代公式,其中d是阻尼系数。可见textRank认为一个节点如果入度多且权重大,那么这个节点越重要。

具体理论和代码走读参考: 关键词抽取源码TextRank: Bringing Order into Texts;下面我们就动手试试吧!

复制代码
import jieba.analyse

#设置停词表路径
jieba.analyse.set_stop_words(file_name) # file_name为自定义语料库的路径

#默认tfidf提取关键词
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())
#sentence 为待提取的文本
#topK 为返回几个 TF/IDF 权重最大的关键词,默认值为 20
#withWeight 为是否一并返回关键词权重值,默认值为 False
#allowPOS 仅包括指定词性的词,默认值为空,即不筛选
jieba.analyse.TFIDF(idf_path=None) #新建 TFIDF 实例,idf_path 为 IDF 频率文件

#textrank提取关键词
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
复制代码

上面jieba的TFIDF是通过需要指定IDF文件预先指定词的IDF值的,同时textrank中比较重要的参数有一个上下文窗口。jieba通过了这两个方法让我们筛选出前多少个关键词。然而sklearn提供了一种构建文档词矩阵(稀疏矩阵)的方法,可以让我们直接构建文本训练集。

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> vectorizer = TfidfVectorizer()
>>> vectorizer.fit_transform(corpus)
...                                
<4x9 sparse matrix of type '<... 'numpy.float64'>'
    with 19 stored elements in Compressed Sparse ... format>

待续~~~

 

 

  

 
 
标签:  NLP机器学习深度学习
关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com