Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——向量生成
Posted cafe3165
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——向量生成相关的知识,希望对你有一定的参考价值。
Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——向量生成
20180417学习笔记、20180421修改
一、工作
今天中午开了一次小组讨论会议,老师旁听了并给出了一些意见。
今天的工作主要是两个,一个是构造SVM所需要的向量,一个是标注无关帖子500条。
但是后面遇到一个很麻烦的问题。。。细思恐极不知道该咋办。。。
(1) 生成向量
主要任务,是将“t1.xlsx”中的关键词,取前100个出来。
构成一个1*100的向量,就像(监督,自由,民主,...,体制,民主制度,言论自由,民主监督)这样。
以这个向量为准,对各个帖子进行判断,倘若一个帖子中出现若干个关键词(比如出现了“监督”、“民主”,其他关键词均没出现),该帖子的向量则为(1,0,1.......0,0,X,X,X)。
后面的XXX则是该帖子的三个民主子话题的评分。如
上述向量改写为(1,0,1.......0,0,1,5,1)。
那么,具体怎么构造向量呢?
在正式写代码前,思考这样一个问题:
我们之前写入excel文件的时候,是采用直接赋值的方法,也就是
asheet["%s%d" % (a,n)].value=str(i)
这个样子的,其中a代表的就是表格中的列号。那么我们有100各个关键词,而字母只有26个,怎么继续编排呢。我们发现,表格在Z之后其实是重新以A开头再按ABCD的顺序继续编排的,也就是说,接下来的27列是"AA",28是"AB",以此类推。。。
故,我们需要再组装出一个装列号的list——alphabet[]。
怎么做呢,两个循环就好了o=‘A‘ for i in range(26): alphabet.append(o) p=ord(o)+1 o=chr(p)
(其中ord是获取字符的ascii码的函数,而chr是将ascii码转化成字符的函数)。
(i)提取sta文件中的A列,取前100个关键词,并将子话题加上
tempL=[]
testL=[]
tempc=0
for i in osheet["A"]:
if tempc<100:
tempL.append(i.value)
testL.append(i.value)
else:
break
tempc=tempc+1
tempL.append("民主制度")
tempL.append("言论自由")
tempL.append("民主监督")
(ii)将100个关键词,横向排开
k=0
n=1
e=0
m=0
for i in tempL:
if k<=103:
if k<26:
a=alphabet[k]
asheet["%s%d" % (a,n)].value=str(i)
else:
if m==26:
m=0
e=e+1
b=alphabet[e]
c=alphabet[m]
d=b+c
asheet["%s%d" % (d,n)].value=str(i)
m=m+1
else:
break
k=k+1
ww.save(‘t2.xlsx‘)
- 效果如图:
(iii)重新提取帖子的关键词
由于使用关键词与关键词对比,速度快效率高,所以在此重新对原帖进行取关键词操作,并存在L1之中。
wr2=load_workbook(‘biao2.xlsx‘)
#print(wr.sheetnames)
osheet2=wr2.active
print(osheet2.max_row)
L1=[]
for i in osheet2["A"]:
k=0
content=str(i.value)
keywords=jieba.analyse.extract_tags(content,topK=1000)
L1.append(keywords)
(iv)关键词对比
对比提取后的100个关键词,在每个帖子的关键词列表中是否出现,若出现则标记为1,没出现则标记为0
count=0
L3=[]
L2=[]
flag=False
for i in L1:
L2=[]
for g in testL:
flag=False
for j in i:
if g==j:
flag=True
if flag:
L2.append(1)
else:
L2.append(0)
L3.append(L2)
(v)将各帖子的向量存入表格中
k=0
n=2
for j in L3:
e=0
m=0
for i in j:
if k<=103:
if k<26:
a=alphabet[k]
asheet["%s%d" % (a,n)].value=i
else:
if m==26:
m=0
e=e+1
b=alphabet[e]
c=alphabet[m]
d=b+c
asheet["%s%d" % (d,n)].value=i
m=m+1
k=k+1
n=n+1
k=0
ww.save(‘t2.xlsx‘)
- 最终效果如图:
每一行代表原帖的一个向量
(2) 标注不相关帖子
为了凑齐1000条,还需要500条不相关的帖子。。。可以我翻查语料库发现。。。
很多“不想关”的帖子实际上是相关的。。。尤其是我的第三个label是“民主监督/腐败”。而语料库中含有大料的反腐帖子。这就很麻烦了,还得手工筛选一下吧,把腐败的相关的筛掉
二、总结反思
代码方面没什么问题,主要是语料比较头痛
三、接下来的任务
学习SVM/Naive Bayes/Decision Tree分类。先试试吧
以上是关于Python3 利用openpyxl 以及jieba 对帖子进行关键词抽取 ——向量生成的主要内容,如果未能解决你的问题,请参考以下文章