Skip to content

🌳从中文文本中自动提取关键词和摘要

License

Notifications You must be signed in to change notification settings

jackie930/TextRank4ZH

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

52 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TextRank4ZH

TextRank算法可以用来从文本中提取关键词和摘要(重要的句子)。TextRank4ZH是针对中文文本的TextRank算法的python算法实现。

安装

方式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。

卸载

$ pip uninstall textrank4zh

依赖

jieba >= 0.35
numpy >= 1.7.1
networkx >= 1.9.1

兼容性

在Python 2.7.9和Python 3.4.3中测试通过。

原理

TextRank的详细原理请参考:

Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004.

关于TextRank4ZH的原理和使用介绍:使用TextRank算法为文本生成关键字和摘要

关键词提取

将原文本拆分为句子,在每个句子中过滤掉停用词(可选),并只保留指定词性的单词(可选)。由此可以得到句子的集合和单词的集合。

每个单词作为pagerank中的一个节点。设定窗口大小为k,假设一个句子依次由下面的单词组成:

w1, w2, w3, w4, w5, ..., wn

w1, w2, ..., wkw2, w3, ...,wk+1w3, w4, ...,wk+2等都是一个窗口。在一个窗口中的任两个单词对应的节点之间存在一个无向无权的边。

基于上面构成图,可以计算出每个单词节点的重要性。最重要的若干单词可以作为关键词。

关键短语提取

参照关键词提取提取出若干关键词。若原文本中存在若干个关键词相邻的情况,那么这些关键词可以构成一个关键词组。

例如,在一篇介绍支持向量机的文章中,可以找到关键词支持向量,通过关键词组提取,可以得到支持向量机

摘要生成

将每个句子看成图中的一个节点,若两个句子之间有相似性,认为对应的两个节点之间有一个无向有权边,权值是相似度。

通过pagerank算法计算得到的重要性最高的若干句子可以当作摘要。

示例

exampletest

使用说明

类TextRank4Keyword、TextRank4Sentence在处理一段文本时会将文本拆分成4种格式:

  • sentences:由句子组成的列表。
  • words_no_filter:对sentences中每个句子分词而得到的两级列表。
  • words_no_stop_words:去掉words_no_filter中的停止词而得到的二维列表。
  • words_all_filters:保留words_no_stop_words中指定词性的单词而得到的二维列表。

本地部署

server

cd apps/text_summry_endpoint
sh build_and_push.sh
docker run -v -d -p 8080:8080 textrank

client

# test 
#curl http://localhost:8080/ping 

# curl
import requests
import json

url='http://localhost:8080/invocations'
data={"data": "《半導體》Q1展望保守,世界垂淚2019/02/11 10:28時報資訊【時報記者沈培華台北報導】世界先進 (5347) 去年營運創歷史新高,每股純益達3.72元。但對今年首季展望保守,預計營收將比上季高點減近一成。世界先進於封關前股價拉高,今早則是開平走低。世界先進於年前台股封關後舉行法說會公布財報。公司去年營運表現亮麗,營收與獲利同創歷史新高紀錄。2018年全年營收289.28億元,年增16.1%,毛利率35.2%,拉升3.2個百分點,稅後淨利61.66億元,年增36.9%,營收與獲利同創歷史新高,每股純益3.72元。董事會通過去年度擬配發現金股利3.2元。展望第一季,受到客戶進入庫存調整,公司預期,本季營收估在67億至71億元,將季減8%至13%,毛利率將約34.5%至36.5%。此外,因應客戶需求,世界先進決定斥資2.36億美元,收購格芯新加坡8吋晶圓廠。世界先進於年前宣布,將購買格芯位於新加坡Tampines的8吋晶圓3E廠房、廠務設施、機器設備及微機電(MEMS)智財權與業務,交易總金額2.36億美元,交割日訂108年12月31日。格芯晶圓3E廠現有月產能3.5萬片8吋晶圓,世界先進每年將可增加超過40萬片8吋晶圓產能,增進公司明年起業績成長動能。TOP關閉"}
data = json.dumps(data)
r = requests.post(url,data=data)

#show result
print (r.text)

结果如下

