一、文本摘要方法
二、TextRa*k算法的基本原理
2.3 TextRa*k生成自动摘要的过程
三、基于TextRa*k的中文新闻摘要实例
['信息量巨大!易会满首秀,直面科创板8大问题,对散户加速入场笑而不语&hell*p;&hell*p;', '每日经济新闻', '02-2717:56', '每经编辑:郭鑫 王晓波', '图片来源:新华社记者 李鑫 摄', '易会满上任一个月,还没有在公开场合说过一句话。', '2月27日下午三点半开始,中国证监会主席易会满在北京国新办出席其首场新闻发布会,离发布会开始前两小时现场已经座无虚席,只等易主席来到现场。此外,副主席李超、副主席方星海,上海证券交易所理事长黄红元等也共同出席。', ...]
*mport *umpy as *p *mport pa*das as pd *mport re,os,j*eba from *tertools*mport cha** """ 第一步:把文档划分成句子 """ # 文档所在的文件夹 c_root = os.*etcwd()+os.sep+" c*ews " +os.sep se*te*ces_l*st =[] for f*le** os.l*std*r(c_root): fp = ope*(c_root+f*le,' r ' ,e*cod***=" utf8 " ) for l**e** fp.readl**es(): *f l**e.str*p(): # 把元素按照[。!;?]进行分隔,得到句子。 l**e_spl*t = re.spl*t(r' [。!;?] ' ,l**e.str*p()) # [。!;?]这些符号也会划分出来,把它们去掉。 l**e_spl*t = [l**e.str*p()for l**e** l**e_spl*t*f l**e.str*p()*ot ** [' 。 ' ,' ! ' ,' ? ' ,' ; ' ]a*d le*(l**e.str*p())&*t;1] se*te*ces_l*st.appe*d(l**e_spl*t) se*te*ces_l*st =l*st(cha**.from_*terable(se*te*ces_l*st)) pr**t (" 前10个句子为:* " ) pr**t (se*te*ces_l*st[:10])
&*bsp;
前10个句子为: [ ' 信息量巨大 ' , ' 易会满首秀,直面科创板8大问题,对散户加速入场笑而不语&hell*p;&hell*p; ' , ' 每日经济新闻 ' , ' 02-2717:56 ' , ' 每经编辑:郭鑫 王晓波 ' , ' 图片来源:新华社记者 李鑫 摄 ' , ' 易会满上任一个月,还没有在公开场合说过一句话 ' , ' 2月27日下午三点半开始,中国证监会主席易会满在北京国新办出席其首场新闻发布会,离发布会开始前两小时现场已经座无虚席,只等易主席来到现场 ' , ' 此外,副主席李超、副主席方星海,上海证券交易所理事长黄红元等也共同出席 ' , ' 这可能是这个月国内关注的人最多的一场新闻发布会了 ' ]
""" 第二步:文本预处理,去除停用词和非汉字字符,并进行分词 """ # 创建停用词列表 stopwords = [l**e.str*p()for l**e** ope*(' ./stopwords.txt ' ,e*cod***=' UTF-8 ' ).readl**es()] # 对句子进行分词 def se*_depart(se*te*ce): # 去掉非汉字字符 se*te*ce = re.sub(r' [^u4e00-u9fa5]+ ' ,'' ,se*te*ce) se*te*ce_depart =j*eba.cut(se*te*ce.str*p()) word_l*st =[] for word** se*te*ce_depart: *f word*ot ** stopwords: word_l*st.appe*d(word) # 如果句子整个被过滤掉了,如:'02-2717:56'被过滤,那就返回[],保持句子的数量不变 retur* word_l*st se*te*ce_word_l*st =[] for se*te*ce** se*te*ces_l*st: l**e_se* =se*_depart(se*te*ce) se*te*ce_word_l*st.appe*d(l**e_se*) pr**t (" 一共有 " ,le*(se*te*ces_l*st),' 个句子。* ' ) pr**t (" 前10个句子分词后的结果为:* " ,se*te*ce_word_l*st[:10]) # 保证处理后句子的数量不变,我们后面才好根据textra*k值取出未处理之前的句子作为摘要。 *f le*(se*te*ces_l*st) ==le*(se*te*ce_word_l*st): pr**t (" *数据预处理后句子的数量不变! " )
&*bsp;
一共有 347 个句子。 前10个句子分词后的结果为: [[ ' 信息量 ' ], [ ' 易会 ' ,' 满首秀 ' ,' 直面 ' ,' 科创板 ' ,' 散户 ' ,' 加速 ' ,' 入场 ' ,' 笑 ' ,' 不语 ' ], [ ' 每日 ' ,' 经济 ' ,' 新闻 ' ], [], [ ' 每经 ' ,' 编辑 ' ,' 郭鑫 ' ,' 王晓波 ' ], [ ' 图片 ' ,' 来源 ' ,' 李鑫 ' ,' 摄 ' ], [ ' 易会 ' ,' 上任 ' ,' 一个月 ' ,' 公开场合 ' ,' 说 ' ,' 一句 ' ,' 话 ' ], [ ' 三点 ' ,' 中国证监会 ' ,' 主席 ' ,' 易会 ' ,' 北京 ' ,' 国新办 ' ,' 出席 ' ,' 首场 ' ,' 新闻 ' ,' 发布会 ' ,' 发布会 ' ,' 前 ' ,' 两 ' ,' 小时 ' ,' 现场 ' ,' 座无虚席 ' ,' 易 ' ,' 主席 ' ,' 来到 ' ,' 现场 ' ], [ ' 副 ' ,' 主席 ' ,' 李超 ' ,' 副 ' ,' 主席 ' ,' 星海 ' ,' 上海证券交易所 ' ,' 理事长 ' ,' 黄红元 ' ,' 出席 ' ], [ ' 国内 ' ,' 关注 ' ,' 一场 ' ,' 新闻 ' ,' 发布会 ' ]] 数据预处理后句子的数量不变!
""" 第三步:准备词向量 """ word_embedd***s ={} f = ope*(' ./s**s.f**a*c*al.char ' , e*cod***=' utf-8 ' ) for l**e** f: # 把第一行的内容去掉 *f ' 467389 300* ' *ot ** l**e: values =l**e.spl*t() # 第一个元素是词语 word =values[0] embedd*** = *p.asarray(values[1:], dtype=' float32 ' ) word_embedd***s[word] =embedd*** f.close() pr**t (" 一共有 " +str(le*(word_embedd***s))+" 个词语/字。 " )
&*bsp;
一共有467140个词语/字。
""" 第四步:得到词语的embedd***,用WordAVG作为句子的向量表示 """ se*te*ce_vectors =[] for *** se*te*ce_word_l*st: *f le*(*)!=0: # 如果句子中的词语不在字典中,那就把embedd***设为300维元素为0的向量。 # 得到句子中全部词的词向量后,求平均值,得到句子的向量表示 v = sum([word_embedd***s.*et(w, *p.zeros((300,)))for w** *])/(le*(*)) else : # 如果句子为[],那么就向量表示为300维元素为0个向量。 v = *p.zeros((300,)) se*te*ce_vectors.appe*d(v)
""" 第五步:计算句子之间的余弦相似度,构成相似度矩阵 """ s*m_mat =*p.zeros([le*(se*te*ces_l*st), le*(se*te*ces_l*st)]) from sklear*.metr*cs.pa*rw*se*mport cos**e_s*m*lar*ty for *** ra**e(le*(se*te*ces_l*st)): for j** ra**e(le*(se*te*ces_l*st)): *f * !=j: s*m_mat[*][j] = cos**e_s*m*lar*ty(se*te*ce_vectors[*].reshape(1,300), se*te*ce_vectors[j].reshape(1,300))[0,0] pr**t (" 句子相似度矩阵的形状为: " ,s*m_mat.shape)
&*bsp;
句子相似度矩阵的形状为: (347, 347)
""" 第六步:迭代得到句子的textra*k值,排序并取出摘要 """ *mport *etworkx as *x # 利用句子相似度矩阵构建图结构,句子为节点,句子相似度为转移概率 *x_*raph =*x.from_*umpy_array(s*m_mat) # 得到所有句子的textra*k值 scores =*x.pa*era*k(*x_*raph) # 根据textra*k值对未处理的句子进行排序 ra*ked_se*te*ces = sorted(((scores[*],s)for *,s** e*umerate(se*te*ces_l*st)), reverse=True) # 取出得分最高的前10个句子作为摘要 s* = 10for *** ra**e(s*): pr**t (" 第 " +str(*+1)+" 条摘要:** " ,ra*ked_se*te*ces[*][1],' * ' )
&*bsp;
第1条摘要: 在新闻发布会上,易会满表示,我到证监会工作今天是31天,刚刚满月,是资本市场的新兵,从市场参与者到监管者,角色转换角色挑战很大,如履薄冰,不敢懈怠,唯恐辜负中央信任和市场期待,这也是我做好工作的动力, 近期加强调查研究,和部门协作维护市场平稳发展,维护科创板前期基础工作 第2条摘要: 易会满在新闻发布会上表示,防止发生系统性风险是底线和根本任务,当前受国内外多种因素影响,资本市场风险形式严峻复杂,证监会将坚持精准施策,做好股票质押私募基金、场外配资和地方各类场所的重点领域风险的防范化解 和处置工作,完善资本市场逆周期机制,健全及时反映风险波动系统,运用大数据、人工智能等手段对上市公司专业监管,平衡事前、事中、事后关系,监管端口前移,强化监管效能 第3条摘要: 证监会将坚持精准施策,做好股票质押私募基金、场外配资和地方各类场所的重点领域风险的防范化解和处置工作,完善资本市场逆周期机制,健全及时反映风险波动系统,运用大数据、人工智能等手段对上市公司专业监管, 平衡事前、事中、事后关系,监管端口前移,强化监管效能,切实做好打铁必须自身硬,做好中介机构和高管的强监管 第4条摘要: 这两者出发点和规则不同,我来证监会后不断学习研究,这么专业的问题证监会有专业化的团队,资本市场是大的生态,什么叫市场,应该是依靠市场各参与者,调动市场参与者,市场规律办事, 培养健康生态比什么都重要, 这一考验和要求比专业更重要,生态建设好了,资本市场的健康发展才有保证 第5条摘要: 证监会副主席李超今天也给市场吃下定心丸:“对二级市场影响的问题,(科创板)设立时已经高度关注,在一系列的制度、规则层面作了相应安排 第6条摘要: 他表示,第一,设立科创板主要目的是增强资本市场对实体经济的包容性,更好地服务具有核心技术、行业领先、有良好发展前景和口碑的企业,通过改革进一步完善支持创新的资本形成机制 第7条摘要: 一是提高宏观思维能力,贴近市场各参与方,坚持市场导向、法治导向、监管导向,加强对资本市场宏观战略问题的研究思考,加强顶层设计,增强战略定力,稳步推进重点关注问题的改革创新,在改革中、在发展中破解难题 第8条摘要: 集体学习的通稿中,中央给资本市场定的“法治化”要求有不少,比如“把好市场入口和市场出口两道关,加强全程监管”、“解决资本市场违法违规成本过低问题” 第9条摘要: 易会满表示,证监会将以x*j**p***新时代中国特色社会主义思想为指导,在国务院金融委的统一指挥协调下,主动加强与相关部委、地方党委政府和市场各方的沟通协作,努力形成工作合力,共同促进资本市场高质量发展 第10条摘要: 目前,资本市场已经回暖,这为改革提供了良好市场条件,我们要齐心协力,坚持“严标准、稳起步”的原则,积极做好落实和应对工作,注重各市场之间的平衡,确保改革平稳启动实施