Textrank权值提取文本标签提取

我已经爬取到了指定博主的新浪微博,然后我想从微博中提取出可以代表该博主兴趣特征的100个关键词,然后由这100个关键词提取出10个标签,代表博主的兴趣。我们此处使用基于Textrank权值的关键词提取方法。

输入:微博文本集合,如下图(每一行一条微博) 

程序原理如下:(请勿抄袭和转载) 
 
 
 
 

程序如下:

# -*- coding: utf-8 -*-
__author__ = 'Bai Chenjia'
import jieba.posseg as pseg
import sys
import time
import networkx as nx
import numpy as np
reload(sys)
sys.setdefaultencoding("utf-8") """
1.将要处理的微博内容按每条微博进行分词,去除停用词,保留名词,形成一个二级列表返回
如:原始微博为:['这间酒店位于北京东三环,里面摆放很多雕塑,文艺气息十足', '答谢宴于晚上8点开始']
经过处理后为:[[ '酒店', '位于, '北京, '东三环, '摆放, '雕塑, '文艺, '气息' ],[ '答谢', '宴于, '晚上' ]]
"""
def handel_weibo_data():
#读取要处理的微博正文提取名词,去除停用词
fp = open("f://emotion/mysite/weibo_crawler/chinese_weibo.txt", 'r')
weibo_data = [] # 所有的微博,为一个二级列表[[句子][句子][句子]]其中句子已经被分词去停用词并保留名词
for line in fp.readlines(): # 按行处理
contents = []
line = line.strip()
line.decode('utf-8')
seg_lines = pseg.cut(line) # 分词标注
for seg_line in seg_lines: # 判断如果是名词则保留
if seg_line.flag == 'n' or seg_line.flag == 'nr' or seg_line.flag == 'ns' or seg_line.flag == 'nt' or seg_line.flag == 'nz':
contents.append(seg_line.word) # 保留名词
weibo_data.append(contents)
fp.close()
return weibo_data """
2.构建矩阵。
方法:用户微博文本构建以候选关键词(即选取的名词)为节点的无向图
滑动窗口定为一条微博的长度,即倘若两个词在同一条微博中出现,就认为它们之间存在较强的语义联系,共现次数加1
对每一条微博进行同样的词对共现次数提取,图节点间边的权重记为它们在该用户微博文本中的共现次数
最后用pagerank算法计算每个单词的权重,提取权重排名前100的构成该用户微博的关键词,写入文件
"""
def build_matrix():
######第一步构建 词 和 序号的字典
word_index = {} # 词为键,序号为值
index_word = {} # 序号为键,词为值
weibo_data = handel_weibo_data() # 对原始微博数据进行处理,
index = 0
for sent in weibo_data: # 对于每句话
for word in sent: # 对每句话中的每个词
if not word in word_index.keys():
word_index[word] = index
index_word[index] = word
index += 1
words_number = index
#print "words_number", words_number
#######第二步构建矩阵
graph = np.zeros((words_number, words_number)) # 构建全零矩阵
for word_list in weibo_data: # 每句话
for i in range(len(word_list)): # 对每句话中的词进行两两配对,将在一条微博中出现的词对填充到图中
for j in range(i, len(word_list)):
w1 = word_list[i]
w2 = word_list[j] # 两个词出现在一条微博中
index1 = word_index[w1]
index2 = word_index[w2]
graph[index1][index2] += 1 # 图中对应的边权值加1
graph[index2][index1] += 1 # 无向图,为对称矩阵
######第三步,用networkx中的pagerank算法处理无向图,得到排序后的关键词
nx_graph = nx.from_numpy_matrix(graph) # 导入networdx
scores = nx.pagerank(nx_graph, alpha=0.85) # 调用pagerank算法
sorted_scores = sorted(scores.items(), key=lambda item: item[1], reverse=True) # 得分按照正序排序
key_words = [] # 保存(词,权值)元组
for index, score in sorted_scores:
if index_word[index] == u'网页' or index_word[index] == u'链接' or len(index_word[index]) == 1:
continue
key_words.append((index_word[index], score))
########第四步,将排名前100的关键词写入文件
fp_textrank_result = open('f://emotion/mysite/Label_extract/result_textrank.txt', 'w+')
for i in range(100):
fp_textrank_result.write(key_words[i][0] + ' ' + str(round(key_words[i][1], 10)))
fp_textrank_result.write('\n')
fp_textrank_result.close()
"""
fp_test = open('f://emotion/mysite/Label_extract/test.txt', 'w+')
for i in range(100):
fp_test.write(key_words[i][0] + '、')
fp_test.close()
"""
print "textrank key word calculate is success..."
return key_words """
3.后处理,提取出标签
方法:查看权值前100的关键词中是否有相邻的组合存在,仅抽取出在原文中出现次数超过 2 次的组合计算权重
扩展后的词串权重,为组成它的词语的权重之和。按照权重排序后,抽取前 10 作为自动生成的用户标签
"""
def post_handel_textrank():
# 读取排名前100的词和权值
fp_result = open('f://emotion/mysite/Label_extract/result_textrank.txt', 'r')
results = {} # 字典存储词和权值共100个
words = [] # 存储100个词
for result in fp_result.readlines():
result = result.strip()
word, score = result.split(' ') # 按空格分割,分别为词和权值
results[word] = float(score) # str转为float
words.append(word)
fp_result.close()
#读取原始微博连成字符串
fp_weibo = open('f://emotion/mysite/weibo_crawler/chinese_weibo.txt', 'r')
weibo_list = []
for content in fp_weibo.readlines():
content = content.strip()
weibo_list.append(content)
fp_weibo.close() #将排名前100的词组成词对,查找在原始微博中出现的次数,并记录
labels = []
for i in range(100):
for j in range(i, 100):
str1 = words[i] + words[j]
str2 = words[j] + words[i] # 连成词对的两种不同形式
if words[i] == "网页" or words[j] == '链接' or words[i] == '链接' or words[j] == '网页':
continue
if words[i] == words[j]: # 剔除噪音和相等的情况
continue
str1_count = 0 # str1出现的次数
str2_count = 0 # str2出现的次数
for sent in weibo_list:
str1_count += sent.count(str1)
str2_count += sent.count(str2)
if str1_count > 1: # 如果出现次数大于两次,则表示该标签比较稳定,可以加入考虑
#print str1
labels.append((str1, results[words[i]] + results[words[j]])) # 添加元组(词组,权值)
if str2_count > 1:
#print str2
labels.append((str2, results[words[i]] + results[words[j]])) # 添加元组(词组,权值)
sorted_labels = sorted(labels, key=lambda w: w[1], reverse=True) # 按照词组的权值排序
set_sorted_labels = list(set(sorted_labels))
set_sorted_labels.sort(key=sorted_labels.index) # 去重 # 取得testrank值排序前10的标签组成result_labels作为返回值返回
textrank_result_labels = []
if len(set_sorted_labels) > 10:
i = 0
for word1, score1 in set_sorted_labels:
if i > 10:
break
i += 1
if word1 == '人民警':
word1 = '人民警察'
if word1 == '人温情':
word1 = '人间温情'
if word1 == '女大学':
word1 = '女大学生'
if word1 == '星沉船':
word1 = '东方之星沉船'
if word1 == '事件沉船':
word1 = '沉船事件'
if word1 == '中国工':
word1 = '中国工人'
if word1 == '北京时':
word1 = '北京时间'
textrank_result_labels.append((word1, score1))
else:
textrank_result_labels = set_sorted_labels[:]
print "textrank label extract is success..."
for label in textrank_result_labels:
print label[0], label[1]
return textrank_result_labels if __name__ == '__main__':
start = time.clock()
#weibo_data = handel_weibo_data()
key_words = build_matrix()
textrank_result_labels = post_handel_textrank()
print "running time:" + str(time.clock()-start) + " s"

Textrank权值提取文本标签提取:的更多相关文章

  1. 【树形DP】【P1351】 【NOIP2014D1T2】联合权值

    传送门 Description 无向连通图 \(G\) 有 \(n\) 个点, \(n-1\) 条边.点从 \(1\) 到 \(n\) 依次编号,编号为 \(i\) 的点的权值为 \(W_i\) ,每 ...

  2. [BZOJ3196] 二逼平衡树 [权值线段树套位置平衡树]

    题面 洛咕题面 思路 没错我就是要不走寻常路! 看看那些外层位置数据结构,必须二分的,$O(n\log^3 n)$的做法吧! 看看那些cdq分治/树状数组套线段树的,空间$O(n\log^2 n)$挤 ...

  3. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  4. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

  5. CNN中的局部连接(Sparse Connectivity)和权值共享

    局部连接与权值共享 下图是一个很经典的图示,左边是全连接,右边是局部连接. 对于一个1000 × 1000的输入图像而言,如果下一个隐藏层的神经元数目为10^6个,采用全连接则有1000 × 1000 ...

  6. 51nod1459(带权值的dijkstra)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1459 题意:中文题诶- 思路:带权值的最短路,这道题数据也没 ...

  7. caffe中权值初始化方法

    首先说明:在caffe/include/caffe中的 filer.hpp文件中有它的源文件,如果想看,可以看看哦,反正我是不想看,代码细节吧,现在不想知道太多,有个宏观的idea就可以啦,如果想看代 ...

  8. [NOIP2014]联合权值 题解

    题目大意: 有一棵树,求距离为2的点权的乘积的和以及最大值. 思路: 枚举每一个点,则与其相邻的点互为距离为2的点.该部分的最大值为点权最大的两个点的积,和为点的权值和的平方减去每个点的平方,这样每条 ...

  9. Codevs 3728 联合权值

    问题描述 无向连通图G有n个点,n-1条边.点从1到n依次编号,编号为i的点的权值为Wi ,每 条边的长度均为1.图上两点(u,v)的距离定义为u点到v点的最短距离.对于图G上的点 对(u,v),若它 ...

随机推荐

  1. 基于Zynq平台的EtherCAT主站方案实现

    作者:陈秋苑 谢晓锋 陈海焕 广州虹科电子科技有限公司 摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发.EtherCAT 具有高性能.低成本.容易使用等特点,目前在 ...

  2. git add 不必要的文件 如何撤回

    [root@666 IT-DOC]# git status -s ?? a.txt [root@666 IT-DOC]# git add a.txt [root@666 IT-DOC]# git st ...

  3. angular控制器的执行顺序和服务的注入情况

    这篇文章到底要讲什么呢? 这必须要从栗子开始讲起... 看下面这两段代码: demo1: http://jsfiddle.net/ujzmvp3j/1/ demo2: http://jsfiddle. ...

  4. STL之string类详解

    通过在网站上的资料搜集,得到了很多关于string类用法的文档,通过对这些资料的整理和加入一些自己的代码,就得出了一份比较完整的关于string类函数有哪些和怎样用的文档了!下面先罗列出string类 ...

  5. Python实现归并排序

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/3/18 14:26 # @Author : baoshan # @Site ...

  6. 【Tensorflow】设置显存自适应,显存比例

    用惯了theano.再用tensoflow发现一运行显存就满载了,吓得我吃了一个苹果. 用天朝搜索引擎毛都搜不到,于是FQ找了下问题的解决方法,原来有两种 按比例 config = tf.Config ...

  7. 【Miktex】使用教程以及数学符号整理总结

    LaTeX是当今世界上最流行和使用最为广泛的 TeX格式.它构筑在 Plain TeX的基础之上,并加进了很多的功能以使得使用者可以更为方便的利用 TeX的强大功能.使用 LaTeX基本上不需要使用者 ...

  8. redis集群主流架构方案分析

    Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...

  9. iOS five years[转]

    原文链接:http://blog.ayaka.me/post/127980091987/5-years This morning, I got a push notification from Tim ...

  10. JDK1.8 重识HashMap

    摘要 JDK1.8相较于1.7对HashMap做了很大的优化,比如加入了新数据结构红黑树.Hash算法的优化和扩容的优化. 本篇结合这些区别,探索HashMap的结构实现和功能原理. 存储结构-字段 ...