{"res": {"关键词列表": ["公司", "", "", "客戶", "世界", "", "歷史", "展望", "高點", "定斥", "保守", "去年", "年度", "", "廠務", "", "時報", "擬配", "發現", "公布"], 
"关键词权重": [0.021830182644348436, 0.021326461850579626, 0.021079603384026722, 0.01895223347929955, 0.01805834763586865, 0.015857085161081398, 0.014919166963726964, 0.01471938511506705, 0.014620888893926702, 0.014620888893926702, 0.014001573075273081, 0.013746893722718052, 0.011987812728358822, 0.011987812728358822, 0.011643071195825557, 0.011643071195825555, 0.011533578138425806, 0.011474480918306437, 0.011474480918306437, 0.011389711378308801], 
"摘要列表": ["《半導體》Q1展望保守,世界垂淚2019/02/11 10:28時報資訊【時報記者沈培華台北報導】世界先進 (5347) 去年營運創歷史新高,每股純益達3.72元", "世界先進於年前宣布,將購買格芯位於新加坡Tampines的8吋晶圓3E廠房、廠務設施、機器設備及微機電(MEMS)智財權與業務,交易總金額2.36億美元,交割日訂108年12月31日", "格芯晶圓3E廠現有月產能3.5萬片8吋晶圓,世界先進每年將可增加超過40萬片8吋晶圓產能,增進公司明年起業績成長動能"], 
"摘要位置index": [0, 9, 10], "摘要权重": [0.1061431564717524, 0.10339832449272994, 0.09211266281495177]}}

使用rouge指标评估

###安装pyrouge

sudo yum -y install perl-CPAN
sudo cpan YAML
sudo cpan Module::Metadata
sudo cpan Module::Build
sudo cpan IO::Socket
sudo cpan IO::Socket::IP
sudo cpan HTTP::Daemon
sudo cpan LWP::UserAgent
sudo cpan DB_File

cd pyrouge

cd tools/ROUGE-1.5.5/data/
rm WordNet-2.0.exc.db
./WordNet-2.0-Exceptions/buildExeptionDB.pl ./WordNet-2.0-Exceptions ./smart_common_words.txt ./WordNet-2.0.exc.db

pyrouge_set_rouge_path /home/ec2-user/SageMaker/pyrouge/tools/ROUGE-1.5.5

cd ../../../
pyrouge_set_rouge_path /home/ec2-user/SageMaker/pyrouge/tools/ROUGE-1.5.5
python setup.py install

测试评估

python test_rouge.py

结果产生为如下格式的结果表

原文 标注摘要 生成摘要 评估指标rouge1 评估指标rouge2
text text text number number

Deploy endpoint on SageMaker

endpoint_ecr_image="251885400447.dkr.ecr.cn-northwest-1.amazonaws.com.cn/textrank"
python create_endpoint.py \
--endpoint_ecr_image_path ${endpoint_ecr_image} \
--endpoint_name 'textrank' \
--instance_type "ml.t2.medium"

在部署结束后,看到SageMaker控制台生成了对应的endpoint,可以使用如下客户端代码测试调用

from boto3.session import Session
import json
data={"data": "《半導體》Q1展望保守,世界垂淚2019/02/11 10:28時報資訊【時報記者沈培華台北報導】世界先進 (5347) 去年營運創歷史新高,每股純益達3.72元。但對今年首季展望保守,預計營收將比上季高點減近一成。世界先進於封關前股價拉高,今早則是開平走低。世界先進於年前台股封關後舉行法說會公布財報。公司去年營運表現亮麗,營收與獲利同創歷史新高紀錄。2018年全年營收289.28億元,年增16.1%,毛利率35.2%,拉升3.2個百分點,稅後淨利61.66億元,年增36.9%,營收與獲利同創歷史新高,每股純益3.72元。董事會通過去年度擬配發現金股利3.2元。展望第一季,受到客戶進入庫存調整,公司預期,本季營收估在67億至71億元,將季減8%至13%,毛利率將約34.5%至36.5%。此外,因應客戶需求,世界先進決定斥資2.36億美元,收購格芯新加坡8吋晶圓廠。世界先進於年前宣布,將購買格芯位於新加坡Tampines的8吋晶圓3E廠房、廠務設施、機器設備及微機電(MEMS)智財權與業務,交易總金額2.36億美元,交割日訂108年12月31日。格芯晶圓3E廠現有月產能3.5萬片8吋晶圓,世界先進每年將可增加超過40萬片8吋晶圓產能,增進公司明年起業績成長動能。TOP關閉"}

session = Session()
    
runtime = session.client("runtime.sagemaker")
response = runtime.invoke_endpoint(
    EndpointName='textrank',
    ContentType="application/json",
    Body=json.dumps(data),
)

result = json.loads(response["Body"].read())
print (result)

Deploy via Spot Tagging Bot

在确保可以部署成功endpint的情况下,我们可以将此功能注册为一个新的机器人。

cd apps/text_summry_bot
sh build_and_push.sh

在api gateway中启动一个机器人任务范例提交

{
"s3_bucket": "spot-bot-asset",
"s3_path": "text_summary_bot/input",
"bot_name": "text_summary_bot",
"number_of_bots": "1",
"bulk_size": "500",
"output_s3_bucket": "spot-bot-asset",
"output_s3_prefix": "text_summary_bot/output"
}

License

MIT

About

🌳从中文文本中自动提取关键词和摘要

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Perl 60.7%
  • Python 21.7%
  • HTML 16.1%
  • Shell 1.1%
  • Dockerfile 0.4%