liulj0507 / pke_zh

pke_zh, python keyphrase extraction for chinese(zh). 中文关键词或关键句提取工具。

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

pke_zh

PyPI version Downloads GitHub contributors License Apache 2.0 python_vesion GitHub issues Wechat Group

PKE_zh, Python Keyphrase Extraction for zh(chinese).

pke_zh实现了多种中文关键词提取算法,包括有监督的WordRank,无监督的TextRank、TfIdf、KeyBert、PositionRank、TopicRank等,扩展性强,开箱即用。

Guide

Feature

如何提取query或者文档的关键词?

有监督方法

特征工程的解决思路

把关键词提取任务转化为分类任务,对输入query句子分词并提取多种特征,再把特征喂给机器学习模型,模型区分出各词的重要性得分,这样挑出topK个词作为关键词。

特征工程

  • 文本特征:包括Query长度、Term长度,Term在Query中的偏移量,term词性、长度信息、term数目、位置信息、句法依存tag、是否数字、是否英文、是否停用词、是否专名实体、是否重要行业词、embedding模长、删词差异度、以及短语生成树得到term权重等
  • 统计特征:包括PMI、IDF、TextRank值、前后词互信息、左右邻熵、独立检索占比(term单独作为query的qv/所有包含term的query的qv和)、统计概率、idf变种iqf
  • 语言模型特征:整个query的语言模型概率 / 去掉该Term后的Query的语言模型概率

训练样本形如:

邪御天娇 免费 阅读,3 1 1

重要度label共分4级:

  • Super important:3级,主要包括POI核心词,比如“方特、欢乐谷”
  • Required:2级,包括行政区词、品类词等,比如“北京 温泉”中“北京”和“温泉”都很重要
  • Important:1级,包括品类词、门票等,比如“顺景 温泉”中“温泉”相对没有那么重要,用户搜“顺景”大部分都是温泉的需求
  • Unimportant:0级,包括语气词、代词、泛需求词、停用词等

上例中可见“温泉”在不同的query中重要度是不同的。

分类模型可以是GBDT、LR、SVM、Xgboost等,这里以GBDT为例,GBDT模型(WordRank)的输入是特征向量,输出是重要度label。

term-weighting

深度模型的解决思路

  • 思路一:本质依然是把关键词提取任务转化为词重要度分类任务,利用深度模型学习term重要度,取代人工提取特征,模型端到端预测词重要度label,按重要度排序后挑出topK个词作为关键词。深度模型有TextCNN、Fasttext、Transformer、BERT等,适用于分类任务的模型都行。分类任务实现参考:https://github.com/shibing624/pytextclassifier
  • 思路二:用Seq2Seq生成模型,输入query,输出关键词或者摘要,生成模型可以是T5、Bart、Seq2Seq等,生成任务实现参考:https://github.com/shibing624/textgen

无监督方法

  • 统计算法
  • TFIDF,是很强的baseline,有较强普适性,基本能应付大部分关键词抽取场景,简单有效,速度很快,效果一般
  • YAKE,人工总结规则的方法,不依赖外部语料,从单文档提取关键词,速度很快,效果差
  • 图算法
  • TextRank,简单套用PageRank**到关键词提取的方法,效果不比TFIDF强,而且涉及网络构建和随机游走迭代,速度慢,效果一般
  • SingleRank,类似TextRank,是PageRank的变体,可以提取出关键短语,速度快,效果一般
  • TopicRank,基于主题模型的关键词提取算法,考虑了文档中词语的语义关系,可以提取出与文档主题相关的关键词,速度慢,效果一般
  • MultipartiteRank,一种基于多元关系的关键词提取算法,在TopicRank的基础上,考虑了词语的语义关系和词语位置,速度慢,效果一般
  • PositionRank,是基于PageRank的图关系计算词权重,考虑了词位置和词频,速度一般,效果好
  • 语义模型
  • KeyBERT,利用了预训练语言模型的能力来提取关键词,速度很慢,效果最好

模型选型

  • 要求速度快,选择TFIDF、YAKE、PositionRank
  • 要求效果好,选择KeyBERT

无监督算法介绍见文章中文关键词提取算法

Install

  • From pip:
