一文詳解如何用 python 做中文分詞

2020-12-13 雷鋒網

雷鋒網(公眾號:雷鋒網)按:本文作者王樹義,原載於微信公眾號玉樹芝蘭(nkwangshuyi),雷鋒網經授權發布。

打算繪製中文詞雲圖?那你得先學會如何做中文文本分詞。跟著我們的教程,一步步用 Python 來動手實踐吧。

  需求

在此前發布的文章《從零開始教你用 Python 做詞雲》一文中,我們介紹了英文文本的詞雲製作方法。大家玩兒得可還高興?

文中提過,選擇英文文本作為示例,是因為處理起來最簡單。但是很快就有讀者嘗試用中文文本做詞雲了。按照前文的方法,你成功了嗎?

估計是不成功的。因為這裡面缺了一個重要的步驟。

觀察你的英文文本。你會發現英文單詞之間採用空格作為強制分隔符。

例如:

Yes Minister is a satirical British sitcom written by Sir Antony Jay and Jonathan Lynn that was first transmitted by BBC Television between 1980 and 1984, split over three seven-episode series.

但是,中文的文本就沒有這種空格區隔了。為了做詞雲,我們首先需要知道中文文本裡面都有哪些「詞」。

你可能覺得這根本不是問題——我一眼就能看出詞和詞之間的邊界!

對,你當然可以。你可以人工處理1句、100句,甚至是10000句話。但是如果給你100萬句話呢?

這就是人工處理和電腦自動化處理的最顯著區別——規模。

別那麼急著放棄啊,你可以用電腦來幫忙。

你的問題應該是:如何用電腦把中文文本正確拆分為一個個的單詞呢?

這種工作,專業術語叫做分詞。

在介紹分詞工具及其安裝之前,請確認你已經閱讀過《從零開始教你用 Python 做詞雲》一文,並且按照其中的步驟做了相關的準備工作,然後再繼續依照本文的介紹一步步實踐。

  分詞

中文分詞的工具有很多種。有的免費,有的收費。有的在你的筆記本電腦裡就能安裝使用,有的卻需要聯網做雲計算。

今天給大家介紹的,是如何利用Python,在你的筆記本電腦上,免費做中文分詞。

我們採用的工具,名稱很有特點,叫做「 結巴分詞 」,具體連結如下:

https://github.com/fxsjy/jieba

為什麼叫這麼奇怪的名字?

讀完本文,你自己應該就能想明白了。

我們先來安裝這款分詞工具。回到你的「終端」或者「命令提示符」下。

進入你之前建立好的demo文件夾。

輸入以下命令:

pip install jieba

好了,現在你電腦裡的Python已經知道該如何給中文分詞了。

  數據

在《從零開始教你用 Python 做詞雲》一文中,我們使用了英劇」Yes, minister「的維基百科介紹文本。這次我們又從維基百科上找到了這部英劇對應的中文頁面。翻譯名稱叫做《是,大臣》。

將網頁正文拷貝下來之後,存入文本文件 yes-minister-cn.txt,並且將這個文件移動到我們的工作目錄 demo 下面。

好了,我們有了用於分析的中文文本數據了。

先別忙著編程序。正式輸入代碼之前,我們還需要做一件事情,就是下載一份中文字體文件 simsun.ttf。具體下載連結如下:

http://t.cn/RKuSeLl

下載後,將這個ttf字體文件也移動到demo目錄下,跟文本文件放在一起。

  代碼

在命令行下,執行:

jupyter notebook

瀏覽器會自動開啟,並且顯示如下界面。

這裡還有上一次詞雲製作時咱們的勞動成果。此時目錄下多了一個文本文件,是"Yes, Minister"的中文介紹信息。

打開這個文件,瀏覽一下內容。

我們確認中文文本內容已經正確存儲。

回到Jupyter筆記本的主頁面。點擊New按鈕,新建一個筆記本(Notebook)。在Notebooks裡面,請選擇Python 2選項。

