python分詞和詞頻統計

Python大數據:jieba分詞,詞頻統計

96 黑冰中國 關注

 0.1 2018.03.21 11:39* 字數 1717 閱讀 7553評論 6喜歡 45讚賞 1

實驗目的

  1. 學習如何讀取一個文件
  2. 學習如何使用DataFrame
  3. 學習jieba中文分詞組件及停用詞處理原理
  4. 瞭解Jupyter Notebook

概念

中文分詞

在自然語言處理過程中,爲了能更好地處理句子,往往需要把句子拆開分成一個一個的詞語,這樣能更好的分析句子的特性,這個過程叫就叫做分詞。由於中文句子不像英文那樣天然自帶分隔,並且存在各種各樣的詞組,從而使中文分詞具有一定的難度。

不過,中文分詞並不追求完美,而是通過關鍵字識別技術,抽取句子中最關鍵的部分,從而達到理解句子的目的。

工具

Jupyter Notebook

Jupyter Notebook是一個交互式的筆記本工具,重點有兩點
- “交互式” 讓你隨時隨時運行並暫存結果,
- “筆記本” 記錄你的研究過程

想象一下,在這之前你是如何使用Python的?

  • 用一切可能的文本編輯工具編寫代碼
  • 然後運行python xxx.py調試
  • 當你寫了一個9W條數據的處理程序之後,跑到一半報個錯,又得重頭開始
  • 畫圖基本靠腦補

有了JN之後,你可以:

  • 直接在網頁上編寫代碼
  • 按Shift + Enter立即執行當前Cell的代碼段
  • Cell執行後的變量仍然生存,可以在下一個Cell繼續使用,所以,我用第一個Cell加載9W條數據,第二個Cell開始預處理,第三個Cell進行運算等等
  • 直接在網頁上畫出圖片,即時調整參數Shift+Enter預覽,麻麻再也不用擔心我寫錯代碼,美滋滋 ~~~

jieba

jieba模塊安裝請參見官方說明

jieba 是一個python實現的中文分詞組件,在中文分詞界非常出名,支持簡、繁體中文,高級用戶還可以加入自定義詞典以提高分詞的準確率。

它支持三種分詞模式

  • 精確模式:試圖將句子最精確地切開,適合文本分析;
  • 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
  • 搜索引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。

另外它還自帶有關鍵詞摘取算法。

  • 基於 TF-IDF 算法的關鍵詞抽取
  • 基於 TextRank 算法的關鍵詞抽取

pandas

pandas 是基於NumPy 的大數據處理工具,基本數據結構有(二維表)DataFrame,(一維數組)Series。

本次實驗中,我們主要使用pandas的DataFrame,加載、保存csv數據源,處理數組進行去重、統計。

數據

實驗數據爲百度隨意打開的新聞,請讀者自行按下表格式準備

id title content
1 文章標題 文章內容
2 文章標題 文章內容
3 文章標題 文章內容

本文使用的數據截圖

思路(僞代碼)

  1. 讀取數據源
  2. 加載停用詞庫
  3. 循環對每一篇文章進行分詞
    • 普通分詞,需要手工進行停用詞過濾
    • TF-IDF關鍵詞抽取,需要使用停用詞庫
    • textrank關鍵詞抽取,只取指定詞性的關鍵詞
  4. 對結果進行詞頻統計
  5. 輸出結果到csv文件

實驗代碼

第一行將代碼標記爲utf-8編碼,避免出現處理非ascii字符時的錯誤

# -*- coding: UTF-8 -*-

載入需要用到的模塊,as是給模塊取個別名,輸入的時候不用輸那麼長的單詞。

嗯,反正你別問我爲什麼不給jieba取別名

import numpy as np
import pandas as pd
import jieba
import jieba.analyse
import codecs

默認情況下,pd顯示的文本長度爲50,超出部分顯示爲省略號,我們修改一下,以方便觀察數據(文章內容)

#設置pd的顯示長度
pd.set_option('max_colwidth',500)

讀取我們的實驗數據,將所有列設置爲string,編碼指定utf-8,第一行爲列頭

#載入數據
rows=pd.read_csv('datas1.csv', header=0,encoding='utf-8',dtype=str)

我們直接在下一個Cell中輸入變量rows,觀察載入的結果

加載後的數據

 

對於普通分詞,我們需要將停用詞載入到一個數組中,在分詞後逐一比較關鍵詞是否爲停用詞

