Python大数据:jieba分词,词频统计
實(shí)驗(yàn)?zāi)康?/h1>
概念
中文分詞
在自然語言處理過程中,為了能更好地處理句子,往往需要把句子拆開分成一個(gè)一個(gè)的詞語,這樣能更好的分析句子的特性,這個(gè)過程叫就叫做分詞。由于中文句子不像英文那樣天然自帶分隔,并且存在各種各樣的詞組,從而使中文分詞具有一定的難度。
不過,中文分詞并不追求完美,而是通過關(guān)鍵字識(shí)別技術(shù),抽取句子中最關(guān)鍵的部分,從而達(dá)到理解句子的目的。
工具
Jupyter Notebook
Jupyter Notebook是一個(gè)交互式的筆記本工具,重點(diǎn)有兩點(diǎn)
- “交互式” 讓你隨時(shí)隨時(shí)運(yùn)行并暫存結(jié)果,
- “筆記本” 記錄你的研究過程
想象一下,在這之前你是如何使用Python的?
- 用一切可能的文本編輯工具編寫代碼
- 然后運(yùn)行python xxx.py調(diào)試
- 當(dāng)你寫了一個(gè)9W條數(shù)據(jù)的處理程序之后,跑到一半報(bào)個(gè)錯(cuò),又得重頭開始
- 畫圖基本靠腦補(bǔ)
有了JN之后,你可以:
- 直接在網(wǎng)頁上編寫代碼
- 按Shift + Enter立即執(zhí)行當(dāng)前Cell的代碼段
- Cell執(zhí)行后的變量仍然生存,可以在下一個(gè)Cell繼續(xù)使用,所以,我用第一個(gè)Cell加載9W條數(shù)據(jù),第二個(gè)Cell開始預(yù)處理,第三個(gè)Cell進(jìn)行運(yùn)算等等
- 直接在網(wǎng)頁上畫出圖片,即時(shí)調(diào)整參數(shù)Shift+Enter預(yù)覽,麻麻再也不用擔(dān)心我寫錯(cuò)代碼,美滋滋 ~~~
jieba
jieba模塊安裝請(qǐng)參見官方說明
jieba 是一個(gè)python實(shí)現(xiàn)的中文分詞組件,在中文分詞界非常出名,支持簡(jiǎn)、繁體中文,高級(jí)用戶還可以加入自定義詞典以提高分詞的準(zhǔn)確率。
它支持三種分詞模式
- 精確模式:試圖將句子最精確地切開,適合文本分析;
- 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非???#xff0c;但是不能解決歧義;
- 搜索引擎模式:在精確模式的基礎(chǔ)上,對(duì)長(zhǎng)詞再次切分,提高召回率,適合用于搜索引擎分詞。
另外它還自帶有關(guān)鍵詞摘取算法。
- 基于 TF-IDF 算法的關(guān)鍵詞抽取
- 基于 TextRank 算法的關(guān)鍵詞抽取
pandas
pandas 是基于NumPy 的大數(shù)據(jù)處理工具,基本數(shù)據(jù)結(jié)構(gòu)有(二維表)DataFrame,(一維數(shù)組)Series。
本次實(shí)驗(yàn)中,我們主要使用pandas的DataFrame,加載、保存csv數(shù)據(jù)源,處理數(shù)組進(jìn)行去重、統(tǒng)計(jì)。
數(shù)據(jù)
實(shí)驗(yàn)數(shù)據(jù)為百度隨意打開的新聞,請(qǐng)讀者自行按下表格式準(zhǔn)備
| 1 | 文章標(biāo)題 | 文章內(nèi)容 |
| 2 | 文章標(biāo)題 | 文章內(nèi)容 |
| 3 | 文章標(biāo)題 | 文章內(nèi)容 |
思路(偽代碼)
- 普通分詞,需要手工進(jìn)行停用詞過濾
- TF-IDF關(guān)鍵詞抽取,需要使用停用詞庫
- textrank關(guān)鍵詞抽取,只取指定詞性的關(guān)鍵詞
實(shí)驗(yàn)代碼
第一行將代碼標(biāo)記為utf-8編碼,避免出現(xiàn)處理非ascii字符時(shí)的錯(cuò)誤
# -*- coding: UTF-8 -*-載入需要用到的模塊,as是給模塊取個(gè)別名,輸入的時(shí)候不用輸那么長(zhǎng)的單詞。
嗯,反正你別問我為什么不給jieba取別名
import numpy as np import pandas as pd import jieba import jieba.analyse import codecs默認(rèn)情況下,pd顯示的文本長(zhǎng)度為50,超出部分顯示為省略號(hào),我們修改一下,以方便觀察數(shù)據(jù)(文章內(nèi)容)
#設(shè)置pd的顯示長(zhǎng)度 pd.set_option('max_colwidth',500)讀取我們的實(shí)驗(yàn)數(shù)據(jù),將所有列設(shè)置為string,編碼指定utf-8,第一行為列頭
#載入數(shù)據(jù) rows=pd.read_csv('datas1.csv', header=0,encoding='utf-8',dtype=str)我們直接在下一個(gè)Cell中輸入變量rows,觀察載入的結(jié)果
對(duì)于普通分詞,我們需要將停用詞載入到一個(gè)數(shù)組中,在分詞后逐一比較關(guān)鍵詞是否為停用詞
stopwords = [line.strip() for line in codecs.open('stoped.txt', 'r', 'utf-8').readlines()]對(duì)于TF-IDF,我們只需要告訴組件停用詞庫,它將自己載入詞庫并使用它
#載入停用詞 jieba.analyse.set_stop_words('stoped.txt')接下來我們就要對(duì)所有文章進(jìn)行分詞了,先聲明一個(gè)數(shù)組,用于保存分詞后的關(guān)鍵字,此數(shù)組每行保存一個(gè)關(guān)鍵字對(duì)象。
關(guān)鍵字對(duì)象有兩個(gè)屬性:
- word: 關(guān)鍵字本身
- count : 永遠(yuǎn)為1,用于后面統(tǒng)計(jì)詞頻
普通分詞及停用詞判斷
for index, row in rows.iterrows():content = row[2]#TextRank 關(guān)鍵詞抽取,只獲取固定詞性words = jieba.cut(content)splitedStr = ''for word in words:#停用詞判斷,如果當(dāng)前的關(guān)鍵詞不在停用詞庫中才進(jìn)行記錄if word not in stopwords:# 記錄全局分詞segments.append({'word':word, 'count':1})splitedStr += word + ' 'Text Rank 關(guān)鍵詞抽取
for index, row in rows.iterrows():content = row[2]#TextRank 關(guān)鍵詞抽取,只獲取固定詞性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 + ' '觀察分詞后的關(guān)鍵字,發(fā)現(xiàn)全是utf-8編碼后的文字,暫時(shí)不管,我們先將這個(gè)數(shù)組轉(zhuǎn)換為DataFrame對(duì)象,調(diào)用groupby方法和sum方法進(jìn)行統(tǒng)計(jì)匯總。
# 將結(jié)果數(shù)組轉(zhuǎn)為df序列 dfSg = pd.DataFrame(segments)# 詞頻統(tǒng)計(jì) dfWord = dfSg.groupby('word')['count'].sum()輸出結(jié)果
#導(dǎo)出csv dfWord.to_csv('keywords.csv',encoding='utf-8') 導(dǎo)出的數(shù)據(jù)結(jié)果完整代碼
# -*- coding: UTF-8 -*- import numpy as np import pandas as pd import jieba import jieba.analyse import codecs#設(shè)置pd的顯示長(zhǎng)度 pd.set_option('max_colwidth',500)#載入數(shù)據(jù) rows=pd.read_csv('datas1.csv', header=0,encoding='utf-8',dtype=str)segments = [] for index, row in rows.iterrows():content = row[2]#TextRank 關(guān)鍵詞抽取,只獲取固定詞性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)# 詞頻統(tǒng)計(jì) dfWord = dfSg.groupby('word')['count'].sum() #導(dǎo)出csv dfWord.to_csv('keywords.csv',encoding='utf-8')總結(jié)
分詞算法
本次實(shí)驗(yàn),我們學(xué)習(xí)了如何使用jieba模塊進(jìn)行中文分詞與關(guān)鍵字提取,結(jié)果各有千秋:
- 普通分詞:需要手工過濾停用詞、無意義詞、電話號(hào)碼、符號(hào)等,但能較為全面的保留所有關(guān)鍵字。
- TF-IDF:停用詞過濾有限,也需要手工處理部分?jǐn)?shù)字、符號(hào);它通過詞頻抽取關(guān)鍵字,對(duì)同一篇文章的詞頻統(tǒng)計(jì)不具有統(tǒng)計(jì)意義,多用于宏觀上的觀測(cè)。
- Text Rank: 大概效果同TF-IDF,通過限定詞性過濾無關(guān)字符,能得到較為工整的關(guān)鍵字結(jié)果。
結(jié)論
總之,我們應(yīng)根據(jù)我們的目標(biāo)去選擇適當(dāng)?shù)姆衷~方法。
- 對(duì)某一篇文章進(jìn)行關(guān)鍵字Map,我們選擇普通分詞,并自行過濾關(guān)鍵詞,或添加自定義詞庫。
- 對(duì)采集的一批樣本進(jìn)行關(guān)鍵字分析,我們可以選擇TF-IDF,對(duì)所有的關(guān)鍵字進(jìn)行詞頻統(tǒng)計(jì),并繪制出關(guān)鍵字云圖。
- 如果我們要分析一批樣本中用戶的分類,用戶的行為,用戶的目的,我們可以選擇TextRank抽取指定詞性的關(guān)鍵字進(jìn)行統(tǒng)計(jì)分析。
引用
jieba 開源倉庫 https://github.com/fxsjy/jieba
下期預(yù)告
Python大數(shù)據(jù):商品評(píng)論的情感傾向分析
總結(jié)
以上是生活随笔為你收集整理的Python大数据:jieba分词,词频统计的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 朴素贝叶斯(naive bayes)
- 下一篇: Intellij Idea 从 Svn