1. 程式人生 > >Python自然語言處理—統計詞頻

Python自然語言處理—統計詞頻

一 資料的預處理

本文所有的例子我都將使用中文文字進行,所以在分析前需要對中文的文字進行一個預處理的過程(暫時只用的分詞,去除停用詞的部分後面介紹)

# -*- 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即可