查看: 5206|回复: 0
打印 上一主题 下一主题

[其他] NLP----关键词提取算法(TextRank,TF/IDF)

[复制链接]

3795

主题

2

听众

5万

积分

版主

Rank: 7Rank: 7Rank: 7

纳金币
53202
精华
32

活跃会员 优秀版主 推广达人 突出贡献 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2018-11-21 14:13:13 |只看该作者 |倒序浏览
参考书目:python自然语言处理实战——核心技术与算法

TF/IDF
基本思想:TF是计算一个词在一篇文档中出现的频率,IDF是一个词在多少篇文档中出现过,显然TF越高证明这个词在这篇文章中的代表性就越强,而INF越低则证明这个词在具有越强的区分能力。因此中和这两个数,就能较好地算出文档的关键词。

关键公式

gif.gif

|D_i|是文档中出现词i的文档数量,|D|是文档数

附上书上抄来的代码
复制代码
TextRank

基本思路:每个词将自己的分数平均投给附近的词,迭代至收敛或指定次数即可,初始分可以打1

附上代码

  1. def get_stopword_list():
  2.     path = './data/stop_words.utf8'
  3.     stopword_list = [sw.replace('\n','') for sw in open(path,'r',encoding='utf8').readlines()]
  4.     return stopword_list

  5. def seg2list(text):
  6.     import jieba
  7.     return jieba.cut(text)

  8. def word_filter(seg_list):
  9.     stopword_list = get_stopword_list()
  10.     filter_list = []
  11.     for w in seg_list:
  12.         if not w in stopword_list and len(w)>1:
  13.             filter_list.append(w)
  14.     return filter_list


  15. str = '6月19日,《2012年度“中国爱心城市”公益活动新闻发布会》在京举行。' + \
  16.            '中华社会救助基金会理事长许嘉璐到会讲话。基金会高级顾问朱发忠,全国老龄' + \
  17.            '办副主任朱勇,民政部社会救助司助理巡视员周萍,中华社会救助基金会副理事长耿志远,' + \
  18.            '重庆市民政局巡视员谭明政。晋江市人大常委会主任陈健倩,以及10余个省、市、自治区民政局' + \
  19.            '领导及四十多家媒体参加了发布会。中华社会救助基金会秘书长时正新介绍本年度“中国爱心城' + \
  20.            '市”公益活动将以“爱心城市宣传、孤老关爱救助项目及第二届中国爱心城市大会”为主要内容,重庆市' + \
  21.            '、呼和浩特市、长沙市、太原市、蚌埠市、南昌市、汕头市、沧州市、晋江市及遵化市将会积极参加' + \
  22.            '这一公益活动。中国雅虎副总编张银生和凤凰网城市频道总监赵耀分别以各自媒体优势介绍了活动' + \
  23.            '的宣传方案。会上,中华社会救助基金会与“第二届中国爱心城市大会”承办方晋江市签约,许嘉璐理' + \
  24.            '事长接受晋江市参与“百万孤老关爱行动”向国家重点扶贫地区捐赠的价值400万元的款物。晋江市人大' + \
  25.            '常委会主任陈健倩介绍了大会的筹备情况。'
  26. win={}
  27. seg_list = seg2list(str)
  28. filter_list = word_filter(seg_list)
  29. #构建投分表,根据窗口
  30. for i in range(len(filter_list)):
  31.     if filter_list[i] not in win.keys():
  32.         win[filter_list[i]]=set()
  33.     if i-5 < 0:
  34.         lindex = 0
  35.     else:
  36.         lindex = i-5
  37.     for j in filter_list[lindex:i+5]:
  38.         win[filter_list[i]].add(j)

  39. # 投票
  40. time = 0
  41. score = {w:1.0 for w in filter_list}
  42. while(time<50):
  43.     for k,v in win.items():
  44.         s = score[k]/len(v)
  45.         score[k] = 0
  46.         for i in v:
  47.             score[i]+=s
  48.     time+=1

  49. l = sorted(score.items(), key=lambda score:score[1],reverse=True)
  50. print(l)


复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2026-1-13 19:39 , Processed in 0.084004 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部