首先,在这里感谢下编写这些代码的大佬们!!!
我先声明下
为了方便使用,我这里只是整理(CV)了网上的几种提取摘要的的使用方法,不做任何代码解析,毕竟我也不懂算法。
这几种方法我都成功测试过了,但是提取出来数据是有差异的,这里建议这几种方法对比参考后再使用。
如果想深入了解逻辑的话,可以反编译下源码。
一、Java,使用Classifier4J使用该方法,需要引入classifier4J.jar
下载链接:Classifier4J-0.6.zip_NLP自然语言处理提取摘要-Java工具类资源-CSDN下载
支持英文提取,不支持中文提取
import net.sf.classifier4J.summariser.ISummariser; import net.sf.classifier4J.summariser.SimpleSummariser; public class Classifier4J { public static void main1(String[] args) { String str= "Here is the content of the article"; //SimpleSummariser s = new SimpleSummariser(); ISummariser s = new SimpleSummariser(); String result = s.summarise(str, 1); System.out.println(result); } }二、Java,使用HanLP
需要引入maven依赖
com.hankcs hanlpportable-1.7.3
需要添加配置文件 hanlp.properties,本地添加字典库(hanlp.properties自定义路径),
文件下载链接:hanlp.properties_-Java文档类资源-CSDN下载
字典库太大,上传不上去,需要的话私信给我
支持中文、英文提取
注意:使用Hanlp这种方式提取摘要,Hanlp的字典库很大,电脑内存条得特别大才行,运行内存小于12G,就别碰了
import com.hankcs.hanlp.HanLP; public class HanLP { public static void main(String[] args) { String str1= "此处为文章内容"; String str2= "Here is the content of the article"; List三、Python,使用NLTKresult1 = HanLP.extractSummary(str1, 1);//自定义需要摘要的长度 System.out.println(result1.toString()); } }
需要下载nltk及插件
# 下载nltk pip install nltk # 通过cmd进入python控制台 (cmd输入python进入) # 下载punkt、stopwords >>> import nltk >>> nltk.download('punkt') >>> nltk.download('stopwords')
from nltk.tokenize import sent_tokenize, word_tokenize from nltk.corpus import stopwords from collections import defaultdict from string import punctuation from heapq import nlargest stopwords = set(stopwords.words('english') + list(punctuation)) max_cut = 0.9 min_cut = 0.1 """ 计算出每个词出现的频率 word_sent 是一个已经分好词的列表 返回一个词典freq[], freq[w]代表了w出现的频率 """ def compute_frequencies(word_sent): """ defaultdict和普通的dict 的区别是它可以设置default值 参数是int默认值是0 """ freq = defaultdict(int) # 统计每个词出现的频率 for s in word_sent: for word in s: # 注意stopwords if word not in stopwords: freq[word] += 1 # 得出最高出现频次m m = float(max(freq.values())) # 所有单词的频次统除m for w in list(freq.keys()): freq[w] = freq[w] / m if freq[w] >= max_cut or freq[w] <= min_cut: del freq[w] # 最后返回的是 # {key:单词, value: 重要性} return freq def summarize(text, n): """ 用来总结的主要函数 text是输入的文本 n是摘要的句子个数 返回包含摘要的列表 """ # 首先先把句子分出来 sents = sent_tokenize(text) assert n <= len(sents) # 然后再分词 word_sent = [word_tokenize(s.lower()) for s in sents] # freq是一个词和词重要性的字典 freq = compute_frequencies(word_sent) # ranking则是句子和句子重要性的词典 ranking = defaultdict(int) for i, word in enumerate(word_sent): for w in word: if w in freq: ranking[i] += freq[w] sents_idx = rank(ranking, n) return [sents[j] for j in sents_idx] """ 考虑到句子比较多的情况 用遍历的方式找最大的n个数比较慢 我们这里调用heapq中的函数 创建一个最小堆来完成这个功能 返回的是最小的n个数所在的位置 """ def rank(ranking, n): return nlargest(n, ranking, key=ranking.get) # str.txt内容就是需要提取摘要的文章 if __name__ == '__main__': with open("str.txt", "r" , encoding="utf-8") as myfile: text = myfile.read() text = text.replace('n','') res = summarize(text, 1) for i in range(len(res)): print(res[i])