1. 程式人生 > >自然語言處理之hanlp,Python呼叫與構建,分詞、關鍵詞提取、命名主體識別

自然語言處理之hanlp,Python呼叫與構建,分詞、關鍵詞提取、命名主體識別

HanLP是一系列模型與演算法組成的NLP工具包,由大快搜索主導並完全開源,目標是普及自然語言處理在生產環境中的應用。HanLP具備功能完善、效能高效、架構清晰、語料時新、可自定義的特點。在Python中一種是直接呼叫hanlp的介面pyhanlp.還有就是匯入其基於Java的原始配置檔案。

關於pyhanlp

HanLP的Python介面,支援自動下載與升級HanLP,相容py2、py3。

安裝

pip install pyhanlp

首次下載基本都會報錯,請參考配置網站進行配置,或者參考此連結也可以

伺服器

升級

通過hanlp update命令來將HanLP升級到最新版。該命令會獲取GitHub最新版本並自動下載安裝。

歡迎通過hanlp –help檢視最新幫助手冊。

hanlp

我主要安裝的是hanlp,pyhanlp只有少數功能,其他複雜一點的功能需要使用python呼叫java程式碼來實現,

安裝呼叫java的JPype1

python呼叫java需要jpype庫,jdk和python 版本位數必須一致,我用的py3.6,也有人用的較低版本,我安裝的是pip install JPype1,有些版本直接安裝JPype。
通過以下程式碼測試

# -*- coding:utf-8 -*-
import jpype
from jpype import *
jvmPath = jpype.getDefaultJVMPath
() print(jvmPath) jpype.startJVM(jvmPath) jpype.java.lang.System.out.println("hello world!") java.lang.System.out.println("hello world") jpype.shutdownJVM()

輸出如下形式表示成功
這裡寫圖片描述

配置HanLP所需檔案

使用自定義的HanLP——HanLP由3部分組成:類庫hanlp.jar包、模型data包、配置檔案hanlp.properties,請前往專案主頁下載最新版:https://github.com/hankcs/HanLP/releases


方式二、下載jar、data、hanlp.properties
HanLP將資料與程式分離,給予使用者自定義的自由。

下載後解壓到任意目錄,接下來通過配置檔案告訴HanLP資料包的位置。

HanLP中的資料分為詞典和模型,其中詞典是詞法分析必需的,模型是句法分析必需的。

data

├─dictionary
└─model
使用者可以自行增刪替換,如果不需要句法分析等功能的話,隨時可以刪除model資料夾。

模型跟詞典沒有絕對的區別,隱馬模型被做成人人都可以編輯的詞典形式,不代表它不是模型。
GitHub程式碼庫中已經包含了data.zip中的詞典,直接編譯執行自動快取即可;模型則需要額外下載。

2、下載jar和配置檔案:hanlp-release.zip

root=D:/JavaProjects/HanLP/
為data的父目錄即可,比如data目錄是/Users/hankcs/Documents/data,那麼root=/Users/hankcs/Documents/ 。
這裡寫圖片描述
最後將hanlp.properties放入classpath即可,對於任何專案,都可以放到src或resources目錄下,編譯時IDE會自動將其複製到classpath中。除了配置檔案外,還可以使用環境變數HANLP_ROOT來設定root。
這裡寫圖片描述
最終上面的兩個檔案在一個路徑,其中的data路徑通過root路徑進行指定。
如果放置不當,HanLP會提示當前環境下的合適路徑,並且嘗試從專案根目錄讀取資料集。

分詞

一個簡單的例子
startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.2.8.jar;E:/anaconda/new_library",
         "-Xms1g",
         "-Xmx1g")
NLPTokenizer = JClass('com.hankcs.hanlp.tokenizer.NLPTokenizer')
print(NLPTokenizer.segment('中國科學院計算技術研究所的教授正在教授自然語言處理課程'))

