查看: 1035|回复: 0

Python提取中文关键词和摘要

[复制链接]

18

主题

4

回帖

145

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
145
发表于 2022-5-23 14:23:09 | 显示全部楼层 |阅读模式
原贴地址:https://xercis.blog.csdn.net/article/details/104677317


TextRank4ZH
TextRank算法可以用来从文本中提取关键词和摘要(重要的句子)。TextRank4ZH是针对中文文本的TextRank算法的python算法实现。
[color=var(--color-accent-fg)]安装
方式1:
$ python setup.py install --user
方式2:
$ sudo python setup.py install
方式3:
$ pip install textrank4zh --user
方式4:
$ sudo pip install textrank4zh
Python 3下需要将上面的python改成python3,pip改成pip3。
[color=var(--color-accent-fg)]卸载$ pip uninstall textrank4zh
[color=var(--color-accent-fg)]依赖
jieba >= 0.35
numpy >= 1.7.1
networkx >= 1.9.1
[color=var(--color-accent-fg)]兼容性
在Python 2.7.9和Python 3.4.3中测试通过。
[color=var(--color-accent-fg)]原理
TextRank的详细原理请参考:
Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004.
关于TextRank4ZH的原理和使用介绍:[color=var(--color-accent-fg)]使用TextRank算法为文本生成关键字和摘要
[color=var(--color-accent-fg)]关键词提取
将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。由此可以得到句子的集合和单词的集合。
每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:
w1, w2, w3, w4, w5, ..., wn
w1, w2, ..., wk、w2, w3, ...,wk+1、w3, w4, ...,wk+2等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。
基于上面构成图,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。
[color=var(--color-accent-fg)]关键短语提取
参照[color=var(--color-accent-fg)]关键词提取提取出若干关键词。若原文本中存在若干个关键词相邻的情况,那么这些关键词可以构成一个关键词组。
例如,在一篇介绍支持向量机的文章中,可以找到关键词支持、向量、机,通过关键词组提取,可以得到支持向量机。
[color=var(--color-accent-fg)]摘要生成
将每个句子看成图中的一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。
通过pagerank算法计算得到的重要性最高的若干句子可以当作摘要。
[color=var(--color-accent-fg)]示例
见[color=var(--color-accent-fg)]example、[color=var(--color-accent-fg)]test
example/example01.py:
[color=var(--color-prettylights-syntax-comment)]#-*- encoding:utf-8 -*-[color=var(--color-prettylights-syntax-keyword)]from __future__ [color=var(--color-prettylights-syntax-keyword)]import print_function[color=var(--color-prettylights-syntax-keyword)]import sys[color=var(--color-prettylights-syntax-keyword)]try:    [color=var(--color-prettylights-syntax-entity)]reload(sys)    sys.[color=var(--color-prettylights-syntax-entity)]setdefaultencoding([color=var(--color-prettylights-syntax-string)]'utf-8')[color=var(--color-prettylights-syntax-keyword)]except:    [color=var(--color-prettylights-syntax-keyword)]pass[color=var(--color-prettylights-syntax-keyword)]import codecs[color=var(--color-prettylights-syntax-keyword)]from textrank4zh [color=var(--color-prettylights-syntax-keyword)]import [color=var(--color-prettylights-syntax-variable)]TextRank4Keyword, [color=var(--color-prettylights-syntax-variable)]TextRank4Sentencetext [color=var(--color-prettylights-syntax-constant)]= codecs.[color=var(--color-prettylights-syntax-entity)]open([color=var(--color-prettylights-syntax-string)]'../test/doc/01.txt', [color=var(--color-prettylights-syntax-string)]'r', [color=var(--color-prettylights-syntax-string)]'utf-8').[color=var(--color-prettylights-syntax-entity)]read()tr4w [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-variable)]TextRank4Keyword()tr4w.[color=var(--color-prettylights-syntax-entity)]analyze(text[color=var(--color-prettylights-syntax-constant)]=text, lower[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]True, window[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]2)  [color=var(--color-prettylights-syntax-comment)]# py2中text必须是utf8编码的str或者unicode对象,py3中必须是utf8编码的bytes或者str对象[color=var(--color-prettylights-syntax-entity)]print( [color=var(--color-prettylights-syntax-string)]'关键词:' )[color=var(--color-prettylights-syntax-keyword)]for item [color=var(--color-prettylights-syntax-constant)]in tr4w.[color=var(--color-prettylights-syntax-entity)]get_keywords([color=var(--color-prettylights-syntax-constant)]20, word_min_len[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]1):    [color=var(--color-prettylights-syntax-entity)]print(item.word, item.weight)[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print( [color=var(--color-prettylights-syntax-string)]'关键短语:' )[color=var(--color-prettylights-syntax-keyword)]for phrase [color=var(--color-prettylights-syntax-constant)]in tr4w.[color=var(--color-prettylights-syntax-entity)]get_keyphrases(keywords_num[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]20, min_occur_num[color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-constant)]2):    [color=var(--color-prettylights-syntax-entity)]print(phrase)tr4s [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-variable)]TextRank4Sentence()tr4s.[color=var(--color-prettylights-syntax-entity)]analyze(text[color=var(--color-prettylights-syntax-constant)]=text, lower[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]True, source [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-string)]'all_filters')[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print( [color=var(--color-prettylights-syntax-string)]'摘要:' )[color=var(--color-prettylights-syntax-keyword)]for item [color=var(--color-prettylights-syntax-constant)]in tr4s.[color=var(--color-prettylights-syntax-entity)]get_key_sentences(num[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]3):    [color=var(--color-prettylights-syntax-entity)]print(item.index, item.weight, item.sentence)  [color=var(--color-prettylights-syntax-comment)]# index是语句在文本中位置,weight是权重
运行结果如下:
关键词:媒体 0.02155864734852778高圆圆 0.020220281898126486微 0.01671909730824073宾客 0.014328439104001788赵又廷 0.014035488254875914答谢 0.013759845912857732谢娜 0.013361244496632448现身 0.012724133346018603记者 0.01227742092899235新人 0.01183128428494362北京 0.011686712993089671博 0.011447168887452668展示 0.010889176260920504捧场 0.010507502237123278礼物 0.010447275379792245张杰 0.009558332870902892当晚 0.009137982757893915戴 0.008915271161035208酒店 0.00883521621207796外套 0.008822082954131174关键短语:微博摘要:摘要:0 0.0709719557171 中新网北京12月1日电(记者 张曦) 30日晚,高圆圆和赵又廷在京举行答谢宴,诸多明星现身捧场,其中包括张杰(微博)、谢娜(微博)夫妇、何炅(微博)、蔡康永(微博)、徐克、张凯丽、黄轩(微博)等6 0.0541037236415 高圆圆身穿粉色外套,看到大批记者在场露出娇羞神色,赵又廷则戴着鸭舌帽,十分淡定,两人快步走进电梯,未接受媒体采访27 0.0490428312984 记者了解到,出席高圆圆、赵又廷答谢宴的宾客近百人,其中不少都是女方的高中同学
[color=var(--color-accent-fg)]使用说明
类TextRank4Keyword、TextRank4Sentence在处理一段文本时会将文本拆分成4种格式:
  • sentences:由句子组成的列表。
  • words_no_filter:对sentences中每个句子分词而得到的两级列表。
  • words_no_stop_words:去掉words_no_filter中的停止词而得到的二维列表。
  • words_all_filters:保留words_no_stop_words中指定词性的单词而得到的二维列表。
