1. 程式人生 > >Python3 利用openpyxl 以及jieba 對帖子進行關鍵詞抽取 ——向量生成

Python3 利用openpyxl 以及jieba 對帖子進行關鍵詞抽取 ——向量生成

還得 work 反思 append 字母 分享圖片 alpha else 賦值

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