大資料工具:IKAnalyzer分詞工具介紹與使用
阿新 • • 發佈:2019-01-12
簡單介紹IKAnalyzer分詞工具與使用
文章目錄
簡介
以下簡介參考前輩和專案文件介紹
-
為什麼要分詞呢,當大資料處理中要提取語句的特徵值,進行向量計算。所有我們要用開源分詞工具把語句中的關鍵詞提取出來。
-
IK Analyzer是什麼呢,就是我們需要的這個工具,是基於java開發的輕量級的中文分詞工具包。它是以開源專案Luence為主體的,結合詞典分詞和文法分析演算法的中文分片語件。IK有很多版本,在2012版本中,IK實現了簡單的分詞歧義排除演算法。
-
我們為什麼選擇IK作為我們的分詞工具呢,這裡我們簡單介紹一下。這裡我們採用了網上的一些介紹。
- 1、IK才用了特有的“正向迭代最細粒度切分演算法”,支援細粒度和智慧分詞兩種切分模式。
- 2、在系統環境:Core2 i7 3.4G雙核,4G記憶體,window 7 64位, Sun JDK 1.6_29 64位 普通pc環境測試,IK2012具有160萬字/秒(3000KB/S)的高速處理能力。
- 3、2012版的只能分詞模式支援簡單的分詞排歧義處理和數量詞合併輸出。
- 4、用了多子處理器分析模式,支援 英文字母 數字 中文詞彙等
- 5、優化詞典儲存,更小的記憶體佔用。
IKAnalyzer的引入使用
由於maven庫裡沒有ik的座標。我們需要手動新增到本地的maven倉庫中。或則lib引用
- 1、首先要clone程式碼
git clone https://github.com/wks/ik-analyzer
克隆到本地。
- 2、編譯並且安裝到本地的repository
mvn install -Dmaven.test.skip=true
(1)編譯後也可以將jar上傳到自己的maven私有庫(如果有maven私有庫,那麼久直接使用2012版本,直接網上下載,然後上傳到maven庫即可)。
(2)可以放在本地maven倉庫的對應座標
(3)專案lib下引用
- 3、在pom.xml中加入如下配置即可
<dependency>
<groupId>org.wltea.ik-analyzer</groupId>
<artifactId>ik-analyzer</artifactId>
<version>3.2.8</version>
</dependency>
IK的兩個重要詞典
- 擴充套件詞典:為的是讓需要切分的字串的詞語 根據擴充套件詞典裡的詞,不要切分開來。
例如:擴充套件詞典中有:中國的臺灣 。那麼原本會切分成:中國 的 臺灣 在 東海 。會切分成:中國的臺灣 在 東海
- 停止詞典:對比停止詞典,直接刪掉停止詞典中出現的詞語
IK的使用
自己案例
maven工程
resource目錄下三個配置檔案
IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴充套件配置</comment>
<entry key="ext_dict">/extend.dic</entry>
<entry key="ext_stopwords">/stopword.dic</entry>
</properties>
extend.dic
擴充套件詞典
這是一個
巨大的牆
stopword.dic
一個
一
個
的
IKAnalyzerTest.java
package com.mym.ikanalyzer;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.wltea.analyzer.lucene.IKAnalyzer;
import java.io.IOException;
import java.io.StringReader;
public class IKAnalyzerTest {
public static String beginAnalyzer(String line){
IKAnalyzer analyzer = new IKAnalyzer();
//使用智慧分詞
//ik2012和ik3.0,3.0沒有這個方法
// analyzer.setUseSmart(true);
try {
return printAnalyzerResult(analyzer, line);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
public static String printAnalyzerResult(Analyzer analyzer, String keyword) throws IOException {
String resultData = "";
String infoData = "";
TokenStream tokenStream = analyzer.tokenStream("content",new StringReader(keyword));
tokenStream.addAttribute(CharTermAttribute.class);
while(tokenStream.incrementToken()){
CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
infoData = infoData+ " "+charTermAttribute.toString();
}
if(!"".equals(infoData)){
resultData = resultData + infoData.trim()+"\r\n";
}else{
resultData = "";
}
return resultData;
}
public static void main(String[] args) {
String line = "這是一個粗糙的柵欄,浪費錢,我想要一堵巨大的牆!”網友Mary說,還附上了“理想”中的邊境牆照片";
String s = IKAnalyzerTest.beginAnalyzer(line);
System.out.println(s);
}
}
執行結果
這是一個 這是 粗糙 柵欄 浪費 費錢 我 想要 一堵 巨大的牆 巨大 網友 mary 說 還 附上 上了 理想 中 邊境 牆 照片
更詳細使用可參考github上該工程有demo和文件