自动摘要

2020-05-06  本文已影响0人  AntiGravity

背景

大数据时代,信息爆炸?垃圾遍地!

互相复制的新闻
重复推送的广告
大量冗余无效的信息

所以需要筛选信息,通过文本自动摘要
应用场景:P2C网站、企业;论文网站、新闻网站、搜索引擎
使用价值:冗余去除、片面提取、杂质剔除


概览

有监督:人工摘要后契合。无监督:算法生成。

基本原理
实现思路

抽取式

压缩式

生成式

效果评价

人工评价(标准摘要来自专家)


Python实现

思路
# 语料
chapter.txt[1]
# 分句(过于简略,未考虑说话的双引号内算一句等)
def cut_sentence(intxt):
    delimeters=frozenset('。!?')
    buf=[]
    for ch in intxt:
        buf.append(ch)
        if delimeters.__contains__(ch):
            yield ''.join(buf)
            buf=[]
    if buf:
        yield ''.join(buf)

sentdf=pd.DataFrame(cut_sentence(chapter.txt[1]))
# 去除过短的句子
sentdf['txtlen']=sentdf[0].apply(len)
sentlist=sentdf[0][sentdf.txtlen>20]
print(len(sentlist))
# 向量化
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

txtlist=[''.join(jieba.lcut(w)) for w in sentlist]

vectorizer=CountVectorizer()
X=vectorizer.fit_transform(txtlist)
tfidf_matrix=TfidfTransformer().fit_transform(X)
# 句子评分
import networkx as nx
similarity=nx.from_scipy_sparse_matrix(tfidf_matrix *tfidf_matrix.T)
scores=nx.pagerank(similarity)

tops=sorted(scores.items(),key=lambda x:x[1], reverse=True)
# 查看评分结果
print(sentlist.iloc[tops[0][0]])
print(sentlist.iloc[tops[1][0]])
sentlist.iloc[tops[2][0]]
# 重组生成摘要
topn=5
topsent=sorted(tops[:topn])
abstract=''
for i in topsent:
    abstract=abstract+sentlist.iloc[i[0]]+'......'
abstract[:-6]

改进:

上一篇下一篇

猜你喜欢

热点阅读