您的位置:首页 > 其它

针对新闻标签提取的tf-idf优化算法1.0版本——基于jieba分词实现

2017-05-26 11:31 656 查看

针对新闻标签提取的tf-idf优化算法1.0版本——基于jieba分词实现

声明

转载可以,但是请注明来源。标明原文链接,尊重作者努力成果。

原文链接

本文参考论文《基于改进TF-IDF中文网页关键词抽取》写出,利用python作为代码实现,利用jieba分词进行中文分词,词性标注,朴素tf-idf实现

朴素的tf-idf

用wtfi表示某一特定新闻文档中候选关键词wi的词频,wtfi=ni∑kj=1nj

其中nI是候选关键词wi出现的次数,而分母所有k个候选关键词出现次数之和。

逆文档频率即IDF通常意义上用出现候选关键词的文档数除以总文档数再将得到的商取自然对数得到。但是由于没有标准的新闻关键词标注语料库可以应用,因此选择用另一个角度考虑。

用Wsi表示语料库中与候选关键词Wi长度相同的词语的总词频,WIDFi表示候选关键词在语料库中的词频。

Widfi=ln(WsiWIiDF)

位置加权

默认新闻中词语的权重高于新闻正文中出现的词频。

Wloci=tloc(当词语i在新闻标题中出现时,否则为0)

暂且假设tloc为2.5。

词长加权

用Wli表示候选关键词Wi归一化后的词长权重,则词长加权函数Wli=len(Wi)max(len(W1)...len(Wk))

len(Wi)表示候选关键词的实际长度,分母是候选关键词中最长词语的长度。

词性加权

对名词以及包含名词性成分的短语赋予更大的权重系数。

Wpi表示词性权重,当词语i是名词性词语时Wpi=tpos否则为0。

暂且假定tpos的取值如下,当词语i为

命名实体,取为2

一般名词,取为1.5

包含名词成分的词语或者短语,系统默认值为1.

综合加权

W=Wtfi∗Widfi∗(1+Wloci+Wli+Wpi)

提高准确率

结合人工索引和关键词提取实现一个标签词语库。出现在标签库中的词语可以适当提高比率,使得提取结果更为准确。

代码实现

#!/usr/bin/python
#encoding=utf-8
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import sys
sys.path.append("../")

import jieba
import jieba.posseg
import jieba.analyse
import jieba.posseg as pseg
from operator import itemgetter, attrgetter

#新闻正文应该是包含了新闻标题的
title="中联部向外国政党政要宣介推进供给侧结构性改革"
content="中联部向外国政党政要宣介推进供给侧结构性改革,作为中国共产党人,我可以骄傲地说,以习近平同志为核心的中共中央,向中国人民交出了一份满意的解决问题的答案,也得到了周边国家和国际社会的广泛赞誉。”这是2017年5月25日在中联部举行的“中国共产党的故事——供给侧结构性改革”专题宣介会上,中国共产党对外职能部门负责人、中联部部长宋涛向与会的外国政党政要介绍供给侧结构性改革这一中国共产党领导经济工作的重大创新和创举时,所表达的自豪之情。这次宣介会是中联部向世界讲述“中国共产党的故事”系列专题宣介会的第二场,湖北省委书记蒋超良登台讲述湖北省委深入推进供给侧结构性改革的实践。“中国共产党的故事”系列专题宣介会旨在向外国政党政要等介绍十八大以来地方党委在贯彻落实中央有关重大战略部署方面的实践和成效,使国际社会更好地理解习近平总书记治党治国理政新理念新思想新战略,为十九大召开营造良好外部环境。此前,该系列专题宣介会首场在4月27日举行,打头阵的是云南省委的精准扶贫实践。澎湃新闻(www.thepaper.cn)了解到,中联部随后还将陆续同山西省委、江苏省委共同举办宣介会。从政党的角度谈供给侧结构性改革供给侧结构性改革是中共中央总书记习近平在2015年中共中央经济工作会议上提出的一项重大经济理论和实践创新,旨在解决中国经济进入新常态后所面临的新挑战,经各省区市实践后取得积极成效,也为提振世界经济作出了积极贡献。“中联部负责中国共产党与世界各国各类政党的交往。我注意到,近年来,如何破解经济难题、恢复经济增长活力,成为党际交流的热门议题。”5月25日,宋涛向参加宣介会的外国政党代表说,“我作为中国共产党对外职能部门负责人,愿意从政党的角度和政治的考量来谈一谈‘供给侧结构性改革’这个经济议题。”宋涛表示,对各国各类政党而言,找到符合本国经济实际情况的改革路径并持续有力推进,在振兴本国经济的同时兼顾周边国家乃至世界经济的共同发展,是经济政策取得成功的关键。从这个角度而言,宋涛指出,中国提出并实践的创新、协调、绿色、开放、共享的发展理念,提出的供给侧结构性改革,是一条着眼于中国和周边经济中长期共赢发展的结构性改革之路,为构建开放型的世界经济发展、推进新型全球化贡献了“中国方案”。譬如,宋涛在作具体解释时表示,供给侧结构性改革是针对中国经济进入新常态后所面临的问题,提出的政策措施,“这不是一条简单的刺激政策、追求短期高速增长的捷径。”另外,宋涛还表示,“我们勇于面对改革难题,勇于破除妨碍发展的体制机制障碍,坚决推进改革”,“我们坚持奉行互利共赢的开放战略,在实现自身发展的同时,主动提出欢迎更多国家搭乘中国发展的快车、便车。”“这条路很长,困难也很多,但坚定不移走下去,将推动中国经济保持中高速增长、迈向中高端水平,并为世界经济稳定增长注入持续的动力。”宋涛说。武汉钢铁公司由于产能过剩,生产经营一度陷入困境。去年以来,该公司淘汰过剩产能、优化产品结构、提高产品质量,实现了与上海宝钢公司的战略重组,成为国有企业供给侧结构性改革的成功范例。”在上述“中国共产党的故事——供给侧结构性改革”专题宣介会上,蒋超良在讲述湖北省委深入推进供给侧结构性改革实践时举例提到了武汉钢铁公司。蒋超良说,2016年湖北全省生产总值达到3.2万亿元,经济总量位居全国第7位。然而,他指出,湖北的发展也面临经济结构不优、供给质量不高、部分行业产能过剩、资源环境约束越来越紧这样一些难题,稳增长、调结构、转方式的任务很重,“推进供给侧结构性改革,是我们湖北省破解发展难题、实现经济持续健康发展的必由之路。”蒋超良介绍说,湖北省委把供给侧结构性改革作为经济工作主线,作为促进经济转型升级的重大机遇,坚持把方向、管大局、作决策、保落实,从地方实际出发,围绕去产能、去库存、去杠杆、降成本、补短板五大任务创造性地开展工作。蒋超良说,湖北省委推进供给侧结构性改革效果是很明显的,这主要体现在优化了经济结构、增强了发展新动能、推进了绿色发展、提高了城乡群众生活水平等方面。譬如,蒋超良介绍说,湖北省新产业快速形成和增长,“光纤通信、生物医药、高端装备、北斗导航等战略性新兴产业走在了全国前列,国家存储器基地、国家商业航天基地、新型显示面板等一批重大产业项目相继落户湖北。2016年,全省高新技术产业增加值增长13.9%,占生产总值比重提高到了17.3%。”“软件与集成电路进军新千亿产业,北斗军团走出国门布局东南亚,海洋工程装备和船舶工业整装待发,通用航空产业进入起飞跑道。湖北产业装上科技的翅膀,正产生几何级效应。”宣介会当天,中联部和湖北省委还举办了图片展、高新科技产品展等配套活动。在其中的一张展览图片上,这段描述湖北省供给侧结构性改革“创新驱动”领域成就的文字格外醒目。在讲述的最后,作为中国共产党的地方组织主要负责人,蒋超良向外国政党政要坚定的说,“供给侧结构性改革,不仅为中国经济健康发展提供了‘治本良方’,也为全球破解结构性难题提供了‘中国方案’"

jieba.add_word("供给侧结构性改革")

words = []

class word:
x="你的"   #词语本身
w=1.0 #tf-idf权值
loc=0 #位置加权
lenth=1.0 #词长加权
pos=2.0 #词性加权
def __repr__(self):
return repr((self.x, self.w, self.loc,self.lenth,self.pos))
def __init__(self,x,w):
self.x=x
self.w=w

# 将新闻标题中的tf-idf值较高的提取出来作为候选关键词,从标题中选择3个
for x,w in jieba.analyse.extract_tags(title,topK=3,withWeight=True):
words.append(word(x,w))

#将新闻正文中的tf-idf值较高的提取出来作为候选关键词,在这个过程中处理位置加权
for x,w in jieba.analyse.extract_tags(content,withWeight=True):
ok=0
i=0
for i in range(0,words.__len__()):
if words[i].x==x:
ok=1
break
if ok==1 :
words[i].loc=2.5
words[i].w=w
else:
words.append(word(x, w))

#计算词长加权
max_len=0
for i in range(0,words.__len__()):
max_len=max(max_len,len(words[i].x))
for i in range(0,words.__len__()):
words[i].lenth=float(len(words[i].x))/float(max_len)

#计算词性加权
for i in range(0,words.__len__()):
temp=pseg.cut(words[i].x)
for s,flag in temp:
if flag=='n' :#如果为普通名词
words[i].pos=1.5
elif flag[0]=='n' :#如果为专有名词
words[i].pos=2.0
elif 'n' in flag :#若为包含名词的词语
words[i].pos=1.0
else:
words[i].pos=0;

#计算总的权值
for i in range(0,words.__len__()):
words[i].w*=(1+words[i].loc+words[i].lenth+words[i].pos)

#依照最终权值进行排序
words=sorted(words,key=lambda WORD:WORD.w,reverse=True)

#取出前五个作为标签
for i in range(0,5):
print('词语: %s 总权值: %s 位置加权: %s 长度加权: %s 词性加权: %s' % (words[i].x,words[i].w,words[i].loc,words[i].lenth,words[i].pos))


备注

此代码为第一版本,各参数均没有进行调试,还未加入关键词库系统,只是初步实现一个优化的分词算法,后期还会持续更新。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: