hanlp自然語言處理包的基本使用--python
hanlp擁有:中文分詞、命名實體識別、摘要關鍵字、依存句法分析、簡繁拼音轉換、智慧推薦。
這裡主要介紹一下hanlp的中文分詞、命名實體識別、依存句法分析,這裡就不介紹具體的hanlp的安裝了,百度教程很多,可以看這裡:http://hanlp.com/ 裡面也有相關的一些介紹。
我以前還使用過jieba分詞和LTP,綜合來說,LTP是做的相對要好一點,特別是中文處理這一塊,但是它的最大缺點是不開源,而hanlp功能更齊全而且開源,更加有利於大家的專案開發的使用。
首先使用hanlp對中文進行處理的前提是大家已經安裝好了hanlp:
第一將這幾個放在你的專案下,
然後點選hanlp.propertiess,更改
保證你的data資料在這個目錄之下
下面貼上一些處理自然語言的基本方法(以下程式碼並非原創,來自於百度上的大神):
#-*- coding:utf-8 -*-
from jpype import *
startJVM(getDefaultJVMPath(), "-Djava.class.path=D:\python_projects\zhengzebiaodashi\hanlp\hanlp-1.3.4.jar;D:\python_projects\zhengzebiaodashi\hanlp",
"-Xms1g",
"-Xmx1g") # 啟動JVM,Linux需替換分號;為冒號:
print("=" * 30 + "HanLP分詞" + "=" * 30)
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分詞
print(HanLP.segment('你好,歡迎在Python中呼叫HanLP的API'))
print("-" * 70)
print("=" * 30 + "標準分詞" + "=" * 30)
StandardTokenizer = JClass('com.hankcs.hanlp.tokenizer.StandardTokenizer')
print(StandardTokenizer.segment('你好,歡迎在Python中呼叫HanLP的API'))
print("-" * 70)
# NLP分詞NLPTokenizer會執行全部命名實體識別和詞性標註
print("=" * 30 + "NLP分詞" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中國科學院計算技術研究所的宗成慶教授正在教授自然語言處理課程'))
print("-" * 70)
print("=" * 30 + "索引分詞" + "=" * 30)
IndexTokenizer = JClass('com.hankcs.hanlp.tokenizer.IndexTokenizer')
termList = IndexTokenizer.segment("主副食品");
for term in termList:
print(str(term) + " [" + str(term.offset) + ":" + str(term.offset + len(term.word)) + "]")
print("-" * 70)
print("=" * 30 + " N-最短路徑分詞" + "=" * 30)
# CRFSegment = JClass('com.hankcs.hanlp.seg.CRF.CRFSegment')
# segment=CRFSegment()
# testCase ="今天,劉志軍案的關鍵人物,山西女商人丁書苗在市二中院出庭受審。"
# print(segment.seg("你看過穆赫蘭道嗎"))
print("-" * 70)
print("=" * 30 + " CRF分詞" + "=" * 30)
print("-" * 70)
print("=" * 30 + " 極速詞典分詞" + "=" * 30)
SpeedTokenizer = JClass('com.hankcs.hanlp.tokenizer.SpeedTokenizer')
print(NLPTokenizer.segment('江西鄱陽湖乾枯,中國最大淡水湖變成大草原'))
print("-" * 70)
print("=" * 30 + " 自定義分詞" + "=" * 30)
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
CustomDictionary.add('攻城獅')
CustomDictionary.add('單身狗')
HanLP = JClass('com.hankcs.hanlp.HanLP')
print(HanLP.segment('攻城獅逆襲單身狗,迎娶白富美,走上人生巔峰'))
print("-" * 70)
print("=" * 20 + "命名實體識別與詞性標註" + "=" * 30)
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中國科學院計算技術研究所的宗成慶教授正在教授自然語言處理課程'))
print("-" * 70)
document = "水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞釋出會上透露," \
"根據剛剛完成了水資源管理制度的考核,有部分省接近了紅線的指標," \
"有部分省超過紅線的指標。對一些超過紅線的地方,陳明忠表示,對一些取用水專案進行區域的限批," \
"嚴格地進行水資源論證和取水許可的批准。"
print("=" * 30 + "關鍵詞提取" + "=" * 30)
print(HanLP.extractKeyword(document, 8))
print("-" * 70)
print("=" * 30 + "自動摘要" + "=" * 30)
print(HanLP.extractSummary(document, 3))
print("-" * 70)
# print("="*30+"地名識別"+"="*30)
# HanLP = JClass('com.hankcs.hanlp.HanLP')
# segment = HanLP.newSegment().enablePlaceRecognize(true)
# testCase=["武勝縣新學鄉政府大樓門前鑼鼓喧天",
# "藍翔給寧夏固原市彭陽縣紅河鎮黑牛溝村捐贈了挖掘機"]
# for sentence in testCase :
# print(HanLP.segment(sentence))
# print("-"*70)
# print("="*30+"依存句法分析"+"="*30)
# print(HanLP.parseDependency("徐先生還具體幫助他確定了把畫雄鷹、松鼠和麻雀作為主攻目標。"))
# print("-"*70)
text = r"演算法工程師\n 演算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠對一定規範的輸入,在有限時間內獲得所要求的輸出。如果一個演算法有缺陷,或不適合於某個問題,執行這個演算法將不會解決這個問題。不同的演算法可能用不同的時間、空間或效率來完成同樣的任務。一個演算法的優劣可以用空間複雜度與時間複雜度來衡量。演算法工程師就是利用演算法處理事物的人。\n \n 1職位簡介\n 演算法工程師是一個非常高階的職位;\n 專業要求:計算機、電子、通訊、數學等相關專業;\n 學歷要求:本科及其以上的學歷,大多數是碩士學歷及其以上;\n 語言要求:英語要求是熟練,基本上能閱讀國外專業書刊;\n 必須掌握計算機相關知識,熟練使用模擬工具MATLAB等,必須會一門程式語言。\n\n2研究方向\n 視訊演算法工程師、影象處理演算法工程師、音訊演算法工程師 通訊基帶演算法工程師\n \n 3目前國內外狀況\n 目前國內從事演算法研究的工程師不少,但是高階演算法工程師卻很少,是一個非常緊缺的專業工程師。演算法工程師根據研究領域來分主要有音訊/視訊演算法處理、影象技術方面的二維資訊演算法處理和通訊物理層、雷達訊號處理、生物醫學訊號處理等領域的一維資訊演算法處理。\n 在計算機音視訊和圖形影象技術等二維資訊演算法處理方面目前比較先進的視訊處理演算法:機器視覺成為此類演算法研究的核心;另外還有2D轉3D演算法(2D-to-3D conversion),去隔行演算法(de-interlacing),運動估計運動補償演算法(Motion estimation/Motion Compensation),去噪演算法(Noise Reduction),縮放演算法(scaling),銳化處理演算法(Sharpness),超解析度演算法(Super Resolution),手勢識別(gesture recognition),人臉識別(face recognition)。\n 在通訊物理層等一維資訊領域目前常用的演算法:無線領域的RRM、RTT,傳送領域的調製解調、通道均衡、訊號檢測、網路優化、訊號分解等。\n 另外資料探勘、網際網路搜尋演算法也成為當今的熱門方向。\n"
print("=" * 30 + "短語提取" + "=" * 30)
print(HanLP.extractPhrase(text, 10))
print("-" * 70)
shutdownJVM()
但是我最近需要自定義一個詞典,該怎麼辦呢,繼續往下看:
第一:以**.txt命名自己的詞典
第二:將其加入到hanlp.propertiess中,我加入的是poems.txt,如下
第三:刪除CustomDictionary.txt.bin檔案,然後執行程式碼,記住要等程式執行完哦,我加入的詞典有47萬行,運行了14分鐘,不過後面執行就快了
# -*- coding:utf-8 -*-
from jpype import *
import time
i=time.time()
startJVM(getDefaultJVMPath(), "-Djava.class.path=D:\python_projects\zhengzebiaodashi\hanlp\hanlp-1.3.4.jar;D:\python_projects\zhengzebiaodashi\hanlp",
"-Xms1g",
"-Xmx1g") # 啟動JVM,Linux需替換分號;為冒號:
HanLP = JClass('com.hankcs.hanlp.HanLP')
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
list=HanLP.parseDependency("李白的詩有哪些?")
print list
j=time.time()
print j-i
shutdownJVM()
李白 李白 b b _ 3 定中關係 _ _
的 的 u ude1 _ 1 右附加關係 _ _
詩 詩 n n _ 4 主謂關係 _ _
有 有 v vyou _ 0 核心關係 _ _
哪些 哪些 r ry _ 4 動賓關係 _ _
? ? wp w _ 4 標點符號 _ _
2.16999983788
大家有沒有發現,李白的詞性是b,這是什麼鬼,其實這是我自己詞典中新增的:李白 b 200(詞 詞性 權值)
如果大家覺得有些詞典不需要,可以將其路徑刪除,如下: