Windows上pyltp的安裝及使用
前言
最近在做電影評論中人名識別的相關工作,對這一塊思考了很久,因為評論中的人名稱呼不一,“一人多名”是很普遍的,前期使用了hanlp的HMM模型、CRF模型匹配出的“nr”都是比較正常的人名,後期使用了nlpir模型但還是有些缺漏,對於贅詞“小”“大”“老”“哥”等基本都匹配不出。後面使用了哈工大的LTP,發覺效果明顯提升,由於是在Ubuntu上進行程式碼編寫,在安裝pyltp時頻頻報錯,確實令人心灰意冷,後來另闢蹊徑採用ltp介面,但是在速度上受限以及輸入上諸多規範,就在想要放棄的時候,突然成功安裝Windows上的pyltp,在此非常感謝這位博主:http://blog.csdn.net/mebiuw/article/details/52496920
關於LTP
語言技術平臺(LTP) 是由哈工大社會計算與資訊檢索研究中心歷時11年的持續研發而形成的一個自然語言處理工具庫,其提供包括中文分詞、詞性標註、命名實體識別、依存句法分析、語義角色標註等豐富、 高效、精準的自然語言處理技術。LTP制定了基於XML的語言處理結果表示,並在此基礎上提供了一整套自底向上的豐富而且高效的中文語言處理模組(包括詞法、句法、語義等6項中文處理核心技術),以及基於動態連結庫(Dynamic Link Library, DLL)的應用程式介面,視覺化工具,並且能夠以網路服務(WebService)的形式進行使用。
安裝過程
一.安裝python2.7
1.進入連結:https://www.python.org/download/releases/2.7/
選擇適合自己的版本,下載後直接安裝即可
2.配置環境
將python路徑加入Path中。右鍵單擊 【我的電腦】,選擇選單屬性命令,在彈出的對話方塊中選擇 【高階系統設定】 標籤,然後點選【環境變數】 按鈕。選中【系統變數】中的“Path”選項,單擊【編輯】按鈕,將彈出如下圖所示的對話方塊。在【變數值】文字框中的末尾新增“;C:\Python27”(這裡是你的安裝路徑),單擊【確定】按鈕。
二.安裝Micorsoft Visual C++ Compiler for Python 2.7
因為LTP平臺是基於C++,在安裝pyltp的過程中會報錯:
Microsoft Visual C++ 9.0 is required (Unable to find vcvarsall.bat). Get it from http://aka.ms/vcpython27
所以需要先安裝這個軟體,前往這個連結:https://www.microsoft.com/en-us/download/details.aspx?id=44266 下載安裝即可
三.安裝pyltp
在已經安裝好pip的前提下,開啟cmd,進入如下路徑:
輸入
pip install pyltp
看到下面的就成功啦!
Successfully installed pyltp
接下來就是下載ltp的相關模型,可在此百度雲選擇下載:https://pan.baidu.com/share/link?shareid=1988562907&uk=2738088569#list/path=%2F
四.pyltp的使用
注意點:模型的路徑最好不要有中文,不然模型載入不出
# -*- coding: utf-8 -*-
from pyltp import SentenceSplitter
from pyltp import Segmentor
from pyltp import Postagger
from pyltp import NamedEntityRecognizer
from pyltp import Parser
def sentence_splitter(sentence):
"""
分句,也就是將一片文字分割為獨立的句子
:param sentence:幾句話
:return: 單個單個句子
"""
single_sentence = SentenceSplitter.split(sentence) # 分句
print '\n'.join(single_sentence)
def word_splitter(sentence):
"""
分詞
:param sentence:
:return:
"""
segmentor = Segmentor() # 初始化例項
segmentor.load('D:\Python code\ltp_model\ltp_data_v3.4.0\cws.model') # 載入模型
words = segmentor.segment(sentence) # 分詞
# 預設可以這樣輸出
# print '\t'.join(words)
# 可以轉換成List 輸出
words_list = list(words)
for word in words_list:
print word
segmentor.release() # 釋放模型
return words_list
def word_tag(words):
"""
詞性標註
:param words: 已切分好的詞
:return:
"""
postagger = Postagger() # 初始化例項
postagger.load('D:\Python code\ltp_model\ltp_data_v3.4.0\pos.model') # 載入模型
postags = postagger.postag(words) # 詞性標註
for word, tag in zip(words, postags):
print word+'/'+tag
postagger.release() # 釋放模型
return postags
def name_recognition(words, postags):
"""
命名實體識別
:param words:分詞
:param postags:標註
:return:
"""
recognizer = NamedEntityRecognizer() # 初始化例項
recognizer.load('D:\Python code\ltp_model\ltp_data_v3.4.0\\ner.model') # 載入模型
netags = recognizer.recognize(words, postags) # 命名實體識別
for word, ntag in zip(words, netags):
print word + '/' + ntag
recognizer.release() # 釋放模型
return netags
def parse(words, postags):
"""
依存句法分析
:param words:
:param postags:
:return:
"""
parser = Parser() # 初始化例項
parser.load('D:\Python code\ltp_model\ltp_data_v3.4.0\parser.model') # 載入模型
arcs = parser.parse(words, postags) # 句法分析
print "\t".join("%d:%s" % (arc.head, arc.relation) for arc in arcs)
parser.release() # 釋放模型
# 測試分句子
# sentence_splitter('你好,你覺得這個例子從哪裡來的?當然還是直接複製官方文件,然後改了下這裡得到的。')
# 測試分詞
# word_splitter('你好,你覺得這個例子從哪裡來的?當然還是直接複製官方文件,然後改了下這裡得到的。')
# 測試詞性標註
# word_tag(word_splitter('你好,你覺得這個例子從哪裡來的?當然還是直接複製官方文件,然後改了下這裡得到的。'))
# 測試命名實體識別
# words = word_splitter('我家在昆明,我現在在北京上學。中秋節你是否會想到李白?')
# tags = word_tag(words)
# name_recognition(words, tags)
# 測試句法分析
# parse(words, tags)