Python 中文分詞 NLPIR 快速搭建

前述

本篇文章寫完須要半個小時,閱讀須要十分鐘,讀完後,你將學會在Python中使用NLPIR,以及關於使用它的一些有用的基礎知識
NLPIR 是中科院的漢語分詞系統,在Python中使用也比較普遍,並且曾屢次奪得漢語分詞比賽的冠軍,而且其能夠在多個語言上都實現了接口甚至在Hadoop中也可使用,博主比較推薦NLPIRhtml

github地址:https://github.com/NLPIR-team/NLPIR
官網地址:http://ictclas.nlpir.org/python

NLPIR在Python中的兩種實現方式的比較

NLPIR在Python中有兩種實現方式
1. pip install pynlpir(即下載,python封裝的nlpir類庫)
2. 直接在項目中引入NLPIR,使用官方的py文件,直接調用dll文件接口git

第一種方式的好處在於便於使用?只須要pip install 便可,可是博主不推薦這種方式,由於pynlpir功能太少,根本沒法知足咱們的使用要求,並且與其安裝pynlpir還不如直接安裝jieba,其源碼中實現的接口以下:
pynlpir中實現的接口
在下載了pynlpir以後,我就開始上手使用,然而…它彷佛沒有實現用戶添加詞典的功能,除非去包裏面直接把詞典換了,這樣一來,假如咱們又遇到了」路明非」的問題,就是錯分新詞」路明非」爲兩個詞」路明」,」明非」,原文例子請點擊http://blog.csdn.net/fontthrone/article/details/72782499,在NLPIR沒有識別其爲新詞的狀況下,那麼咱們根本沒法經過pynlpir自己解決,雖然能夠利用from pynlpir import nlpir來實如今pynlpir中引用nlpir可是該版本的nlpir仍然是閹割版本的nlpir,好比用戶沒法直接修改nlpir詞庫,而在每次程序運行時手動執行import userdict,這就意味這程序自己的性能被大打折扣.github

而相對之下,原版的NLPIR雖然配置略顯麻煩,可是不管更全面,所以在須要更強大的功能時,博主推薦使用NLPIR,而他們的功能我將會在下面的部分說明.windows

Python 類庫 pynlpir

1.安裝
不管py2/3,只需pip install pynlpir便可
2. demo codemarkdown

# - * - coding: utf - 8 -*-
#
# 做者:田豐(FontTian)
# 建立時間:'2017/5/24'
# 郵箱:fonttian@163.com
# CSDN:http://blog.csdn.net/fontthrone
import sys
reload(sys)
sys.setdefaultencoding('utf8')

import pynlpir
# from pynlpir import nlpir 
# 能夠引用和原nlpir中差很少的py文件
pynlpir.open()

s = '歡迎科研人員、技術工程師、企事業單位與我的參與NLPIR平臺的建設工做。'
str = s.encode('utf-8')
print str
wordslist1 = pynlpir.segment(str)
wordslist2 = pynlpir.get_key_words(str)
wordslist3 = pynlpir._get_pos_name(str)

# 下面的代碼是在pynlpir中添加用戶自定義詞語
# pynlpir.AddUserWord('路明非')

print wordslist1

for item in wordslist1:
    print item[0]
    print item[1]
for item in wordslist2:
    print item

pynlpir分詞結果演示1
(1)即便是在python2中設定了文件的默認格式爲utf-8可是由於在windows中控制檯的中文默認編碼格式爲gbk,因此控制檯的窗口依然會顯示亂碼,可是請放心,經過
import sys
reload(sys)
sys.setdefaultencoding('utf8')

其實str的默認編碼格式已經成了utf-8.
(2)爲了在控制檯查看demo中的分詞,可使用迭代器循環輸出,同時也由於編碼格式確實是utf-8,因此這是即便再也不使用encode(‘utf-8’),可是控制檯仍然不會亂碼.
下面是wordslist2中的分詞
pynlpir分詞結果演示2
效果良好app

在Python中使用NLPIR的接口

在博主在Python中使用NLPIR的時候參考了這篇文章:Python調用中科院NLPIR(ICTCLAS2015)詳解,可是隻是部分借鑑,博主使用的是2016,其實使用NLPIR很是簡單,只要本身看看官方的文檔就能夠很好的使用,不過官方文檔是真的亂.並且是分散的.oop

