有三點要注意(要不然擴展詞典始終不生效):
- 后綴名.dic的詞典文件,必須如使用文檔里所說的 無BOM的UTF-8編碼保存的文件。如果不確定什么是 無BOM的UTF-8編碼,最簡單的方式就是 用Notepad++編輯器打開,Encoding->選擇 Encoding in UTF-8 without BOM,然后保存。
- 項目preferences 里 編碼選擇 utf8。
- 詞典和IKAnalyzer.cfg.xml配置文件的路徑問題。IKAnalyzer.cfg.xml必須在src根目錄下。詞典可以任意放,但是在IKAnalyzer.cfg.xml里要配置對。如下:我的兩個詞典文件my.dic 和 mine.dic 放在src下的com.org.config包下,注意com前面一定不要加/,否則是絕對路徑找不到。
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴展配置</comment>
<!--用戶可以在這里配置自己的擴展字典 -->
<entry key="ext_dict">com/org/config/my.dic;com/org/config/mine.dic;</entry>
<!--用戶可以在這里配置自己的擴展停止詞字典-->
<entry key="ext_stopwords">/com/org/config/stopword.dic</entry>
</properties>
package com.org; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import org.wltea.analyzer.core.IKSegmenter; import org.wltea.analyzer.core.Lexeme; public class IKAnalyzerTest { public static void main(String[] args) { String str = "最希望從企業得到的是獨家的內容或銷售信息,獲得打折或促銷信息等;最不希望企業進行消息或廣告轟炸及訪問用戶的個人信息等。這值得使用社會化媒體的企業研究"; IKAnalysis(str); } public static String IKAnalysis(String str) { StringBuffer sb = new StringBuffer(); try { // InputStream in = new FileInputStream(str);// byte[] bt = str.getBytes();// str InputStream ip = new ByteArrayInputStream(bt); Reader read = new InputStreamReader(ip); IKSegmenter iks = new IKSegmenter(read, true); Lexeme t; while ((t = iks.next()) != null) { sb.append(t.getLexemeText() + " , "); } sb.delete(sb.length() - 1, sb.length()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(sb.toString()); return sb.toString(); } }
附加:手動添加相關詞庫
public static void main(String[] args) throws IOException {
String s = "中文分詞工具包";
Configuration cfg = DefualtConfig.getInstance(); //加載詞庫
cfg.setUseSmart(true); //設置智能分詞
Dictionary.initial(cfg);
Dictionary dictionary = Dictionary.getSingleton();
// List<String> words = new ArrayList<String>();
// words.add("基礎班");
// words.add("高級會計實務");
// dictionary.addWords(words); //自動添加自定義詞
System.out.println(cfg.getMainDictionary()); // 系統默認詞庫
System.out.println(cfg.getQuantifierDicionary());
Hit hit = dictionary.matchInMainDict("基礎班".toCharArray());
System.out.println(hit.isMatch());
System.out.println(queryWords(s));
}
/**
* IK 分詞
*
* @param query
* @return
* @throws IOException
*/
public static List<String> queryWords(String query) throws IOException {
List<String> list = new ArrayList<String>();
StringReader input = new StringReader(query.trim());
IKSegmenter ikSeg = new IKSegmenter(input, true);// true 用智能分詞 ,false細粒度
for (Lexeme lexeme = ikSeg.next(); lexeme != null; lexeme = ikSeg.next()) {
list.add(lexeme.getLexemeText());
}
return list;
}