ansj 自定义词典 作者:马育民 • 2024-03-02 22:10 • 阅读:10138 # 提出问题 `java多态` 是java中重要的概念,应该分成2个词: 1. `java` 2. `多态` 但日常生活中,`多态` 根本不是词,所以使用 ansj 进行分词时,就会分成下面3个词: 1. java 2. `多` 3. `态` 这就导致分词错误 ### 代码验证 ``` public static void main(String[] args) { Result result = DicAnalysis.parse("java多态"); Iterator it = result.iterator(); while(it.hasNext()){ Term t = it.next(); System.out.println(t.getName()); } } ``` ### 分析问题 让 ansj 加载 **特有的词** `多态`,就能正确识别,进行分词 # 解决 ## 定义字典文件 在该文件中,定义 **特有的词** 创建 `userLibrary.dict` 文件,内容如下: ``` 多态 n 1000 ``` **关键 关键 关键:** - 必须是 `tab`键 进行间隔,不能是 `空格`。粘贴到 idea 等开发工具时,可能会自动变成 `空格` ,必须手动改正 - 如果是英文,必须全小写 - 词性需小写(如n) ## 加载词库 #### 方式一: ``` Forest forest = Library.makeForest("D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict"); ``` #### 方式二: ``` MyStaticValue.putLibrary(DicLibrary.DEFAULT, "D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict"); ``` ## 分词 #### 方式一: 分词时必须指定上面的 `forest` ``` Result result = DicAnalysis.parse("java多态",forest); ``` #### 方式二: ``` Result result = DicAnalysis.parse("java多态"); ``` ## 完整代码 #### 方式一: ``` import org.ansj.domain.Result; import org.ansj.domain.Term; import org.ansj.splitWord.analysis.DicAnalysis; import org.nlpcn.commons.lang.tire.domain.Forest; import org.nlpcn.commons.lang.tire.library.Library; public class Test2 { static Forest forest; public static void main(String[] args) { try { forest = Library.makeForest("D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict"); } catch (Exception e) { e.printStackTrace(); } Result result = DicAnalysis.parse("java多态",forest); Iterator it = result.iterator(); while(it.hasNext()){ Term t = it.next(); System.out.println(t.getName()); } } } ``` #### 方式二: ``` import org.ansj.domain.Result; import org.ansj.domain.Term; import org.ansj.library.DicLibrary; import org.ansj.splitWord.analysis.DicAnalysis; import org.ansj.util.MyStaticValue; import java.util.Iterator; public class Test3 { public static void main(String[] args) { MyStaticValue.putLibrary(DicLibrary.DEFAULT, "D:\\mym\\baidu2\\out\\artifacts\\baidu2_war_exploded\\WEB-INF\\userLibrary.dict"); Result result = DicAnalysis.parse("java多态"); Iterator it = result.iterator(); while(it.hasNext()){ Term t = it.next(); System.out.println(t.getName()); } } } ``` 原文出处:http://malaoshi.top/show_1IX7FkdAWAKp.html