1.根據博主以前參考的博客,彷佛想要使用NLPIR,首先要在電腦上搭建swig
下面是一段引用,github下載地址swig官網下載地址性能

友情提示:若是是swig問題,本身處理。首先下載swig,swig能夠幫助咱們將C或者C++編寫的DLL或者SO文件綁定到包括Python在內的多種語言。Windows下將安裝包下載到必定目錄下將該目錄加入環境變量的path中便可使用swig(固然也能夠輸入完整的路徑來使用swig)。能夠打開命令行窗口,在裏面輸入swig,若是出現「Must specify an input file. Use -help for available options.」則表示一切順利。學習

2.下載NLPIR
官網下載頁面:NLPIR的官網下載頁面

3.下載後解壓並新建文件夾
(1)在下載文件以後,解壓文件,而後新建文件夾」組合包」,其它名稱亦可
(2)組合包內成員包括:
1. 漢語分詞20140928\sample\pythonsample下全部文件
2. Data文件夾,直接複製拖入便可
3. 新建文件夾」bin」下爲」importuserdict」中的zip文件解壓後文件,注意此處爲NLPIR的自帶詞典,若是你想添加本身的詞典,你能夠閱讀此文件下的REAME.txt,來添加本身的詞庫
4. 根據機器的位數(64/32)修改配置文件
根據機器的位數(64/32)修改配置文件
5. 證書問題:當你一次在Python中調用NLPIR時會報:Initialization failed!
放心第一次運行出現這個錯誤這通常是正常的你只要去如今最新的受權證書就能夠了.
具體請參考我以前的文章:http://blog.csdn.net/fontthrone/article/details/72692691
6. 注意默認的nlpir的默認Python接口爲Python2.若是你想在python3中使用nlpir你能夠參考官方文檔,同時這篇文章中也對python接口的其餘問題進行了說明:
https://github.com/haobibo/ICTCLAS_Python_Wrapper
7.在Python2.7中使用NLPIR2016
(1)直接將剛纔作好的文件夾中的全部文件拖入你的項目便可使用:
示例一
(2)而後按照普通的引用Python文件來使用nlpir便可:
Python2 引用 nlpir2016
(3)具體可引用的方法直接查詢官方給的nlpir文件便可
nlpir中的方法 源碼
在測試以後,確實直接引用官方接口,功能確實強了不少
最後附上一個簡單的測試代碼,我將會在下一篇文章詳細介紹nlpir2016Python接口使用(最近有點忙,可能在這個週週末才能更新,故而附上小生qq:2404846224,有興趣一塊兒學習的小夥伴,請備註來自csdn博客)

# - * - coding: utf - 8 -*-
#
# 做者:田豐(FontTian)
# 建立時間:'2017/5/31'
# 郵箱:fonttian@163.com
# CSDN:http://blog.csdn.net/fontthrone

from os import path
from nlpir import *
from scipy.misc import imread
import matplotlib.pyplot as plt
from wordcloud import WordCloud, ImageColorGenerator

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

d = path.dirname(__file__)
AddUserWord('龍族')
AddUserWord('大和炮')
AddUserWord('競技類')
# Init()
# SaveTheUsrDic('路明非')

text_path = 'txt/lztest.txt' #設置要分析的文本路徑
stopwords_path = 'stopwords\stopwords1893.txt' # 停用詞詞表
text = open(path.join(d, text_path)).read()
txt = seg(text)
seg_list =[]
for t in txt:
    seg_list.append(t[0].encode('utf-8'))
    seg_list += ' '
# 使用NLPIR進行中文分詞
print seg_list

# 去除停用詞
def jiebaclearText(text):
    mywordlist = []
    liststr = "/ ".join(seg_list)
    f_stop = open(stopwords_path)
    try:
        f_stop_text = f_stop.read()
        f_stop_text = unicode(f_stop_text, 'utf-8')
    finally:
        f_stop.close()
    f_stop_seg_list = f_stop_text.split('\n')
    for myword in liststr.split('/'):
        if not (myword.strip() in f_stop_seg_list) and len(myword.strip()) > 1:
            mywordlist.append(myword)
    return ''.join(mywordlist)

# 去除完停用詞的文本
s = jiebaclearText(seg_list)
print s
相關文章
相關標籤/搜索