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 對帖子進行關鍵詞抽取 ——向量生成