系統會提示我們輸入Notebook的名稱。為了和上次的英文詞雲製作筆記本區別,就叫它wordcloud-cn好了。

我們在網頁裡唯一的代碼文本框裡,輸入以下3條語句。輸入後,按Shift+Enter鍵執行。

filename = "yes-minister-cn.txt"

with open(filename) as f:

mytext = f.read()

然後我們嘗試顯示mytext的內容。輸入以下語句之後,還是得按Shift+Enter鍵執行。

print(mytext)

顯示的結果如下圖所示。

既然中文文本內容讀取沒有問題,我們就開始分詞吧。輸入以下兩行語句:

import jieba
mytext = " ".join(jieba.cut(mytext))

系統會提示一些信息,那是結巴分詞第一次啟用的時候需要做的準備工作。忽略就可以了。

分詞的結果如何?我們來看看。輸入:

print(mytext)

你就可以看到下圖所示的分詞結果了。

單詞之間已經不再緊緊相連,而是用空格做了區隔,就如同英文單詞間的自然劃分一樣。

你是不是迫不及待要用分詞後的中文文本作詞雲了?

可以,輸入以下語句:

from wordcloud import WordCloud
wordcloud = WordCloud().generate(mytext)
%pylab inlineimport matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off"

激動地期待著中文詞雲的出現?

可惜,你看到的詞雲是這個樣子的。

你是不是非常憤怒,覺得這次又掉坑裡了?

別著急,出現這樣的結果,並不是分詞或者詞雲繪製工具有問題,更不是因為咱們的教程步驟有誤,只是因為字體缺失。詞雲繪製工具wordcloud默認使用的字體是英文的,不包含中文編碼,所以才會方框一片。解決的辦法,就是把你之前下載的simsun.ttf,作為指定輸出字體。

輸入以下語句:

from wordcloud import WordCloud
wordcloud = WordCloud(font_path="simsun.ttf").generate(mytext)
%pylab inlineimport matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

這次你看到的輸出圖形就變成了這個樣子:

這樣一來,我們就通過中文詞雲的製作過程,體會到了中文分詞的必要性了。

這裡給你留個思考題,對比一下此次生成的中文詞雲,和上次做出的英文詞云:

這兩個詞雲對應的文本都來自維基百科,描述的是同樣一部劇,它們有什麼異同?從這種對比中,你可以發現維基百科中英文介紹內容之間,有哪些有趣的規律?

  討論

掌握了本方法後,你自己做出了一張什麼樣的中文詞雲圖?除了做詞雲以外,你還知道中文分詞的哪些其他應用場景?歡迎留言,分享給大家。我們共同交流討論。

雷鋒網相關閱讀:

從零開始教你用 Python 做詞雲

