您好,登錄后才能下訂單哦!
這篇文章主要介紹了Hanlp怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Hanlp是由一系列模型與算法組成的工具包,目標是普及自然語言處理在生產(chǎn)環(huán)境中的應(yīng)用。Hanlp具備功能完善、性能高效、架構(gòu)清洗、語料時新、可自定義的特點;提供詞法分析(中文分詞、磁性標注、命名實體識別)、句法分析、文本分類和情感分析等功能。
本篇將用戶輸入的語句根據(jù)詞庫進行分詞、關(guān)鍵詞提取、摘要提取、詞庫維護。
工具類名稱:DKNLPBase
1、標準分詞
方法簽名:List<Term> StandardTokenizer.segment(String txt);
返回:分詞列表。
簽名參數(shù)說明:txt:要分詞的語句。
范例:下例驗證一段話第5個分詞是阿法狗。
程序清單1
public void testSegment() throws Exception
{
String text = "商品和服務(wù)";
List<Term> termList = DKNLPBase.segment(text);
assertEquals("商品", termList.get(0).word);
assertEquals("和", termList.get(1).word);
assertEquals("服務(wù)", termList.get(2).word);
text = "柯杰解說“李世石VS阿法狗第二局” 結(jié)局竟是這樣";
termList = DKNLPBase.segment(text);
assertEquals("阿法狗", termList.get(5).word); // 能夠識別"阿法狗"
}
2、關(guān)鍵詞提取
方法簽名:List<String> extractKeyword(String txt,int keySum);
返回:關(guān)鍵詞列表.
簽名參數(shù)說明:txt:要提取關(guān)鍵詞的語句,keySum要提取關(guān)鍵詞的數(shù)量
范例:給出一段話提取一個關(guān)鍵詞是“程序員”。
程序清單2
public void testExtractKeyword() throws Exception
{
String content = "程序員(英文Programmer)是從事程序開發(fā)、維護的專業(yè)人員。" +
"一般將程序員分為程序設(shè)計人員和程序編碼人員," +
"但兩者的界限并不非常清楚,特別是在中國。" +
"軟件從業(yè)人員分為初級程序員、高級程序員、系統(tǒng)" +
"分析員和項目經(jīng)理四大類。";
List<String> keyword = DKNLPBase.extractKeyword(content, 1);
assertEquals(1, keyword.size());
assertEquals("程序員", keyword.get(0));
}
3、短語提取
方法簽名:List<String> extractPhrase(String txt, int phSum);
返回:短語
簽名參數(shù)說明:txt:要提取短語的語句,phSum短語數(shù)量
范例:給出一段文字,能代表文章的五個短語,第一個短語是算法工程師。
程序清單3
public void testExtractPhrase() throws Exception
{
String text = "算法工程師\n" +
"算法(Algorithm)是一系列解決問題的清晰指令,也就是說,能夠?qū)σ欢ㄒ?guī)范的輸入,在有限時間內(nèi)獲得所要求的輸出。" +
"如果一個算法有缺陷,或不適合于某個問題,執(zhí)行這個算法將不會解決這個問題。不同的算法可能用不同的時間、" +
"空間或效率來完成同樣的任務(wù)。一個算法的優(yōu)劣可以用空間復(fù)雜度與時間復(fù)雜度來衡量。算法工程師就是利用算法處理事物的人。\n" +
"\n" +
"1職位簡介\n" +
"算法工程師是一個非常高端的職位;\n" +
"專業(yè)要求:計算機、電子、通信、數(shù)學(xué)等相關(guān)專業(yè);\n" +
"學(xué)歷要求:本科及其以上的學(xué)歷,大多數(shù)是碩士學(xué)歷及其以上;\n" +
"語言要求:英語要求是熟練,基本上能閱讀國外專業(yè)書刊;\n" +
"必須掌握計算機相關(guān)知識,熟練使用仿真工具MATLAB等,必須會一門編程語言。\n" +
"\n" +
"2研究方向\n" +
"視頻算法工程師、圖像處理算法工程師、音頻算法工程師 通信基帶算法工程師\n" +
"\n" +
"3目前國內(nèi)外狀況\n" +
"目前國內(nèi)從事算法研究的工程師不少,但是高級算法工程師卻很少,是一個非常緊缺的專業(yè)工程師。" +
"算法工程師根據(jù)研究領(lǐng)域來分主要有音頻/視頻算法處理、圖像技術(shù)方面的二維信息算法處理和通信物理層、" +
"雷達信號處理、生物醫(yī)學(xué)信號處理等領(lǐng)域的一維信息算法處理。\n" +
"在計算機音視頻和圖形圖像技術(shù)等二維信息算法處理方面目前比較先進的視頻處理算法:機器視覺成為此類算法研究的核心;" +
"另外還有2D轉(zhuǎn)3D算法(2D-to-3D conversion),去隔行算法(de-interlacing),運動估計運動補償算法" +
"(Motion estimation/Motion Compensation),去噪算法(Noise Reduction),縮放算法(scaling)," +
"銳化處理算法(Sharpness),超分辨率算法(Super Resolution),手勢識別(gesture recognition),人臉識別(face recognition)。\n" +
"在通信物理層等一維信息領(lǐng)域目前常用的算法:無線領(lǐng)域的RRM、RTT,傳送領(lǐng)域的調(diào)制解調(diào)、信道均衡、信號檢測、網(wǎng)絡(luò)優(yōu)化、信號分解等。\n" +
"另外數(shù)據(jù)挖掘、互聯(lián)網(wǎng)搜索算法也成為當(dāng)今的熱門方向。\n" +
"算法工程師逐漸往人工智能方向發(fā)展。";
List<String> phraseList = DKNLPBase.extractPhrase(text, 5);
assertEquals(5, phraseList.size());
assertEquals("算法工程師", phraseList.get(0));
}
4、自動摘要
方法簽名:List<String> extractSummary(String txt, int sSum);
返回:摘要語句
簽名參數(shù)說明:txt:要提取摘要的語句,sSum摘要句子數(shù)量
范例:自動提取三句摘要句子。
程序清單4
public void testExtractSummary() throws Exception
{
String document = "算法可大致分為基本算法、數(shù)據(jù)結(jié)構(gòu)的算法、數(shù)論算法、計算幾何的算法、圖的算法、動態(tài)規(guī)劃以及數(shù)值分析、加密算法、排序算法、檢索算法、隨機化算法、并行算法、厄米變形模型、隨機森林算法。\n" +
"算法可以寬泛的分為三類,\n" +
"一,有限的確定性算法,這類算法在有限的一段時間內(nèi)終止。他們可能要花很長時間來執(zhí)行指定的任務(wù),但仍將在一定的時間內(nèi)終止。這類算法得出的結(jié)果常取決于輸入值。\n" +
"二,有限的非確定算法,這類算法在有限的時間內(nèi)終止。然而,對于一個(或一些)給定的數(shù)值,算法的結(jié)果并不是唯一的或確定的。\n" +
"三,無限的算法,是那些由于沒有定義終止定義條件,或定義的條件無法由輸入的數(shù)據(jù)滿足而不終止運行的算法。通常,無限算法的產(chǎn)生是由于未能確定的定義終止條件。";
List<String> sentenceList = DKNLPBase.extractSummary(document, 3);
assertEquals(3, sentenceList.size());
}
5、拼音轉(zhuǎn)換
方法簽名:List<Pinyin> convertToPinyinList(txt);
返回:拼音列表
簽名參數(shù)說明:txt:要轉(zhuǎn)換拼音的語句
范例:給出一段文字中第二個字的拼音。
程序清單5
public void testConvertToPinyinList() throws Exception
{
String text = "鴨綠江的綠跟綠色的綠不是一個讀音";
List<Pinyin> pinyinList = DKNLPBase.convertToPinyinList(text);
assertEquals(text.length(), pinyinList.size());
assertEquals(Pinyin.lu4, pinyinList.get(1));
}
6、添加詞庫
方法簽名:String addCK(String filePath);
返回:空—完成,其它—錯誤信息
簽名參數(shù)說明:filePath:新的詞庫文件,每個詞使用回車換行分隔。
范例:讀取新詞庫文件,將文件內(nèi)容中第7個詞“新美“添加到詞庫。
程序清單6
public void testAddCK() throws Exception
{
DKNLPBase.addCK("src/test/resources/custom_dictionary.txt");
String text = "互聯(lián)網(wǎng)家裝質(zhì)量問題頻繁 新美大殺入勝算幾何";
List<Term> termList = DKNLPBase.segment(text);
assertEquals("新美", termList.get(6).word);
}
7、新詞發(fā)現(xiàn)
方法簽名:
NewWordDiscover discover = new NewWordDiscover(max_word_len, min_freq, min_entropy, min_aggregation, filter);
discover.discovery(text, size);
返回:空—完成,其它—錯誤信息
簽名參數(shù)說明:max_word_len: 控制識別結(jié)果中最長的詞語長度,默認值是 4;該值越大,運算量越大,結(jié)果中出現(xiàn)短語的數(shù)量也會越多。
min_freq: 控制結(jié)果中詞語的最低頻率,低于該頻率的將會被過濾掉,減少一 些運算量。由于結(jié)果是按照頻率排序的,所以該參數(shù)其實意義不大。實際上,在接口中直接設(shè)為了0,意思是所有候選詞都會出來。
min_entropy: 控制結(jié)果中詞語的最低信息熵(信息的不確定度)的值,一般取 0.5 左右。該值越 大,越短的詞語就越容易被提取出來。
min_aggregation: 控制結(jié)果中詞語的最低互信息值(字和字之間的關(guān)聯(lián)性),一般取 50 到 200.該值 越大,越長的詞語就越容易被提取出來,有時候會出現(xiàn)一些短語。
Filter: 設(shè)為 true 的時候?qū)⑹褂脙?nèi)部詞庫過濾掉“舊詞”。
Text:用于新詞發(fā)現(xiàn)的文檔。
Size:新詞個數(shù)。
范例:新詞發(fā)現(xiàn)。
程序清7
public void testFindNewWord() {
NewWordDiscover discover = new NewWordDiscover(4, 0.0f, 0.5f, 100f, true);
//讀取文件夾下所以文檔并合并成一篇文檔用于新詞發(fā)現(xiàn)
StringBuilder sbText = new StringBuilder();
File[] txtFiles = new File("src/test/resources/搜狗文本分類語料庫微型版/健康").listFiles();
int i = 0;
for (File file : txtFiles)
{
System.out.printf("[%d / %d] 讀取 %s 中...\n", ++i, txtFiles.length, file.getName());
sbText.append(IOUtil.readTxt(file.getPath()));
if (i == 100) break;
}
System.out.printf("對長度為%d的語料進行分析中...\n", sbText.length());
List<WordInfo> wordInfoList = discover.discovery(sbText.toString(), 10);
//打印出發(fā)現(xiàn)的新詞
for (WordInfo wordInfo : wordInfoList) {
System.out.println(wordInfo.text);
}
}
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Hanlp怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。