pip install -U pke_zh
  • From source:
git clone https://github.com/shibing624/pke_zh.git
cd pke_zh
python setup.py install

依赖数据

Usage

有监督关键词提取

直接调用训练好的WordRank模型,模型自动下载于 ~/.cache/pke_zh/wordrank_model.pkl

example: examples/keyphrase_extraction_demo.py

from pke_zh.wordrank import WordRank
m = WordRank()
print(m.extract("哪里下载电视剧周恩来?"))

output:

[('电视剧', 3), ('周恩来', 3), ('下载', 2), ('哪里', 1), ('', 0)]

3:核心词;2:限定词;1:可省略词;0:干扰词。

基于自有数据训练模型

训练example: examples/train_supervised_wordrank_demo.py

无监督关键词提取

支持TextRank、TfIdf、PositionRank、KeyBert等关键词提取算法。

example: examples/unsupervised_demo.py

from pke_zh.textrank import TextRank
from pke_zh.tfidf import TfIdf
from pke_zh.singlerank import SingleRank
from pke_zh.positionrank import PositionRank
from pke_zh.topicrank import TopicRank
from pke_zh.multipartiterank import MultipartiteRank
from pke_zh.yake import Yake
from pke_zh.keybert import KeyBert

q = '哪里下载电视剧周恩来?'
TextRank_m = TextRank()
TfIdf_m = TfIdf()
PositionRank_m = PositionRank()
KeyBert_m = KeyBert()

r = TextRank_m.extract(q)
print('TextRank:', r)

r = TfIdf_m.extract(q)
print('TfIdf:', r)

r = PositionRank_m.extract(q)
print('PositionRank_m:', r)

r = KeyBert_m.extract(q)
print('KeyBert_m:', r)

output:

TextRank: [('电视剧', 1.00000002)]
TfIdf: [('哪里下载', 1.328307500322222), ('下载电视剧', 1.328307500322222), ('电视剧周恩来', 1.328307500322222)]
PositionRank_m: [('电视剧', 1.0)]
KeyBert_m: [('电视剧', 0.47165293)]

无监督关键句提取(自动摘要)

支持TextRank摘要提取算法。

example: examples/keysentences_extraction_demo.py

from pke_zh.textrank import TextRank

m = TextRank()
r = m.extract_sentences("较早进入**市场的星巴克,是不少小资钟情的品牌。相比 在美国的平民形象,星巴克在**就显得“高端”得多。用料并无差别的一杯中杯美式咖啡,在美国仅约合人民币12元,国内要卖21元,相当于贵了75%。  第一财经日报")
print(r)

output:

[('相比在美国的平民形象', 0.13208935993025409), ('在美国仅约合人民币12元', 0.1320761453200497), ('星巴克在**就显得“高端”得多', 0.12497451534612379), ('国内要卖21元', 0.11929080110899569) ...]

Contact

  • Issue(建议):GitHub issues
  • 邮件我:xuming: xuming624@qq.com
  • 微信我:加我微信号:xuming624, 备注:姓名-公司名-NLP 进NLP交流群。

Citation

如果你在研究中使用了pke_zh,请按如下格式引用: APA:

Xu, M. pke_zh: Python keyphrase extraction toolkit for chinese (Version 0.2.2) [Computer software]. https://github.com/shibing624/pke_zh

BibTeX:

@misc{pke_zh,
  author = {Xu, Ming},
  title = {pke_zh: Python keyphrase extraction toolkit for chinese},
  year = {2023},
  publisher = {GitHub},
  journal = {GitHub repository},
  howpublished = {\url{https://github.com/shibing624/pke_zh}},
}

License

授权协议为 The Apache License 2.0,可免费用做商业用途。请在产品说明中附加pke_zh的链接和授权协议。

Contribute

项目代码还很粗糙,如果大家对代码有所改进,欢迎提交回本项目,在提交之前,注意以下两点:

  • tests添加相应的单元测试
  • 使用python -m pytest来运行所有单元测试,确保所有单测都是通过的

之后即可提交PR。

Reference

About

pke_zh, python keyphrase extraction for chinese(zh). 中文关键词或关键句提取工具。

License:Apache License 2.0


Languages

Language:Python 100.0%