詳解基於樸素貝葉斯的情感分析及 Python 實現

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 如何用Python做中文分詞?
    打算繪製中文詞雲圖?那你得先學會如何做中文文本分詞。跟著我們的教程,一步步用Python來動手實踐吧。(由於微信公眾號外部連結的限制,文中的部分連結可能無法正確打開。如有需要,請點擊文末的「閱讀原文」按鈕,訪問可以正常顯示外鏈的版本。)需求在《如何用Python做詞雲》一文中,我們介紹了英文文本的詞雲製作方法。大家玩兒得可還高興?
  • 資源 | Python中文分詞工具大合集
    安裝這些模塊其實很簡單,只要按官方文檔的方法安裝即可,以下做個簡單介紹,主要是在Python3.x & Ubuntu16.04 的環境下測試及安裝這些中文分詞器。再附加介紹12款其他的中文分詞工具或者中文分詞模塊,最後的兩款fnlp和ansj是比較棒的java中文分詞工具,貌似還沒有python接口,記錄一下。這些中文分詞工具我沒有測試,感興趣的同學可以動手試試。
  • Python中文分詞工具大合集:安裝、使用和測試
    安裝這些模塊其實很簡單,只要按官方文檔的方法安裝即可,以下做個簡單介紹,主要是在Python3.x & Ubuntu16.04 的環境下測試及安裝這些中文分詞器。再附加介紹12款其他的中文分詞工具或者中文分詞模塊,最後的兩款fnlp和ansj是比較棒的java中文分詞工具,貌似還沒有python接口,記錄一下。這些中文分詞工具我沒有測試,感興趣的同學可以動手試試。
  • 中文分詞工具評估:chinese-segmentation-evaluation
    這裡有一個Java開源項目cws_evaluation,對中文分詞做了評比,但有幾點不足:(1). 只有java版本,但是機器學習主要是基於python的 (2).效果指標為行完美率和字完美率,該指標不妥,特別是句子越長,越無意義,(3). 每種分詞工具評測的算法太多了,這裡僅評比了默認的分詞算法。
  • NLP快速入門:手把手教你用HanLP做中文分詞
    中文分詞技術作為中文自然語言處理的第一項核心技術,是眾多上層任務的首要基礎工作,同時在日常的工作中起著基礎性的作用。本文將講解如何在Python環境下調用HanLP包進行分詞,並結合Python語言簡約的特性,實現一行代碼完成中文分詞。
  • 【Python環境】python的nltk中文使用和學習資料匯總幫你入門提高
    包括分詞(tokenize), 詞性標註(POS), 文本分類, 等等現成的工具.1. nltk的安裝資料1.1: 黃聰:Python+NLTK自然語言處理學習(一):環境搭建 http://www.cnblogs.com/huangcong/archive/2011/08/29/2157437.html 這個圖文並茂, 步驟清晰, 值得一看.
  • 手把手教你用Jieba做中文分詞
    Jieba分詞結合了基於規則和基於統計兩類方法。首先基於前綴詞典進行詞圖掃描,前綴詞典是指詞典中的詞按照前綴包含的順序排列,如詞典中出現了「上」,之後以「上」開頭的詞都會出現在一起,如詞典中出現「上海」一詞,進而會出現「上海市」等詞,從而形成一種層級包含結構。
  • 【分詞】從why到how的中文分詞詳解,從算法原理到開源工具
    2.2 基於統計機器學習NLP是一門跟機器學習強綁定的學科,分詞問題自然也不例外。中文分詞同樣可以建模成一個「序列標註」問題,即一個考慮上下文的字分類問題。因此可以先通過帶標籤的分詞語料來訓練一個序列標註模型,再用這個模型對無標籤的語料進行分詞。
  • 分詞|Python最好的中文分詞庫
    jieba庫最出名的功能就是中文分詞,在jieba中提供了三種常用的分詞模式:精確模式:將句子按照最精確的方法進行切分,適合用於進行文本分析;全模式:將句子當中所有可以成詞的詞語都掃描出來,分詞速度很快但容易產生歧義;搜尋引擎模式:在精確模式分詞的基礎上,將長的句子再次進行切分,提高召回率,適用於搜尋引擎的分詞。
  • PHP 實現中文分詞搜索功能
    中文分詞介紹眾所周知,英文是以詞為單位的,詞和詞之間是靠空格隔開,而中文是以字為單位,句子中所有的字連起來才能描述一個意思。例如,英文句子I am a student,用中文則為:「我是一個學生」。計算機可以很簡單通過空格知道student是一個單詞,但是不能很容易明白「學」、「生」兩個字合起來才表示一個詞。
  • 常見中文分詞包比較
    注意:不建議直接輸入 GBK 字符串,可能無法預料的錯誤解碼成 UTF-8jieba.cut 以及 jieba.cut_for_search 返回的結構都是一個可迭代的 generator,可以使用 for 循環來獲得分詞後得到的每一個詞語(unicode),或者用jieba.lcut 以及 jieba.lcut_for_search
  • 英語語法詳解:現在分詞和動名詞區別
    新東方網>英語>英語學習>語法詞彙>語法指導>正文英語語法詳解:現在分詞和動名詞區別 2016-01-19 15:02 來源:北京新東方北美VIP 作者:路宇
  • 11款開放中文分詞引擎大比拼
    對於我們每天打交道的中文來說,並沒有類似英文空格的邊界標誌。而理解句子所包含的詞語,則是理解漢語語句的第一步。漢語自動分詞的任務,通俗地說,就是要由機器在文本中的詞與詞之間自動加上空格。一提到自動分詞,通常會遇到兩種比較典型的質疑。一種質疑是來自外行人的:這件事看上去平凡之極,好像一點兒也不「fancy」,會有什麼用呢?
  • 簡單有效的多標準中文分詞
    自然語言處理,特別是中文處理中,語料庫往往珍稀且珍貴。具體到中文分詞,也是如此。為了做出一個實用的系統,不光需要高效的算法,大規模語料庫也必不可少。然而對於缺乏經費的研究團隊和個人,卻往往只能得到sighan2005等屈指可數的幾個小型語料庫。
  • 結巴分詞 0.32 發布,Python 中文分詞組件
    結巴分詞:做最好的Python中文分詞。此次release包含以下更新:1.
  • 中文博大精深,人工智慧如何理解中文的,細說中文分詞的發展歷程
    中華文明上下五千年,中國文化博大精深,一直以來,讓人工智慧理解中文都是一個困擾著科學家與程式設計師的難題。如何讓人工智慧理解人類的語言呢?最簡單的做法就是提取關鍵詞,然後對關鍵詞進行分類。無數科學家和程式設計師一直再分詞上面做優化,無奈中文實在太博大精深,人工智慧一直理解不了。畢竟中文一個詞可以表達多個意思,兩個毫不相干的漢字,就能組成一個新的詞彙。基於HMM分詞法既然按照一個詞典分詞解決不了問題,那麼我們就給每字定義一個屬性,判斷這個字是詞頭,詞中,還是詞尾的,或者是單個成詞,然後每次分詞的時候,看看每個字的成為詞的概率多大。
  • SEO優化中的中文分詞有什麼作用,分詞的優化方法詳解
    中文分詞是一個專業術語,在SEO優化中使用最為廣泛,所有的搜索都是由關鍵詞來完成,而關鍵詞有時會存在歧義或多解,這時候就會出現分詞,在過去的一段時間內中文分詞對於SEO優化有很多的幫助,而現在SEO優化中使用分詞依然很重要,但是搜尋引擎技術的升級,分詞也不一定會起到希望的效果。
  • Python如何生成詞雲(詳解)
    今天教大家用wrodcloud模塊來生成詞雲,我讀取了一篇小說並生成了詞雲,先看一下效果圖:效果圖一
  • 用TensorFlow構建一個中文分詞模型需要幾個步驟
    中文分詞方法現在主要有兩種類型,一種是jieba這樣軟體包中用隱馬爾科夫(HMM)模型構建的。這裡面我們主要以後者為參考。中文分詞往往有兩個直接目標,一個是把詞彙分開,另一個給每個詞以詞性,例如動詞、名詞,或者更細分的地點名詞、機構名詞等等。如果只是分詞,是中文分詞任務(SEG,Chinese Segmentation),如果需要詞性,也可以被稱為詞性標註任務(POS,Part os Speech)任務。
  • 用Bi-GRU+Attention和字向量做端到端的中文關係抽取
    這裡以實踐為目的,介紹一個用雙向GRU、字與句子的雙重Attention模型,以天然適配中文特性的字向量(character embedding)作為輸入,網絡爬取數據作為訓練語料構建的中文關係抽取模型。代碼主要是基於清華的開源項目thunlp/TensorFlow-NRE開發,感謝!