Python语言学习:jieba/snownlp/textrank4zh/hanlp库提取关键词摘要信息

利用结巴中文分词功能,实现在项目中常用的 tag、摘要自动提取功能
更新于: 2022-03-04 06:37:34

安装

pip install jieba

一个简单的 cms tag 功能

import jieba
import jieba.posseg as pseg


def cms_tag(text):
    res = []
    words = pseg.cut(text)
    for word, flag in words:
        print('%s %s' % (word, flag))
        if flag == 'n':
            res.append(word)
    return res

print(cms_tag('动力电池原材料亟需保供稳价'))
动力电池 n
原材料 n
亟需 v
保供 v
稳价 n
['动力电池', '原材料', '稳价']

关键词/摘要提取

import logging
import jieba
from textrank4zh import TextRank4Keyword, TextRank4Sentence
text = """
来源:中国科学报

  本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!
4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,
我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。
国家天文台党委书记、副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”

  据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站,
获得国际永久编号第120730号。2018年9月25日,经国家天文台申报,
国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会,
正式将该小行星命名为“周又元星”。

  赵刚介绍说,选择这个编号的小行星,正是为了契合周又元先生的生日:7月30日。

  这颗小行星的发现者团队代表、中科院院士陈建生与中国科学院大学副校长、中科院院士吴岳良一起,
分别向周又元颁授了小行星命名公报、命名证书和轨道运行图。

  浩瀚宇宙中,又多了一颗以中国科学家名字命名的星星。

  小行星是目前各类天体中唯一可以由发现者命名并得到国际公认的天体,体现着发现者的意愿、推崇或纪念。
由于小行星命名的严肃性、唯一性和永久不可更改性,使得能够获得小行星命名,成为世界公认的一项殊荣和褒奖。

  周又元现为中国科学院大学荣誉讲席教授,曾任中科院国家天文台研究员、中国科学技术大学和北京大学教授,
在类星体和活动星系核及宇宙学和宇宙大尺度结构等研究领域做出了突出贡献。

  “周院士是我国天文学家的杰出代表,不仅科研成果丰硕,还一直奋战于教育教学的第一线,教龄长达50余年,
可谓是桃李满天下,现在仍是我校荣誉讲席教授。”中国科学院大学副校长吴岳良表示,“我们希望全校教师向周院士学习,
教书育人、率先垂范,为建设国际一流大学而努力奋斗。”

  在颁授仪式上,身形颀长清瘦、已经八十高龄的周又元先生微笑着走上台,作了极为简短的发言,
他在发言中没有谈自己,只是对工作过的学校和集体表示了感谢,感谢它们提供给自己“舒畅、自由、充满信任”的工作环境。

  颁授仪式结束后,周又元昔日的弟子以及现场众多国科大研究生排着队,争相与他合影留念,
让这位科学家感受了一次“明星”的待遇。

  《中国科学报》记者希望周先生以自己的经历给后辈赠言,周先生思索片刻浅笑着仅仅说了短短几句:“我已经80岁了,
仍然一直提醒自己要做好人,做好事。从小,我母亲就这样教育我。”

  国家天文台的工作人员告诉记者,对于“惜字如金”这件事,周先生解释过,自己教学的年头太久了,
感觉话都对学生们说完了,因此晚年都不爱说话了。

  中科院院士、中科院云南天文台研究员韩占文此次专程乘飞机赶到北京见证恩师的荣耀时刻。
曾经做过周又元博士后的他告诉《中国科学报》:“周先生对学生特别好。我到学校的第一天,他就去学生宿舍看我,令我感动。
我和他的研究方向本来不一样,在他的指导下,我的研究视野变得开阔,突然进入了另外一个领域。
在周老师身边这几年,是我学术生涯中最重要的时期。”

  中科院高能物理研究所研究员王建民1992年到1995年曾跟随周又元念博士。
“1995年6月16日,是我博士论文答辩的日子。答辩现场,陆埮先生向我提问,周先生就主动替我解答那些我回答不了的问题。
当时两位先生对于理论的探讨如切如磋如琢如磨,至今想来是我一辈子的荣幸。”王建民感叹道。他细数周又元培育过的众多弟子,
并将郑板桥的一句诗献给老师:“新竹高于旧竹枝,全凭老干为扶持。”
"""


# 取消jieba 的日志输出
jieba.setLogLevel(logging.INFO)


def get_key_words(text, num=5):
    """提取关键词"""
    tr4w = TextRank4Keyword()
    tr4w.analyze(text, lower=True)
    key_words = tr4w.get_keywords(num)
    return [item.word for item in key_words]

# 命名 小行星 周先生 天文台 国际


def get_summary(text, num=3):
    """提取摘要"""
    tr4s = TextRank4Sentence()
    tr4s.analyze(text=text, lower=True, source='all_filters')
    return [item.sentence for item in tr4s.get_key_sentences(num)]

# 周又元现为中国科学院大学荣誉讲席教授,曾任中科院国家天文台研究员、中国科学技术大学和北京大学教授,在类星体和活动星系核及宇宙学和宇宙大尺度结构等研究领域做出了突出贡献
# 这颗小行星的发现者团队代表、中科院院士陈建生与中国科学院大学副校长、中科院院士吴岳良一起,分别向周又元颁授了小行星命名公报、命名证书和轨道运行图
# 4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂


print(get_key_words(text))
print(get_summary(text))

使用snownlp

from snownlp import SnowNLP
text = """
来源:中国科学报

  本报讯(记者肖洁)又有一位中国科学家喜获小行星命名殊荣!
4月19日下午,中国科学院国家天文台在京举行“周又元星”颁授仪式,
我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂。
国家天文台党委书记、副台长赵刚在致辞一开始更是送上白居易的诗句:“令公桃李满天下,何须堂前更种花。”

  据介绍,这颗小行星由国家天文台施密特CCD小行星项目组于1997年9月26日发现于兴隆观测站,
获得国际永久编号第120730号。2018年9月25日,经国家天文台申报,
国际天文学联合会小天体联合会小天体命名委员会批准,国际天文学联合会《小行星通报》通知国际社会,
正式将该小行星命名为“周又元星”。

  赵刚介绍说,选择这个编号的小行星,正是为了契合周又元先生的生日:7月30日。

  这颗小行星的发现者团队代表、中科院院士陈建生与中国科学院大学副校长、中科院院士吴岳良一起,
分别向周又元颁授了小行星命名公报、命名证书和轨道运行图。

  浩瀚宇宙中,又多了一颗以中国科学家名字命名的星星。

  小行星是目前各类天体中唯一可以由发现者命名并得到国际公认的天体,体现着发现者的意愿、推崇或纪念。
由于小行星命名的严肃性、唯一性和永久不可更改性,使得能够获得小行星命名,成为世界公认的一项殊荣和褒奖。

  周又元现为中国科学院大学荣誉讲席教授,曾任中科院国家天文台研究员、中国科学技术大学和北京大学教授,
在类星体和活动星系核及宇宙学和宇宙大尺度结构等研究领域做出了突出贡献。

  “周院士是我国天文学家的杰出代表,不仅科研成果丰硕,还一直奋战于教育教学的第一线,教龄长达50余年,
可谓是桃李满天下,现在仍是我校荣誉讲席教授。”中国科学院大学副校长吴岳良表示,“我们希望全校教师向周院士学习,
教书育人、率先垂范,为建设国际一流大学而努力奋斗。”

  在颁授仪式上,身形颀长清瘦、已经八十高龄的周又元先生微笑着走上台,作了极为简短的发言,
他在发言中没有谈自己,只是对工作过的学校和集体表示了感谢,感谢它们提供给自己“舒畅、自由、充满信任”的工作环境。

  颁授仪式结束后,周又元昔日的弟子以及现场众多国科大研究生排着队,争相与他合影留念,
让这位科学家感受了一次“明星”的待遇。

  《中国科学报》记者希望周先生以自己的经历给后辈赠言,周先生思索片刻浅笑着仅仅说了短短几句:“我已经80岁了,
仍然一直提醒自己要做好人,做好事。从小,我母亲就这样教育我。”

  国家天文台的工作人员告诉记者,对于“惜字如金”这件事,周先生解释过,自己教学的年头太久了,
感觉话都对学生们说完了,因此晚年都不爱说话了。

  中科院院士、中科院云南天文台研究员韩占文此次专程乘飞机赶到北京见证恩师的荣耀时刻。
曾经做过周又元博士后的他告诉《中国科学报》:“周先生对学生特别好。我到学校的第一天,他就去学生宿舍看我,令我感动。
我和他的研究方向本来不一样,在他的指导下,我的研究视野变得开阔,突然进入了另外一个领域。
在周老师身边这几年,是我学术生涯中最重要的时期。”

  中科院高能物理研究所研究员王建民1992年到1995年曾跟随周又元念博士。
“1995年6月16日,是我博士论文答辩的日子。答辩现场,陆埮先生向我提问,周先生就主动替我解答那些我回答不了的问题。
当时两位先生对于理论的探讨如切如磋如琢如磨,至今想来是我一辈子的荣幸。”王建民感叹道。他细数周又元培育过的众多弟子,
并将郑板桥的一句诗献给老师:“新竹高于旧竹枝,全凭老干为扶持。”
"""