執行結果
[中國科學院計算技術研究所/nt, 的/ude1, 教授/nnt, 正在/d, 教授/v, 自然語言處理/nz, 課程/n]

一個複雜點的例子

question="請問北京大學怎麼走?"
#執行jvm,並引用jar
startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.2.8.jar;E:/anaconda/new_library",
         "-Xms1g",
         "-Xmx1g")
CustomDictionary = JClass('com.hankcs.hanlp.dictionary.CustomDictionary')
# 載入字典
# loadDict(CustomDictionary)
HanLP = JClass('com.hankcs.hanlp.HanLP')
# 中文分詞
segment=HanLP.newSegment().enableCustomDictionary(True)
list_word=segment.seg(question)

print(list_word)

執行結果:

[請問/v, 北京大學/nt, 怎麼走/nz, ?/w]

上面的loadDict(CustomDictionary)是可以自定義字典的函式,通過自定義字典可以實現較好的分詞效果

def  loadDict(customeDictionary):
    loadMovieDict(customeDictionary,'data/dict/movieDict.txt')
    loadGenreDict(customeDictionary, 'data/dict/genreDict.txt')
    loadScoreDict(customeDictionary, 'data/dict/scoreDict.txt')
#對應的三個函式
def loadMovieDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'nm 0')


def loadGenreDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'ng 0')


def loadScoreDict(customeDictionary,file):
    with open(file,'r',encoding='utf-8')as fread:
        for line in fread:
            customeDictionary.add(line.rstrip(),'x 0')

單一字典示例,每一個txt檔案中都有單一列進行詞彙增加:
這裡寫圖片描述

可能出現的問題:
字符集檔案載入失敗:data/dictionary/other/CharType.dat.yes
解決方法,換成最新版本的jar即可,

更多的分詞
#!usr/bin/env python
#_*_ coding:utf-8 _*_
from jpype import *

startJVM(getDefaultJVMPath(),
         "-Djava.class.path=E:/anaconda/new_library/hanlp-1.6.6.jar;E:/anaconda/new_library",
         "-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()

最終結果,其中註釋部分是存在錯誤的,如果有解決的同學請留言:

E:\anaconda\python.exe E:/pycreate/py_hanlp/hanlp_2.py
==============================HanLP分詞==============================
[你好/vl, ,/w, 歡迎/v, 在/p, Python/nx, 中/f, 呼叫/v, HanLP/nx, 的/ude1, API/nx]
----------------------------------------------------------------------
==============================標準分詞==============================
[你好/vl, ,/w, 歡迎/v, 在/p, Python/nx, 中/f, 呼叫/v, HanLP/nx, 的/ude1, API/nx]
----------------------------------------------------------------------
==============================NLP分詞==============================
[中國科學院/nt, 計算/v, 技術/n, 研究所/n, 的/u, 宗成慶/nr, 教授/n, 正在/d, 教授/n, 自然語言處理/v, 課程/n]
----------------------------------------------------------------------
==============================索引分詞==============================
主副食品/n [0:4]
主副食/j [0:3]
副食品/n [1:4]
副食/n [1:3]
食品/n [2:4]
----------------------------------------------------------------------
============================== N-最短路徑分詞==============================
----------------------------------------------------------------------
============================== CRF分詞==============================
----------------------------------------------------------------------
============================== 極速詞典分詞==============================
[江西/ns, 鄱陽湖/ns, 乾枯/v, ,/w, 中國/ns, 最/d, 大/a, 淡水湖/n, 變成/v, 大/a, 草原/n]
----------------------------------------------------------------------
============================== 自定義分詞==============================
[攻城獅/nz, 逆襲/nz, 單身狗/nz, ,/w, 迎娶/v, 白富美/nr, ,/w, 走上/v, 人生/n, 巔峰/n]
----------------------------------------------------------------------
====================命名實體識別與詞性標註==============================
[中國科學院/nt, 計算/v, 技術/n, 研究所/n, 的/u, 宗成慶/nr, 教授/n, 正在/d, 教授/n, 自然語言處理/v, 課程/n]
----------------------------------------------------------------------
==============================關鍵詞提取==============================
[水資源, 陳明忠, 進行, 紅線, 部分, 專案, 用水, 國務院新聞辦]
----------------------------------------------------------------------
==============================自動摘要==============================
[嚴格地進行水資源論證和取水許可的批准, 水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞釋出會上透露, 有部分省超過紅線的指標]
----------------------------------------------------------------------
==============================短語提取==============================
[演算法工程師, 演算法處理, 一維資訊, 演算法研究, 訊號處理, 資訊演算法, 通訊物理層, 處理演算法, 視訊演算法, 網際網路搜尋演算法]
----------------------------------------------------------------------
JVM has been shutdown

參考文獻:

相關推薦

自然語言處理hanlpPython呼叫構建關鍵詞提取命名主體識別

HanLP是一系列模型與演算法組成的NLP工具包,由大快搜索主導並完全開源,目標是普及自然語言處理在生產環境中的應用。HanLP具備功能完善、效能高效、架構清晰、語料時新、可自定義的特點。在Python中一種是直接呼叫hanlp的介面pyhanlp.還有就是

Python呼叫自然語言處理HanLP

Python呼叫自然語言處理包HanLP3.png一句話安裝pyhanlp,全自動下載安裝配置,還支援升級。 pip install pyhanlp 呼叫方法參考專案主頁:https://github.com/hankcs/pyhanlp Windows使用者如果遇到: building

Python呼叫自然語言處理工具HanLP手記

HanLP方法封裝類: 1. # -*- coding:utf-8 -*- 2. # Filename: main.py 3. 4.from jpype import * 5.  5.startJVM(getDefaultJVMPath(), "-Djava.class.path=C:\h

自然語言處理:搭建基於HanLP的開發環境(轉)

環境搭建比FNLP的簡單,具體參考:https://github.com/hankcs/HanLP 各個版本的下載:https://github.com/hankcs/HanLP/releases 完畢後有一個報錯: 字元型別對應表載入失敗: D:/eclipse_workspace

自然語言處理Bag-of-wordsTF-IDF模型

轉自:https://blog.csdn.net/m0_37744293/article/details/78881231 Bag-of-words,TF-IDF模型 Bag-of-words model (BoW model)忽略文字的語法和語序,用一組無序的單詞(words)來表達一段文

自然語言處理中文器-jieba器詳解及python實戰

中文分詞是中文文字處理的一個基礎步驟,也是中文人機自然語言互動的基礎模組,在進行中文自然語言處理時,通常需要先進行分詞。本文詳細介紹現在非常流行的且開源的分詞器結巴jieba分詞器,並使用python實

自然語言處理jieba, gensim模塊

src tex tokenize 出現 其中 lambda pip 理論 aid 一,自然語言處理 自然語言處理(NLP) :自然語言處理是計算機科學領域與人工智能領域中的一個重要方向。它研究能實現人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理是一門融

自然語言處理(nlp)比計算機視覺(cv)發展緩慢而且更難!

https://mp.weixin.qq.com/s/kWw0xce4kdCx62AflY6AzQ   1.  搶跑的nlp   nlp發展的歷史非常早,因為人從計算機發明開始,就有對語言處理的需求。各種字串演算法都貫穿於計算機的發展歷史中。偉大的喬姆斯基提出了

自然語言處理AI深度學習頂級實戰課

自然語言處理之AI深度學習頂級實戰課網盤地址:https://pan.baidu.com/s/1cPqqMpX-xDEMoA3iDscrnw 提取碼: swqh備用地址(騰訊微雲):https://share.weiyun.com/5UGchsv 密碼:pp5ix3 課程大綱:1、NLP和深度學習發展概況和

python自然語言處理——1.4 回到python:決策和控制

ott thead top linear 控制 san max-width eight 技術分享 微信公眾號:數據運營人本系列為博主的讀書學習筆記,如需轉載請註明出處。 第一章 語言處理與python 1.4 回到python:決策和控制條件對每個元素進行操作嵌套

python自然語言處理——1.2 近觀python:將文本當作詞鏈表

bsp family round orm 學習 splay letter mic lock 微信公眾號:數據運營人本系列為博主的讀書學習筆記,如需轉載請註明出處。 第一章 語言處理與python 1.2 近觀python:將文本當作詞鏈表鏈表索引列表變量字符串 1

自然語言處理情感分析觀點挖掘

觀點、情感以及與之相關的許多概念,如評價、評估、態度、感情、情緒和心情,與我們主觀的感覺和感受密切相關。這些是人類心理活動的核心要素,也是影響人們日常行為的關鍵因素。情感分析也稱為觀點挖掘,是一個旨在利用可計算的方法從自然語言文字中提取觀點和情感資訊的研究課題。 一.情感分

自然語言處理命名主體識別詞性語法分析-stanfordcorenlp-NER(二)

轉載請註明出處:https://blog.csdn.net/HHTNAN 在前面我們介紹了Stanford CoreNLP, 自然語言處理之命名實體識別-tanfordcorenlp-NER(一) 功能列表 工具以及對各種語言的支援如下表(英文和中文支援的最好),分別對應:

自然語言處理命名實體識別-tanfordcorenlp-NER(一)

轉載請註明出處:https://blog.csdn.net/HHTNAN 簡介 CoreNLP 專案是Stanford開發的一套開源的NLP系統。包括tokenize, pos , parse 等功能,與SpaCy類似。SpaCy號稱是目前最快的NLP系統, 並且提供現成的pyt

自然語言處理維特比(Viterbi)演算法

維特比演算法 (Viterbi algorithm) 是機器學習中應用非常廣泛的動態規劃演算法,在求解隱馬爾科夫、條件隨機場的預測以及seq2seq模型概率計算等問題中均用到了該演算法。實際上,維特比演算法不僅是很多自然語言處理的解碼演算法,也是現代數字通訊中使用最頻繁的演

自然語言處理word2vec原理向量生成

前言 word2vec是如何得到詞向量的?這個問題比較大。從頭開始講的話,首先有了文字語料庫,你需要對語料庫進行預處理,這個處理流程與你的語料庫種類以及個人目的有關,比如,如果是英文語料庫你可能需要大小寫轉換檢查拼寫錯誤等操作,如果是中文日語語料庫你需

自然語言處理中文器詳解

中文分詞是中文文字處理的一個基礎步驟,也是中文人機自然語言互動的基礎模組,不同於英文的是,中文句子中沒有詞的界限,因此在進行中文自然語言處理時,通常需要先進行分詞,分詞效果將直接影響詞性,句法樹等模組

自然語言處理:c++中文(附原始碼)

githup地址:https://github.com/jbymy 一、簡介 中文分詞是地然語言處理中的最基礎的環節,到目前為止已經有不少優秀的分詞工具的出現,如“中科院分詞”,“結

自然語言處理資料平滑方法

在自然語言處理中,經常要計算單詞序列(句子)出現的概率估計。但是,演算法訓練的時候,預料庫中不可能包含所有可能出現的序列,因此為了防止對訓練樣本中為出現的新序列概率估計值為零,人們發明了不少可以改善估計新序列出現的概率演算法,即資料的平滑。最常見的資料平滑演算法包括如下幾種:

自然語言處理TF-IDF演算法

假定現在有一篇長文《中國的蜜蜂養殖》,我們準備用計算機提取它的關鍵詞。 一個容易想到的思路,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行"詞頻"(Term Frequency,縮寫為TF)統計。 結果你肯定猜到了,出現次數最多的詞是----"的"、"是"、"在"--