#NLP|文本生成#全网最全方法 一篇搞定文本摘要\关键字提取,包含SnowNLP|TextRank4ZH|大模型|TF-IDF

SnowNLP

介绍

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

特点

  • 中文分词(Character-Based Generative Model)
  • 词性标注(TnT 3-gram 隐马)
  • 情感分析(现在训练数据主要是买卖东西时的评价,所以对其他的一些可能效果不是很好,待解决)
  • 文本分类(Naive Bayes)
  • 转换成拼音(Trie树实现的最大匹配)
  • 繁体转简体(Trie树实现的最大匹配)
  • 提取文本关键词(TextRank算法)
  • 提取文本摘要(TextRank算法)
  • tf,idf
  • Tokenization(分割成句子)
  • 文本相似(BM25)
  • 支持python3(erning)

使用函数

from snownlp import SnowNLP

s = SnowNLP(u'这个东西真心很赞')

s.words         # [u'这个', u'东西', u'真心',
                #  u'很', u'赞']

s.tags          # [(u'这个', u'r'), (u'东西', u'n'),
                #  (u'真心', u'd'), (u'很', u'd'),
                #  (u'赞', u'Vg')]

s.sentiments    # 0.9769663402895832 positive的概率

s.pinyin        # [u'zhe', u'ge', u'dong', u'xi',
                #  u'zhen', u'xin', u'hen', u'zan']

s = SnowNLP(u'「繁體字」「繁體中文」的叫法在臺灣亦很常見。')

s.han           # u'「繁体字」「繁体中文」的叫法
                # 在台湾亦很常见。'

text = u'''
自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。
它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。
自然语言处理是一门融语言学、计算机科学、数学于一体的科学。
因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,
所以它与语言学的研究有着密切的联系,但又有重要的区别。
自然语言处理并不是一般地研究自然语言,
而在于研制能有效地实现自然语言通信的计算机系统,
特别是其中的软件系统。因而它是计算机科学的一部分。
'''

s = SnowNLP(text)

s.keywords(3)	# [u'语言', u'自然', u'计算机']

s.summary(3)	# [u'因而它是计算机科学的一部分',
                #  u'自然语言处理是一门融语言学、计算机科学、
				#	 数学于一体的科学',
				#  u'自然语言处理是计算机科学领域与人工智能
				#	 领域中的一个重要方向']
s.sentences

s = SnowNLP([[u'这篇', u'文章'],
             [u'那篇', u'论文'],
             [u'这个']])
s.tf
s.idf
s.sim([u'文章'])# [0.3756070762985226, 0, 0]

尝试代码

$ pip install snownlp
from snownlp import SnowNLP
text = "你的文本内容"
s = SnowNLP(text)
with open("result/snownlp.txt", "a", encoding="utf-8") as file:
    file.write("----------\n")
    file.write(
        f"[原文]:\n{text}\n\n"+
        f"[关键词]:\n{s.keywords(5)}\n\n"+
        f"[文本摘要]:\n{s.summary(5)}\n\n")

关于训练

现在提供训练的包括分词,词性标注,情感分析,而且都提供了我用来训练的原始文件
以分词为例
分词在snownlp/seg目录下

from snownlp import seg
seg.train('data.txt')
seg.save('seg.marshal')
# from snownlp import tag
# tag.train('199801.txt')
# tag.save('tag.marshal')
# from snownlp import sentiment
# sentiment.train('neg.txt', 'pos.txt')
# sentiment.save('sentiment.marshal')

这样训练好的文件就存储为seg.marshal了,之后修改snownlp/seg/__init__.py里的data_path指向刚训练好的文件即可


TextRank4ZH

介绍

算法具体原理我会放在下一篇文章,本文重点在应用,这里不详细介绍了

关键词提取

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

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

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

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

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

关键短语提取

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

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

摘要生成

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

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

使用函数

#-*- encoding:utf-8 -*-
from __future__ import print_function

import sys
try:
    reload(sys)
    sys.setdefaultencoding('utf-8')
except:
    pass

import codecs
from textrank4zh import TextRank4Keyword, TextRank4Sentence

text = codecs.open('../test/doc/01.txt', 'r', 'utf-8').read()
tr4w = TextRank4Keyword()

tr4w.analyze(text=text, lower=True, window=2)  # py2中text必须是utf8编码的str或者unicode对象,py3中必须是utf8编码的bytes或者str对象

print( '关键词:' )
for item in tr4w.get_keywords(20, word_min_len=1):
    print(item.word, item.weight)

print()
print( '关键短语:' )
for phrase in tr4w.get_keyphrases(keywords_num=20, min_occur_num= 2):
    print(phrase)

tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source = 'all_filters')

print()
print( '摘要:' )
for item in tr4s.get_key_sentences(num=3):
    print(item.index, item.weight, item.sentence)  # 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 记者了解到,出席高圆圆、赵又廷答谢宴的宾客近百人,其中不少都是女方的高中同学

