3.4 使用Python提取文章的关键字
3.4.1 中文分词和关键字的提取
文章抓取后要进行分类处理,虽然会使用4个关键字进行检索,但每篇文章都讲了什么内容,哪些内容是重要的呢?我们希望通过自动化的方式进行归纳和抽取,这时需要用到的便是关键字的提取技术。
关键字的提取就是利用技术手段归纳出一篇文档中和意义最相关的一组词,这些词能够准确地反映文档的含义。提取关键字可以用在文本聚类、分类、自动生成摘要等多个场景。提取关键字的第一步就是进行分词,把一句话切分成多个词语(短语)。使用计算机提取关键字是机器学习领域的一个研究课题。目前很多高级语言都有分词和关键字提取模块。Python中使用得最多的是jieba分词模块。
3.4.2 Python的中文分词模块jieba
jieba分词支持跨平台使用,可使用pip install jieba安装。其使用方法也非常简单。首先看一下分词的效果:
jieba.cut()用于实现分词功能,其有3个参数:
1)第1个参数text(文本)指的是需要分词的字符串,需要为Unicode或UTF-8编码格式。如果要对一篇文章进行分词,则可以利用file.read方法读取文件的内容以形成一个字符串。
2)第2个参数是布尔类型的参数:取值为False代表精确模式,取值为True代表全模式。在精确模式下会把所有能组合成词汇的字全部切出来,速度快,但可能出现歧义;在全模式下会尽量准确地切分,适合于进行文本分析。
3)第3个参数为是否启用HMM模型。如果一个词是没有在词典中出现过的新词,则可以使用基于汉字构词的HMM模型进行分词。
cut()返回的是可迭代的生成器,可以用for循环遍历其中切分好的词。如果想返回列表,则可以使用和cut()参数相同的lcut()。
第9行代码中的cut_for_search()为细粒度分词。如果分词后要放在搜索引擎中去检索,则可以用它(因为它返回的是适用于搜索引擎构建倒排序索引的分词结果)。
上面的分词结果还有几个问题:“罗泾小公园”中的罗泾是一个地名,被切分开了,如何让jieba知道它是一个整词?另外,切分用于提取关键字,结果中的“和/在/的/得/啊”等没有什么意义的词语能不能去掉?
3.4.3 使用自定义词典和停用词
jieba分词支持用户自定义词典和停用词库,把上面的代码稍加调整:
第3行的jieba.load_userdict()在分词前加载了用户词典。参数userdict.txt是一个采用UTF-8编码格式的文本文件,每行一个词语。e:\\study\\userdict.txt 文本中包含了“罗泾”这个地名,因此在分词时其不会被切开。在实际应用中,词库中包含的是地名、人名或某个行业的专业词汇,用户可以在网上下载一些免费的输入法词库,下载相关的文件,转成txt格式来使用。各词库的特点不一,大家要找适合自己项目的。
如果要去掉分词中的某些虚词,则可以使用筛选过滤的方法:
在第4行的set_stopword()自定义方法中,从stopwords.txt文件中读取了停用词。停用词也是一行一个,采用UTF-8编码格式存储。读完文件后返回列表对象。
第13行代码会遍历分词后的每个词,之后把不在停用词列表中的词汇放入content中。
3.4.4 提取文章的关键字
jieba组件除了分词外,还有一个主要用途,那就是提取关键字。这里需要引入jieba.analyse。
第5行代码的analyse.extract_tags是基于TF-IDF算法的关键字提取函数,其参数如下:
1)text:需要提取的文本字符串。
2)topK:返回的前几个权重最大的关键字,默认是20个。
3)withWeight=False:指定是否一并返回关键字的权重值。
4)allowPOS参数的取值类型是Python的元组类型。如果元组中有某个词性值,就只返回该词性值所对应的关键字。元组中的值可以是'ns'、'n'、'vn'、'v',分别代表地名、人名、动名词、动词。
5)以上4个参数除了第一个参数外,都可以省略。
关键字提取也可以指定用户词典:
jieba文档要求userdict.txt文件每行要包括3列:词语、词频和词性。每列中间用空格分隔,词频和词性可以省略。
jieba提取关键字可以过滤掉一些代词、连词、副词。如果要想剔除一些特定词,也可以使用停用词典。比如针对上面的结果,若想过滤掉“附近”等词,则可以定义一个文本文件stopwords.txt,如下所示:
可使用jieba.analyse.set_stop_words()来指定停用词典的路径,如下所示:
jieba提取关键字还有另外一种方法,叫作textrank(),该方法4个参数的含义和extract_tags()的参数一样,但提取结果不一样:
“罗泾”地名在没有使用用户词典的情况下,也被提取出来了。看来这两种算法确实各有千秋。关键字提取没有最优标准,只能结合具体的使用场景动态调整。
爬虫抓取得到的文章内容,使用jieba分词提取出前面N个关键字作为文章的摘要,这个操作会放在4.5.2节中完成。有了关键字,就可以生成词云图显示了。