本文目錄一覽:
- 1、java用什麼分詞器去 標註英文單詞的詞性
- 2、hanlp可以使用python調用嗎
- 3、Elasticsearch安裝以及配置hanlp中文分詞插件
- 4、有一個java工程,採用hanlp分詞,怎麼導出成可運行的jar?
- 5、目前常用的自然語言處理開源項目/開發包有哪些?
- 6、自然語言處理(NLP)的基礎難點:分詞演算法
java用什麼分詞器去 標註英文單詞的詞性
可以試試stanford Tagger, 百度搜索下stanford Tagger。
中文詞性標註可以用hanlp.
hanlp可以使用python調用嗎
安裝JDK
JPype並沒有像IKVM那樣實現自己的JVM,而是以pipe方式調用原生JVM。所以我們需要一個JVM,比如:
Oracle JDK
OpenJDK
安裝JDK非常簡單,分清楚32位和64位即可,必須與OS和Python的位數一致,具體安裝過程不再贅述。
唯一需要注意的是,必須設置環境變數JAVA_HOME到JDK的根目錄,JDK的安裝程序不一定會幫你做這一步。
安裝編譯工具鏈
Python的package一般是以源碼形式發布的,其中一些C代碼必須在用戶機器上編譯,所以需要安裝編譯工具鏈。當然你也可以跳過這步,直接下載binary。
Windows
安裝免費的Visual C++ Express 2010。
Debian/Ubuntu
sudo apt-get install g++
Red Hat/Fedora
su -c ‘yum install gcc-c++’
安裝JPype
本文讀者應該都是Python程序員,所以略過了安裝Python這一步。不過必須注意的是,JPype版本與Python的對應兼容關係:
Python2.x:JPype
Python3.x:JPype1-py3
使用setup.py安裝
下載源碼後解壓,在目錄下運行:
*nix
sudo python3 setup.py install
Windows
python setup.py install
直接下載binary
當然你也可以選擇下載binary,比如JPype1-py3主頁上的binary列表。
在Pycharm中安裝
如果你正在使用Pycharm這款IDE的話,那麼事情就簡單多了。
首先在Project Interpreter裡面點擊加號:
搜索JPype,選擇你需要的版本安裝:
稍等片刻就安裝成功了:
測試安裝結果
終於又到了寫代碼的開心時間了,可以通過如下代碼測試是否安裝成功:
from jpype import *startJVM(getDefaultJVMPath())java.lang.System.out.println(“hello world”)shutdownJVM()
輸出如下結果表示安裝成功:
hello worldJVM activity report : classes loaded : 31JVM has been shutdown
調用HanLP
關於HanLP
HanLP是
一個致力於向生產環境普及NLP技術的開源Java工具包,支持中文分詞(N-最短路分詞、CRF分詞、索引分詞、用戶自定義詞典、詞性標註),命名實體
識別(中國人名、音譯人名、日本人名、地名、實體機構名識別),關鍵詞提取,自動摘要,短語提取,拼音轉換,簡繁轉換,文本推薦,依存句法分析
(MaxEnt依存句法分析、神經網路依存句法分析)。
下載HanLP
你可以直接下載Portable版的jar,零配置。
也可以使用自定義的HanLP——HanLP由3部分組成:類庫hanlp.jar包、模型data包、配置文件hanlp.properties,請前往項目主頁下載最新版:。對於非portable版,下載後,你需要編輯配置文件第一行的root指向data的父目錄,詳見文檔。
這裡,假設新建了一個目錄(假定為C:\hanlp),把hanlp.jar和hanlp.properties(portable版的話,僅需一個hanlp-portable.jar)放進去:
Python調用
下面是一份Python3的調用示例:
# -*- coding:utf-8 -*-
# Filename: main.py
# Author:hankcs
# Date: 2015/11/26 14:16
from jpype import *
startJVM(getDefaultJVMPath(), “-Djava.class.path=C:\hanlp\hanlp-1.2.8.jar;C:\hanlp”, “-Xms1g”, “-Xmx1g”)
HanLP = JClass(‘com.hankcs.hanlp.HanLP’)
# 中文分詞
print(HanLP.segment(‘你好,歡迎在Python中調用HanLP的API’))
testCases = [
“商品和服務”,
“結婚的和尚未結婚的確實在干擾分詞啊”,
“買水果然後來世博園最後去世博會”,
“中國的首都是北京”,
“歡迎新老師生前來就餐”,
“工信處女幹事每月經過下屬科室都要親口交代24口交換機等技術性器件的安裝工作”,
“隨著頁遊興起到現在的頁游繁盛,依賴於存檔進行邏輯判斷的設計減少了,但這塊也不能完全忽略掉。”]
for sentence in testCases: print(HanLP.segment(sentence))
# 命名實體識別與詞性標註
NLPTokenizer = JClass(‘com.hankcs.hanlp.tokenizer.NLPTokenizer’)
print(NLPTokenizer.segment(‘中國科學院計算技術研究所的宗成慶教授正在教授自然語言處理課程’))
# 關鍵詞提取
document = “水利部水資源司司長陳明忠9月29日在國務院新聞辦舉行的新聞發布會上透露,” \
“根據剛剛完成了水資源管理制度的考核,有部分省接近了紅線的指標,” \
“有部分省超過紅線的指標。對一些超過紅線的地方,陳明忠表示,對一些取用水項目進行區域的限批,” \
“嚴格地進行水資源論證和取水許可的批准。”
print(HanLP.extractKeyword(document, 2))
# 自動摘要
print(HanLP.extractSummary(document, 3))
# 依存句法分析
print(HanLP.parseDependency(“徐先生還具體幫助他確定了把畫雄鷹、松鼠和麻雀作為主攻目標。”))
shutdownJVM()
Elasticsearch安裝以及配置hanlp中文分詞插件
elasticsearch默認開啟兩個埠:9200,用於ES節點和外部通訊;9300,用於ES節點之間通訊
報錯: org.elasticsearch.bootstrap.StartupException: java.lang.RuntimeException: can not run elasticsearch as root ,不能以root用戶的身份運行elasticsearch
解決方法:新建用戶組和用戶,並賦予其elasticsearch文件夾的許可權
再次運行
WARN: java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are needed ,使用新的linux版本即可,不影響使用
啟動失敗,出現上面四個錯誤,一一解決
ERROR[1]:無法創建本地文件問題,用戶最大可創建文件數太小
解決方法:切換到root用戶,編輯limits.conf配置文件
ERROR[2]:無法創建本地線程問題,用戶最大可創建線程數太小
解決方法:切換到root用戶,進入limits.d目錄下,修改90-nproc.conf 配置文件
ERROR[3]:最大虛擬內存太小
解決方法:切換到root用戶下,修改配置文件sysctl.conf
ERROR[4]:這是在因為Centos6不支持SecComp,而ES5.2.0默認bootstrap.system_call_filter為true進行檢測,所以導致檢測失敗,失敗後直接導致ES不能啟動
解決方法:在elasticsearch.yml中配置bootstrap.system_call_filter為false
解決完成後,重新啟動,啟動成功
如果要在後台運行,使用 ./bin/elasticsearch -d 啟動
訪問 ,返回數據
現在啟動elasticsearch,提示jar包衝突
現在啟動elasticsearch,沒有異常,我們測試一下hanlp分詞插件有沒有生效
訪問: ;analyzer=hanlp
elasticsearch報錯並且退出運行
看上去是許可權的問題,這就用到hanlp目錄下的 plugin-security.policy 文件,修改 /elasticsearch/config/jvm.options 文件,在末尾添加
繼續測試上面的鏈接,提示找不到hanlp.properties,hanlp無法載入詞典,elasticsearch退出運行,解決方法:修改 /elasticsearch/bin/elasticsearch.in.sh 文件,將ES_CLASSPATH修改為:
繼續測試上面的鏈接,訪問成功,返回結果
可以看到分詞效果比較好,而且停用詞也被過濾了,大功告成!
有一個java工程,採用hanlp分詞,怎麼導出成可運行的jar?
1、jar包有入口(即有main()函數)
選中要打包的工程—右鍵選擇Export—-java—–Runnable java file—–next—-在launch configuration輸入jar包入口,即該工程要打包的主函數文件—–Export destination輸入jar包存放的位置以及文件名—-library handling選擇package requreied.JAR—-finish。
2、jar包無入口
選中要打包的工程-右鍵選擇Export—-java—–java file—–next—–Exported all output folders for checked project—–Export destination輸入jar包存放的位置以及文件名—-finish。
目前常用的自然語言處理開源項目/開發包有哪些?
中文主要有:NLTK,HanLP,Ansj,THULAC,結巴分詞,FNLP,哈工大LTP,中科院ICTCLAS分詞,GATE,SnowNLP,東北大學NiuTrans,NLPIR;英文主要有:NLTK,Genism,TextBlob,Stanford NLP,Spacy。英文的開源NLP工具主要參見StackoverFlow-java or python for nlp。HanLP:HanLP是由一系列模型與演算法組成的Java工具包,目標是普及自然語言處理在生產環境中的應用。HanLP具備功能完善、性能高效、架構清晰、語料時新、可自定義的特點。開發語言:Java,網址:hankcs/HanLP,開發機構:大快公司,協議:Apache-2.0功能:非常多,主要有中文分詞,詞性標註,命名實體識別,關鍵詞提取,自動摘要,短語提取,拼音轉換,簡繁轉換,文本推薦,依存句法分析,文本分類:情感分析,word2vec,語料庫工具。
自然語言處理(NLP)的基礎難點:分詞演算法
自然語言處理(NLP,Natural Language Processing)是人工智慧領域中的一個重要方向,主要研究人與計算機之間用自然語言進行有效通信的各種理論和方法。自然語言處理的底層任務由易到難大致可以分為詞法分析、句法分析和語義分析。分詞是詞法分析(還包括詞性標註和命名實體識別)中最基本的任務,也是眾多NLP演算法中必不可少的第一步,其切分準確與否往往與整體結果息息相關。
金融領域分詞的難點
分詞既簡單又複雜。簡單是因為分詞的演算法研究已經很成熟了,大部分的演算法(如HMM分詞、CRF分詞)準確率都可以達到95%以上;複雜則是因為剩下的5%很難有突破,主要可以歸結於三點:
▲粒度,即切分時的最小單位,不同應用對粒度的要求不一樣,比如「融資融券」可以是一個詞也可以是兩個詞
▲歧義,比如「恒生」一詞,既可指恒生公司,又可指恒生指數
▲未登錄詞,即未出現在演算法使用的詞典中的詞,比如不常見的專業金融術語,以及各種上市公司的名稱
在金融領域中,分詞也具有上述三個難點,並且在未登錄詞方面的難點更為突出,這是因為金融類辭彙本來就多,再加上一些專有名詞不僅有全稱還有簡稱,這就進一步增大了難度。
在實際應用中,以上難點時常會造成分詞效果欠佳,進而影響之後的任務。尤其是在一些金融業務中,有許多需要與用戶交互的場景,某些用戶會用口語化的辭彙描述業務,如果分詞錯誤會影響用戶意圖的解析,這對分詞的準確性提出了更高的要求。因此在進行NLP上層應用開發時,需要對分詞演算法有一定的了解,從而在效果優化時有能力對分詞器進行調整。接下來,我們介紹幾種常用的分詞演算法及其應用在金融中的優劣。
幾種常見的分詞演算法
分詞演算法根據其核心思想主要分為兩種:
第一種是基於字典的分詞,先把句子按照字典切分成詞,再尋找詞的最佳組合方式,包括最大匹配分詞演算法、最短路徑分詞演算法、基於N-Gram model的分詞演算法等;
第二種是基於字的分詞,即由字構詞,先把句子分成一個個字,再將字組合成詞,尋找最優的切分策略,同時也可以轉化成序列標註問題,包括生成式模型分詞演算法、判別式模型分詞演算法、神經網路分詞演算法等。
最大匹配分詞尋找最優組合的方式是將匹配到的最長片語合在一起,主要的思路是先將詞典構造成一棵Trie樹(也稱為字典樹),Trie樹由詞的公共前綴構成節點,降低了存儲空間的同時可以提升查找效率。
最大匹配分詞將句子與Trie樹進行匹配,在匹配到根結點時由下一個字重新開始進行查找。比如正向(從左至右)匹配「他說的確實在理」,得出的結果為「他/說/的確/實在/理」。如果進行反向最大匹配,則為「他/說/的/確實/在理」。
這種方式雖然可以在O(n)時間對句子進行分詞,但是只單向匹配太過絕對,尤其是金融這種辭彙較豐富的場景,會出現例如「交易費/用」、「報價單/位」等情況,所以除非某些詞的優先順序很高,否則要盡量避免使用此演算法。
最短路徑分詞演算法首先將一句話中的所有詞匹配出來,構成詞圖(有向無環圖DAG),之後尋找從起始點到終點的最短路徑作為最佳組合方式,例:
我們認為圖中每個詞的權重都是相等的,因此每條邊的權重都為1。
在求解DAG圖的最短路徑問題時,總是要利用到一種性質:即兩點之間的最短路徑也包含了路徑上其他頂點間的最短路徑。比如S-A-B-E為S到E到最短路徑,那S-A-B一定是S到B到最短路徑,否則會存在一點C使得d(S-C-B)d(S-A-B),那S到E的最短路徑也會變為S-C-B-E,這就與假設矛盾了。利用上述的最優子結構性質,可以利用貪心演算法或動態規劃兩種求解演算法:
(1)基於Dijkstra演算法求解最短路徑,該演算法適用於所有帶權有向圖,求解源節點到其他所有節點的最短路徑,並可以求得全局最優解;
(2)N-最短路徑分詞演算法,該方法是對Dijkstra演算法的擴展,在每一步保存最短的N條路徑,並記錄這些路徑上當前節點的前驅,在最後求得最優解時回溯得到最短路徑。這種方法的準確率優於Dijkstra演算法,但在時間和空間複雜度上都更大。
相較於最大匹配分詞演算法,最短路徑分詞演算法更加靈活,可以更好地把詞典中的片語合起來,能更好地解決有歧義的場景。比如上述「他說的確實在理」這句話,用最短路徑演算法的計算結果為「他/說/的/確實/在理」,避免了正向最大匹配的錯誤。但是對於詞典中未存在的詞基本沒有識別能力,無法解決金融領域分詞中的「未登錄詞」難點。
N-Gram(又稱N元語法模型)是基於一個假設:第n個詞出現與前n-1個詞相關,而與其他任何詞不相關。在此種假設下,可以簡化詞的條件概率,進而求解整個句子出現的概率。
現實中,常用詞的出現頻率或者概率肯定比罕見詞要大。因此,可以將求解詞圖最短路徑的問題轉化為求解最大概率路徑的問題,即分詞結果為「最有可能的詞的組合「。
計算詞出現的概率,僅有詞典是不夠的,還需要充足的語料,所以分詞任務已經從單純的「演算法」上升到了「建模」,即利用統計學方法結合大數據挖掘,對「語言」(句子出現的概率)進行建模。
我們將基於N-gram模型所統計出的概率分布應用到詞圖中,可以得到詞的概率圖。對該詞圖用最短路徑分詞演算法求解最大概率的路徑,即可得到分詞結果。
相較於前兩種分詞演算法,基於N-Gram model的分詞演算法對詞頻進行了統計建模,在切分有歧義的時候力求得到全局最優值,比如在切分方案「證券/自營/業務」和「證券/自/營業/務」中,統計出「證券/自營/業務」出現的概率更大,因此結果有更高的準確率。但也依然無法解決金融場景中未登錄詞的問題。
生成式模型主要有隱馬爾可夫模型(HMM,Hidden Markov Model)、樸素貝葉斯分類等。HMM是常用的分詞模型,基於Python的jieba分詞器和基於Java的HanLP分詞器都使用了HMM。
HMM模型認為在解決序列標註問題時存在兩種序列,一種是觀測序列,即人們顯性觀察到的句子,另一種是隱狀態序列,即觀測序列的標籤。假設觀測序列為X,隱狀態序列是Y,則因果關係為Y-X。因此要得到標註結果Y,必須對X的概率、Y的概率、P(X|Y)進行計算,即建立P(X,Y)的概率分布模型。
HMM演算法可以在一定程度上解決未登錄詞的問題,但生成式模型的準確率往往沒有接下來要談到的判別式模型高。
判別式模型主要有感知機、支持向量機(SVM,Support Vector Machine)、條件隨機場(CRF,Conditional Random Field)、最大熵模型等,其中感知機模型和CRF模型是常用的分詞模型。
(1)平均感知機分詞演算法
感知機是一種簡單的二分類線性模型,通過構造超平面,將特徵空間(輸入空間)中的樣本分為正負兩類。通過組合,感知機也可以處理多分類問題。但由於每次迭代都會更新模型的所有權重,被誤分類的樣本會造成很大影響,因此採用平均的方法,在處理完一部分樣本後對更新的權重進行平均。
(2)CRF分詞演算法
CRF可以看作一個無向圖模型,假設給定的標註序列為Y,觀測序列為X,CRF對條件概率P(Y|X)進行定義,而不是對聯合概率建模。
平均感知機演算法雖然速度快,但仍不夠準確。適合一些對速度要求高、對準確性要求相對不那麼高的場景。CRF分詞演算法可以說是目前最常用的分詞、詞性標註和實體識別演算法,它對未登陸詞也有很好的識別能力,是目前在速度、準確率以及未登錄詞識別上綜合表現最突出的演算法,也是我們目前所採用的解決方案,但速度會比感知機慢一些。
在NLP中,最常用的神經網路為循環神經網路(RNN,Recurrent Neural Network),它在處理變長輸入和序列輸入問題中有著巨大的優勢。LSTM(Long Short-Term Memory,長短期記憶網路)為RNN變種的一種,在一定程度上解決了RNN在訓練過程中梯度消失和梯度爆炸的問題。
目前對於序列標註任務,業內公認效果最好的模型是BiLSTM+CRF。相比於上述其它模型,雙向循環神經網路BiLSTM,可以更好地編碼當前字等上下文信息,並在最終增加CRF層,核心是用Viterbi演算法進行解碼,以得到全局最優解,避免B,S,E這種不可能的標記結果的出現,提高準確率。
神經網路分詞雖然能在準確率、未登錄詞識別上有更好的表現,但RNN無法並行計算,在速度上沒有優勢,所以該演算法通常在演算法研究、句子精確解析等對速度要求不高的場景下使用。
分詞作為NLP底層任務之一,既簡單又重要,很多時候上層演算法的錯誤都是由分詞結果導致的。因此,對於底層實現的演算法工程師,不僅需要深入理解分詞演算法,更需要懂得如何高效地實現和調試。
而對於上層應用的演算法工程師,在實際分詞時,需要根據業務場景有選擇地應用上述演算法,比如在搜索引擎對大規模網頁進行內容解析時,對分詞對速度要求大於精度,而在智能問答中由於句子較短,對分詞的精度要求大於速度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/199523.html