尝试代码

安装

方式一

$ python setup.py install --user

方式二

$ sudo python setup.py install

方式三

$ pip install textrank4zh --user

方式四

$ sudo pip install textrank4zh

Python 3下需要将上面的python改成python3,pip改成pip3。

卸载

$ pip uninstall textrank4zh

依赖

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

text = "你的文档内容"
tr4w = TextRank4Keyword()

tr4w.analyze(text=text, lower=True, window=2)  # py2中text必须是utf8编码的str或者unicode对象,py3中必须是utf8编码的bytes或者str对象

# print('关键词:')
keywords = ""
for item in tr4w.get_keywords(5, word_min_len=2):
    # print(item.word, item.weight)
    keywords = keywords + " " + item.word

# print()
# print('关键短语:')
key_phrases = ""
for phrase in tr4w.get_keyphrases(keywords_num=5, min_occur_num=2):
    # print(phrase)
    key_phrases = key_phrases + " "+ phrase

tr4s = TextRank4Sentence()
tr4s.analyze(text=text, lower=True, source='all_filters')

# print()
# print('摘要:')
summary = ""
for item in tr4s.get_key_sentences(num=3):
    print(item.index, item.weight, item.sentence)  # index是语句在文本中位置,weight是权重
    summary = summary + "\n" + item.sentence
with open("result/textrank4zh.txt", "a",encoding="utf-8") as file:
    file.write("----------\n")
    file.write(
        f"[原文]:\n{text}\n\n"+
        f"[关键词]:\n{keywords}\n\n"+
        f"[关键短语]:\n{key_phrases}\n\n"+
        f"[文本摘要]:\n{summary}\n\n")

报错处理

报错1

AttributeError: module ‘networkx’ has no attribute ‘from_numpy_matrix’

使用 networkx 3.0 及以上版本,可能会报这个错误;暂时可将版本降低到 1.9.1。

pip3 install networkx==1.9.1

报错2
报错2

ImportError: cannot import name ‘escape’ from ‘cgi’ (/Users/xx/miniconda3/lib/python3.8/cgi.py)

解决方法:修改文件

/Users/xx/miniconda3/lib/python3.8/site-packages/networkx/readwrite/gml.py

from cgi import escape

替换为

from html import escape

报错3

ImportError: cannot import name ‘gcd’ from ‘fractions’

如果你的代码中有这样的导入:

from fractions import gcd

你应该将其更改为:

from math import gcd

这样应该就能解决你遇到的 ImportError 问题。


智谱API

介绍

智谱AI是一家诞生于清华大学计算机系,以技术转化成果为基础的公司,专注于研发和提供新一代的认知智能通用模型。
ChatGLM,清华技术成果转化的公司智谱AI研发的支持中英双语的对话机器人。

开发文档
获取api-key

尝试代码

安装

如下以 Python SDK 为例进行说明,其它编程语言工具包将持续推出

首先请通过如下方式进行安装 SDK 包:

pip install zhipuai

我们升级了最新的模型 GLM-4、GLM-3-Turbo,支持了System Prompt、Function Call、Retrieval、Web_Search等新功能。使用以上新功能需升级最新版本的 Python SDK。如您已安装老版本SDK,请您更新到最新版SDK。

pip install --upgrade zhipuai
from zhipuai import ZhipuAI
import time
client = ZhipuAI(api_key="") # 填写您自己的APIKey
response = client.chat.completions.create(
    model="glm-4",  # 填写需要调用的模型名称
    messages=[
        {"role": "user", "content": """提取这段文本的主题,主题需要包含所有实体,不超过300字,只要输出内容
        原文:【你的原文内容】"""},

    ],
)
print(response.choices[0].message)

TF-IDF

TF-IDF(Term Frequency-InversDocument Frequency)是一种常用于信息处理和数据挖掘的加权技术。该技术采用一种统计方法,根据字词的在文本中出现的次数和在整个语料中出现的文档频率来计算一个字词在整个语料中的重要程度。它的优点是能过滤掉一些常见的却无关紧要本的词语,同时保留影响整个文本的重要字词。
由于该方法是基于词频统计,个人觉得应用效果不好,这里就不介绍了,可以查看这位大佬的文章

总结

  • 论效果,使用大模型最好,大模型提取出来的文本主题不单单是提取原文最重要的句子,还对相关内容进行了总结。提取的更有逻辑
  • 论速度,本机算法最快,效果上可能需要进行微调或者要用停用词列表去除无效关键词等操作
  • 论效果兼速度,SnowNlp最好
  • 但是,想要接近完美的效果和速度,建议本地部署大模型,部署大模型的硬件选择可以查看这篇文章

你可能感兴趣的:(NLP,自然语言处理,tf-idf,AIGC,NLP,TextRank4ZH,snownlp,LDA)