如何用 Python 中的 NLTK 對中文進行分析和處理?

用nltk對自己的日記進行分析。得到以下結果(節選)

"xb8xb0", "xe5xbcxbaxe8xba", "xe5xbdxbcxe5", "xb8xb4", "xb8x8a", "xb8x8b", "xb8x88", "xb8x89", "xb8x8e", "xb8x8f", "xb8x8d", "xb8x82", "xb8x83", "xb8x80", "xb8x81", "xb8x87", "tend", "xb8x9a",

請問對於中文的自然語言分析,有哪些方法和工具可以推薦?


最近正在用nltk 對中文網路商品評論進行褒貶情感分類,計算評論的信息熵(entropy)、互信息(point mutual information)和困惑值(perplexity)等(不過這些概念我其實也還理解不深...只是nltk 提供了相應方法)。

我感覺用nltk 處理中文是完全可用的。其重點在於中文分詞和文本表達的形式。

中文和英文主要的不同之處是中文需要分詞。因為nltk 的處理粒度一般是詞,所以必須要先對文本進行分詞然後再用nltk 來處理(不需要用nltk 來做分詞,直接用分詞包就可以了。嚴重推薦結巴分詞,非常好用)。

中文分詞之後,文本就是一個由每個片語成的長數組:[word1, word2, word3…… wordn]。之後就可以使用nltk 裡面的各種方法來處理這個文本了。比如用FreqDist 統計文本詞頻,用bigrams 把文本變成雙片語的形式:[(word1, word2), (word2, word3), (word3, word4)……(wordn-1, wordn)]。

再之後就可以用這些來計算文本詞語的信息熵、互信息等。

再之後可以用這些來選擇機器學習的特徵,構建分類器,對文本進行分類(商品評論是由多個獨立評論組成的多維數組,網上有很多情感分類的實現例子用的就是nltk 中的商品評論語料庫,不過是英文的。但整個思想是可以一致的)。

另外還有一個困擾很多人的Python 中文編碼問題。多次失敗後我總結出一些經驗。

Python 解決中文編碼問題基本可以用以下邏輯:

utf8(輸入) ——&> unicode(處理) ——&> (輸出)utf8

Python 裡面處理的字元都是都是unicode 編碼,因此解決編碼問題的方法是把輸入的文本(無論是什麼編碼)解碼為(decode)unicode編碼,然後輸出時再編碼(encode)成所需編碼。

由於處理的一般為txt 文檔,所以最簡單的方法,是把txt 文檔另存為utf-8 編碼,然後使用Python 處理的時候解碼為unicode(sometexts.decode("utf8")),輸出結果回txt 的時候再編碼成utf8(直接用str() 函數就可以了)。

另外這篇文章也有很詳細的講到nltk 的中文應用,很值得參考:http://blog.csdn.net/huyoo/article/details/12188573


額,樓主遇到的只是編碼的問題…

有很多好用的中文處理包:

Jieba:可以用來做分詞,詞性標註,TextRank

HanLP:分詞,命名實體識別,依存句法分析,還有FudanNLP,NLPIR

個人覺得都比NLTK好用~


你說這個跟NLTK無關,換Python3,就沒有這些鬼了!中文還得UTF8!

大愛NLTK!其它包,除了固定任務的,java就算了,


首先答主的問題應該是編碼問題,處理一下編碼就可以了。再者Python做中文分詞有這幾種結巴分詞、NLKT、THULAC,後面的這個是在做項目的過程中,@江踏歌 江兄告訴我的。

1、fxsjy/jieba

結巴的標語是:做最好的 Python 中文分片語件,或許從現在來看它沒做到最好,但是已經做到了使用的人最多。結巴分詞網上的學習資料和使用案例比較多,上手相對比較輕鬆,速度也比較快。

結巴的優點:

  • 支持三種分詞模式
  • 支持繁體分詞
  • 支持自定義詞典
  • MIT 授權協議

2、THULAC:一個高效的中文詞法分析工具包

前兩天我在做有關於共享單車的用戶反饋分類,使用jieba分詞一直太過零散,分類分不好。後來江兄給我推薦了THULAC: 由清華大學自然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包 。THULAC的介面文檔很詳細,簡單易上手。

THULAC分詞的優點:

  1. 能力強。利用規模最大的人工分詞和詞性標註中文語料庫(約含5800萬字)訓練而成,模型標註能力強大。
  2. 準確率高。該工具包在標準數據集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標註的F1值可達到92.9%
  3. 速度較快。同時進行分詞和詞性標註速度為300KB/s,每秒可處理約15萬字。只進行分詞速度達到1.3MB/s,速度比jieba慢。

至於NLKT我不是很了解,改天試試:Natural Language Toolkit

一份53M的數據進行分詞的速度對比可以參考一下:


使用:text.decode("gbk")

分詞:你找相應的中文分詞包 https://github.com/fxsjy/jieba


中文分詞用結巴就好了,我做了個小例子 nltk-比較中文文檔相似度


snowNLP是個國人寫的不錯的庫 剛找到還沒來得及用

其他人的資料:使用Python的SnowNLP模塊實現情感分析 - 柳汀軒 - CSDN博客


樓主參照的是《python自然語言處理》的紙質中文版或紙質原文版?假如英語水平不錯,不如直接看網上的NLTK Book,或與你手上的書兩相參照。網路版好處在於,它增添了書上沒有的細節,這些細節大都跟版本有關,可以解決你的疑惑。

不如換用python3,對中文支持更好。


樓主碰到的是編碼問題無疑,最簡單的解決辦法是換成Python 3.X,沒有中文的編碼問題,中文默認是Unicode。如果是Pthon 2.7,要概對中文輸入先解碼(decode)成Unicode編碼就好。


因為nltk不能對中文進行分詞的原因吧,最近也在學習這方面的東西,推薦一個工具中文處理工具,可以研究一下


是字元串沒有解碼。你得首先知道你機器的編碼,然後python3 裡面字元串加上.decode()就可以了。


我遇到同樣的問題,在看《Python自然語言處理》一書,成功載入自己的文檔後,卻看到裡面的中文如你所示,應該是編碼設置的問題,但是不知道該設置哪裡。這方面的資料太少了


推薦閱讀:

用python去搞數學建模可行性大不大?
python生成器到底有什麼優點?
金融工程現在用python多嗎?
dlib人臉識別 模塊 如何 在Python 中安裝?
如何把嵌套的python list轉成一個一維的python list?

TAG:Python | 自然語言處理 |