stopwords = [line.strip() for line in codecs.open('stoped.txt', 'r', 'utf-8').readlines()] 

對於TF-IDF,我們只需要告訴組件停用詞庫,它將自己載入詞庫並使用它

#載入停用詞
jieba.analyse.set_stop_words('stoped.txt')

接下來我們就要對所有文章進行分詞了,先聲明一個數組,用於保存分詞後的關鍵字,此數組每行保存一個關鍵字對象。

關鍵字對象有兩個屬性:

  • word: 關鍵字本身
  • count : 永遠爲1,用於後面統計詞頻
# 保存全局分詞,用於詞頻統計
segments = []

普通分詞及停用詞判斷

for index, row in rows.iterrows():
    content = row[2]
    #TextRank 關鍵詞抽取,只獲取固定詞性
    words = jieba.cut(content)
    splitedStr = ''
    for word in words:
        #停用詞判斷,如果當前的關鍵詞不在停用詞庫中才進行記錄
        if word not in stopwords:
            # 記錄全局分詞
            segments.append({'word':word, 'count':1})
            splitedStr += word + ' '

Text Rank 關鍵詞抽取

for index, row in rows.iterrows():
    content = row[2]
    #TextRank 關鍵詞抽取,只獲取固定詞性
    words = jieba.analyse.textrank(content, topK=20,withWeight=False,allowPOS=('ns', 'n', 'vn', 'v'))
    splitedStr = ''
    for word in words:
        # 記錄全局分詞
        segments.append({'word':word, 'count':1})
        splitedStr += word + ' '

觀察分詞後的關鍵字,發現全是utf-8編碼後的文字,暫時不管,我們先將這個數組轉換爲DataFrame對象,調用groupby方法和sum方法進行統計彙總。

# 將結果數組轉爲df序列
dfSg = pd.DataFrame(segments)

# 詞頻統計
dfWord = dfSg.groupby('word')['count'].sum()

輸出結果

#導出csv
dfWord.to_csv('keywords.csv',encoding='utf-8')

導出的數據結果

完整代碼

# -*- coding: UTF-8 -*-
import numpy as np
import pandas as pd
import jieba
import jieba.analyse
import codecs

#設置pd的顯示長度
pd.set_option('max_colwidth',500)

#載入數據
rows=pd.read_csv('datas1.csv', header=0,encoding='utf-8',dtype=str)

segments = []
for index, row in rows.iterrows():
    content = row[2]
    #TextRank 關鍵詞抽取,只獲取固定詞性
    words = jieba.analyse.textrank(content, topK=50,withWeight=False,allowPOS=('ns', 'n', 'vn', 'v'))
    splitedStr = ''
    for word in words:
        # 記錄全局分詞
        segments.append({'word':word, 'count':1})
        splitedStr += word + ' '
dfSg = pd.DataFrame(segments)

# 詞頻統計
dfWord = dfSg.groupby('word')['count'].sum()
#導出csv
dfWord.to_csv('keywords.csv',encoding='utf-8')

總結

分詞算法

本次實驗,我們學習瞭如何使用jieba模塊進行中文分詞與關鍵字提取,結果各有千秋:

  • 普通分詞:需要手工過濾停用詞、無意義詞、電話號碼、符號等,但能較爲全面的保留所有關鍵字。
  • TF-IDF:停用詞過濾有限,也需要手工處理部分數字、符號;它通過詞頻抽取關鍵字,對同一篇文章的詞頻統計不具有統計意義,多用於宏觀上的觀測。
  • Text Rank: 大概效果同TF-IDF,通過限定詞性過濾無關字符,能得到較爲工整的關鍵字結果。

結論

總之,我們應根據我們的目標去選擇適當的分詞方法。

  • 對某一篇文章進行關鍵字Map,我們選擇普通分詞,並自行過濾關鍵詞,或添加自定義詞庫。
  • 對採集的一批樣本進行關鍵字分析,我們可以選擇TF-IDF,對所有的關鍵字進行詞頻統計,並繪製出關鍵字雲圖。
  • 如果我們要分析一批樣本中用戶的分類,用戶的行爲,用戶的目的,我們可以選擇TextRank抽取指定詞性的關鍵字進行統計分析。

引用

jieba 開源倉庫 https://github.com/fxsjy/jieba

下期預告

Python大數據:商品評論的情感傾向分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章