Python大數據:jieba分詞,詞頻統計
0.1 2018.03.21 11:39* 字數 1717 閱讀 7553評論 6喜歡 45讚賞 1
實驗目的
- 學習如何讀取一個文件
- 學習如何使用DataFrame
- 學習jieba中文分詞組件及停用詞處理原理
- 瞭解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 | 文章標題 | 文章內容 |
本文使用的數據截圖
思路(僞代碼)
- 讀取數據源
- 加載停用詞庫
- 循環對每一篇文章進行分詞
- 普通分詞,需要手工進行停用詞過濾
- TF-IDF關鍵詞抽取,需要使用停用詞庫
- textrank關鍵詞抽取,只取指定詞性的關鍵詞
- 對結果進行詞頻統計
- 輸出結果到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大數據:商品評論的情感傾向分析