Python自然語言處理—統計詞頻
阿新 • • 發佈:2018-11-02
一 資料的預處理
本文所有的例子我都將使用中文文字進行,所以在分析前需要對中文的文字進行一個預處理的過程(暫時只用的分詞,去除停用詞的部分後面介紹)
# -*- coding:utf-8 -*- from nltk import FreqDist import jieba import pymssql # 我的資料來源於資料庫,用的是爬蟲的小學數學題 conndb = pymssql.connect(host=".", user="**", password="****", database="JD") cursor = conndb.cursor() cursor.execute("SELECT TOP 2000 [題目] FROM [JD].[dbo].[題庫]") rows = cursor.fetchall() #將200道題目中文分詞後,並放到一個List中 text = [] for line in rows: content = list(jieba.cut(line[0])) for word in content: text.append(word)
結果如下圖所示,可以看到有很多標點符號和單個無意義數字
二 頻率分佈
fdist1 = FreqDist(text) # 生成詞頻的字典,格式(“詞1”:數量,“詞2”:數量...)
vocabulary1 = fdist1.keys() # 字典的Key,就是所有的詞
print(list(vocabulary1)[0:10]) # 詞的前10個是什麼,注意字典的Keys是亂序的所有前10並不是數量最多的top10
for word,num in fdist1.items(): # 如果想看看字典內到底是什麼,可以執行這個迴圈
print(word,num)
結果如下圖
那麼如何獲得出現數量最多的Top10詞語呢?
f = zip(fdist1.keys(),fdist1.values()) # 將字典壓縮成list[('詞1',num1),('詞2',num2),...]
sortf = list(sorted(f,key=lambda s: s[1], reverse=True)) # f按照num排序
for i in range(10):
print(sortf[i])
結果如下,這就是不去除停用詞的後果,得到的top10都是無意義的詞。
低頻的詞可以一行程式碼獲取到
fdist1.hapaxes()
三 細粒度的選擇詞
利用for迴圈和條件判斷對詞進行篩選,但是是用一行程式碼實現,這在python中叫列表解析。
程式碼可以理解成 迴圈V中所有詞,如果詞長度大於4,就把詞放到一個List中,最終所有長度大於4的片語成了Long_words
V=set(text) #文字去重
long_words = [w for w in V if len(w)>4]
print(long_words)
結果如下,很明顯本次使用的資料集除了要剔除停用詞,對於全數字全英文的詞也應該做剔除操作
列表解析後的判斷可以是多個條件
print([w for w in V if len(w)>2 and fdist1[w]>10])
通過多個條件篩選出的值更具有代表意義,代表著這個文字的特徵
四 其他——詞長的分佈
fdist = FreqDist([len(w) for w in text])
fdist.items()
fdist.max() # 數量最多的詞長度
fdist[1] # 長度為1的詞的數量
fdist.freq(1) # 長度為1的詞的頻率
fdist.tabulate() # 生成分佈表
首先將每個詞的長度放到一個List中,接著呼叫FreqDist即可