Python大数据:jieba分词,词频统计
實驗目的
概念
中文分詞
在自然語言處理過程中,為了能更好地處理句子,往往需要把句子拆開分成一個一個的詞語,這樣能更好的分析句子的特性,這個過程叫就叫做分詞。由于中文句子不像英文那樣天然自帶分隔,并且存在各種各樣的詞組,從而使中文分詞具有一定的難度。
不過,中文分詞并不追求完美,而是通過關鍵字識別技術,抽取句子中最關鍵的部分,從而達到理解句子的目的。
工具
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數據源,處理數組進行去重、統計。
數據
實驗數據為百度隨意打開的新聞,請讀者自行按下表格式準備
| 1 | 文章標題 | 文章內容 |
| 2 | 文章標題 | 文章內容 |
| 3 | 文章標題 | 文章內容 |
思路(偽代碼)
- 普通分詞,需要手工進行停用詞過濾
- TF-IDF關鍵詞抽取,需要使用停用詞庫
- textrank關鍵詞抽取,只取指定詞性的關鍵詞
實驗代碼
第一行將代碼標記為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,用于后面統計詞頻
普通分詞及停用詞判斷
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大數據:商品評論的情感傾向分析
總結
以上是生活随笔為你收集整理的Python大数据:jieba分词,词频统计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 朴素贝叶斯(naive bayes)
- 下一篇: Intellij Idea 从 Svn