用pyltp做分詞、詞性標註、ner
工具:win10、python2.7
主要參考官方文件
http://pyltp.readthedocs.io/zh_CN/latest/api.html#
http://ltp.readthedocs.io/zh_CN/latest/install.html
1、安裝pyltp
https://github.com/hit-scir/pyltp
別忘了下載網頁裡面的模型,這個是會更新的
下載原始碼後解壓,用cmd命令切換到解壓目錄,用python setup.py install命令安裝,在python中import pyltp不報錯說明就成功了
2、安裝cmake
https://cmake.org/download/
在連結里根據自己電腦型號下載.msi檔案,開啟後按照提示一步步安裝就行
3、下載VS
這個大家的電腦基本都有吧
4、編譯
在專案資料夾下新建一個名為 build 的目錄,在cmd命令中切換到build目錄,執行:cmake..
構建後得到ALL_BUILD、RUN_TESTS、ZERO_CHECK三個VC Project。
使用VS開啟ALL_BUILD專案,在 生成/配置管理器 中選擇Release
右鍵生成
就能在tools/train/Release目錄下看到otcws和otpos等套件
5、分詞
from pyltp import Segmentor def segmentor(sentence): segmentor = Segmentor() segmentor.load('cws.model') #載入模型 words = segmentor.segment(sentence) #分詞 word_list = list(words) segmentor.release() #釋放模型 return word_list
個性化分詞
個性化分詞是LTP的特色功能。個性化分詞為了解決測試資料切換到如小說、財經等不同於新聞領域的領域。在切換到新領域時,使用者只需要標註少量資料。個性化分詞會在原有新聞資料基礎之上進行增量訓練。從而達到即利用新聞領域的豐富資料,又兼顧目標領域特殊性的目的。
用cmd命令切換到tools/train/Release目錄
輸入:
otcws.exe customized-learn --baseline-modelpath/to/your/model --model name.model --reference path/to/the/reference/file --development path/to/the/development/file
等待
其中:
reference:指定訓練集檔案
development:指定開發集檔案
algorithm:指定引數學習方法,現在LTP線上學習框架支援兩種引數學習方法,分別是passive aggressive(pa)和average perceptron(ap)。
model:指定輸出模型檔名字首,模型採用model.$iter方式命名
max-iter:指定最大迭代次數
rare-feature-threshold:模型裁剪力度,如果rare-feature-threshold為0,則只去掉為0的特徵;rare-feature-threshold;如果大於0時將進一步去掉更新次數低於閾值的特徵。關於模型裁剪演算法細節,請參考模型裁剪 部分。
dump-details:指定儲存模型時輸出所有模型資訊,這一引數用於 個性化分詞 ,具體請參考 個性化分詞 。
需要注意的是,reference和development都需要是人工切分的句子。
6、詞性標註
from pyltp import Postagger
def posttagger(words):
postagger = Postagger()
postagger.load('pos.model')
posttags = postagger.postag(words) #詞性標註
postags = list(posttags)
postagger.release() #釋放模型
return postags
7、ner
def ner(words, postags):
recognizer = NamedEntityRecognizer()
recognizer.load('ner.model') #載入模型
netags = recognizer.recognize(words, postags) #命名實體識別
for word, ntag in zip(words, netags):
print word + '/' + ntag
recognizer.release() #釋放模型
nerttags = list(netags)
8、讀取文字
import codecsnews_files = codecs.open('C:test.txt', 'r', encoding='utf8')#讀取的文字格式是encoding引數值,codecs函式將其轉化為unicode格式。news_list = news_files.readlines()
9、儲存
#新建一個txt檔案儲存命名實體識別的結果
out_file = codecs.open('ner.txt', 'w', encoding='utf8')
for row in news_list:
news_str = row.encode("utf-8")#分詞引數輸入的格式必須為str格式
words = segmentor(news_str)
tags = posttagger(words)
nertags = ner(words, tags)
for word, nertag in zip(words, nertags):
out_file.write(word.decode('utf-8') + '/' + nertag.decode('utf-8') + ' ')
out_file.close()
10、提取
import codecs
import re
file=codecs.open('/ner.txt','r',encoding='utf8')
file_content = file.read()
file_list = file_content.split()
#print file_list
out_file = codecs.open('tiqu.txt', 'w', encoding='utf8')
ner_list=[]
phrase_list=[]
for word in file_list:
if(re.search('Ni$',word)):#$表示結尾
print word
out_file.write(word+' ')
word_list=word.split('/')
# 判斷是否單個詞是否是命名實體
if re.search(r'^S', word_list[1]):
ner_list.append(word_list[0])
elif re.search(r'^B', word_list[1]):
phrase_list.append(word_list[0])
elif re.search(r'^I', word_list[1]):
phrase_list.append(word_list[0])
else:
phrase_list.append(word_list[0])
# 把list轉換為字串.
ner_phrase = ''.join(phrase_list)
ner_list.append(ner_phrase)
phrase_list = []
#for ner in ner_list:
#print ner
out_file.close()