s = SnowNLP(text)

print(s.keywords(3))
# ['周', '中国', '行星']

# TextRank算法
print(s.summary(3))
# ['中国科学院国家天文台在京举行“周又元星”颁授仪式',
# '小行星是目前各类天体中唯一可以由发现者命名并得到国际公认的天体',
# '我国天文学家、中国科学院院士周又元的弟子与后辈在欢声笑语中济济一堂']

nodejs 里的 jieba

  • cut: 分词功能
  • tag: 标签功能
  • summary: 没有
npm install nodejieba --registry=https://registry.npm.taobao.org --nodejieba_binary_host_mirror=https://npm.taobao.org/mirrors/nodejieba
const nodejieba = require("nodejieba");
const result = nodejieba.cut("南京市长江大桥");
const tags = nodejieba.tag("南京市长江大桥");

console.log(result, tags);
[ '南京市', '长江大桥' ]
[ { word: '南京市', tag: 'ns' }, { word: '长江大桥', tag: 'ns' } ]

比较相似度

from jieba import posseg
import math
import time


def simicos(str1, str2):
    # 对两个要计算的字符串进行分词, 使用隐马尔科夫模型(也可不用)
    # 由于不同的分词算法, 所以分出来的结果可能不一样
    # 也会导致相似度会有所误差, 但是一般影响不大
    cut_str1 = [w for w, t in posseg.lcut(str1) if 'n' in t or 'v' in t]
    cut_str2 = [w for w, t in posseg.lcut(str2) if 'n' in t or 'v' in t]
    # 列出所有词
    all_words = set(cut_str1 + cut_str2)
    # 计算词频
    freq_str1 = [cut_str1.count(x) for x in all_words]
    freq_str2 = [cut_str2.count(x) for x in all_words]
    # 计算相似度
    sum_all = sum(map(lambda z, y: z * y, freq_str1, freq_str2))
    sqrt_str1 = math.sqrt(sum(x ** 2 for x in freq_str1))
    sqrt_str2 = math.sqrt(sum(x ** 2 for x in freq_str2))
    return sum_all / (sqrt_str1 * sqrt_str2)


if __name__ == '__main__':
    case1 = "SEO"
    case2 = "SEO培训网"
    start = time.time()
    similarity = simicos(case1, case2)
    end = time.time()
    print()
    print("耗时: %.3fs" % (end - start))
    print("相似度: %.3f" % similarity)

参考