例如,对于:
这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足。答谢宴于晚上8点开始。
[color=var(--color-prettylights-syntax-comment)]#-*- encoding:utf-8 -*-[color=var(--color-prettylights-syntax-keyword)]from __future__ [color=var(--color-prettylights-syntax-keyword)]import print_function[color=var(--color-prettylights-syntax-keyword)]import codecs[color=var(--color-prettylights-syntax-keyword)]from textrank4zh [color=var(--color-prettylights-syntax-keyword)]import [color=var(--color-prettylights-syntax-variable)]TextRank4Keyword, [color=var(--color-prettylights-syntax-variable)]TextRank4Sentence[color=var(--color-prettylights-syntax-keyword)]import sys[color=var(--color-prettylights-syntax-keyword)]try:    [color=var(--color-prettylights-syntax-entity)]reload(sys)    sys.[color=var(--color-prettylights-syntax-entity)]setdefaultencoding([color=var(--color-prettylights-syntax-string)]'utf-8')[color=var(--color-prettylights-syntax-keyword)]except:    [color=var(--color-prettylights-syntax-keyword)]passtext [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-string)]"这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足。答谢宴于晚上8点开始。"tr4w [color=var(--color-prettylights-syntax-constant)]= [color=var(--color-prettylights-syntax-variable)]TextRank4Keyword()tr4w.[color=var(--color-prettylights-syntax-entity)]analyze(text[color=var(--color-prettylights-syntax-constant)]=text, lower[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]True, window[color=var(--color-prettylights-syntax-constant)]=[color=var(--color-prettylights-syntax-constant)]2)[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'sentences:')[color=var(--color-prettylights-syntax-keyword)]for s [color=var(--color-prettylights-syntax-constant)]in tr4w.sentences:    [color=var(--color-prettylights-syntax-entity)]print(s)                 [color=var(--color-prettylights-syntax-comment)]# py2中是unicode类型。py3中是str类型。[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'words_no_filter')[color=var(--color-prettylights-syntax-keyword)]for words [color=var(--color-prettylights-syntax-constant)]in tr4w.words_no_filter:    [color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'/'.[color=var(--color-prettylights-syntax-entity)]join(words))   [color=var(--color-prettylights-syntax-comment)]# py2中是unicode类型。py3中是str类型。[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'words_no_stop_words')[color=var(--color-prettylights-syntax-keyword)]for words [color=var(--color-prettylights-syntax-constant)]in tr4w.words_no_stop_words:    [color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'/'.[color=var(--color-prettylights-syntax-entity)]join(words))   [color=var(--color-prettylights-syntax-comment)]# py2中是unicode类型。py3中是str类型。[color=var(--color-prettylights-syntax-entity)]print()[color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'words_all_filters')[color=var(--color-prettylights-syntax-keyword)]for words [color=var(--color-prettylights-syntax-constant)]in tr4w.words_all_filters:    [color=var(--color-prettylights-syntax-entity)]print([color=var(--color-prettylights-syntax-string)]'/'.[color=var(--color-prettylights-syntax-entity)]join(words))   [color=var(--color-prettylights-syntax-comment)]# py2中是unicode类型。py3中是str类型。
运行结果如下:
sentences:这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足答谢宴于晚上8点开始words_no_filter这/间/酒店/位于/北京/东三环/里面/摆放/很多/雕塑/文艺/气息/十足答谢/宴于/晚上/8/点/开始words_no_stop_words间/酒店/位于/北京/东三环/里面/摆放/很多/雕塑/文艺/气息/十足答谢/宴于/晚上/8/点words_all_filters酒店/位于/北京/东三环/摆放/雕塑/文艺/气息答谢/宴于/晚上
[color=var(--color-accent-fg)]API
TODO.
类的实现、函数的参数请参考源码注释。
[color=var(--color-accent-fg)]License
[color=var(--color-accent-fg)]MIT


物欲横流,谁主沉浮?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表