发现一款很轻量好用的分词器->结巴分词器 分享给大家
不仅可以对常规语句分词,还可以自定义分词内容,很强大!!
源码地址👉:https://github.com/huaban/jieba-analysis
简单使用
如果是常规的语句,使用这种方式没有问题,如果是复杂语句或带有专业名词的语句请看 下方“复杂语句分词”
1.引入依赖
<dependency>
<groupId>com.huaban</groupId>
<artifactId>jieba-analysis</artifactId>
<version>1.0.2</version>
</dependency>
2.使用方法
@Test
public void demo() {
String content = "中华人民共和国万岁,世界人民大团结万岁";
JiebaSegmenter segmenter = new JiebaSegmenter();
List<String> result = segmenter.sentenceProcess(content);
System.out.println("分词:" + result );
//分词结果->分词:中华人民共和国 万岁 世界 人民 大团结 万岁
}
复杂语句分词
自定义分词,适合对带有专业名词的语句分词
问题复现
使用上方代码如果我对“使用前对yb清洗后,将妇科凝胶推进器伸入yd,将妇科凝胶推入yd深处。每日1次,每次1支。”分词 ;
结果为:分词:[使用, 前, 对, yb, 清洗, 后, ,, 将, 妇科, 凝胶, 推进器, 伸入, yd, ,, 将, 妇科, 凝胶, 推入, yd, 深处, 。, 每日, 1, 次, ,, 每次, 1, 支, 。] ;
妇科凝胶是一个专业名词,很显然不符合我分词的需求 另外我还想把每日1次和每次1支合并在一起
自定义分词
@Test
public void demo() {
String content = "使用前对yb清洗后,将妇科凝胶推进器伸入yd,将妇科凝胶推入yd深处。每日1次,每次1支。";
JiebaSegmenter segmenter = new JiebaSegmenter();
List<String> result = segmenter.sentenceProcess(content);
System.out.println("分词:" + result);
//↓↓↓↓自定义分词器↓↓↓↓↓
Path path = Paths.get("D:\\资料\\fkck.txt");
WordDictionary.getInstance().loadUserDict(path);
List<String> result2 = segmenter.sentenceProcess(content);
System.out.println("自定义分词:" + result2);
//自定义分词:[使用, 前, 对, yb, 清洗, 后, ,, 将, 妇科凝胶, 推进器, 伸入, yd, ,, 将, 妇科凝胶, 推入, yd, 深处, 。, 每日1次, ,, 每次1支, 。]
//可以看到妇科凝胶和每日1次,每次1支都正确的进行了分词
}
fkck.txt内容
妇科凝胶 1 n
每日1次 1 num
每次1支 1 num
格式为:一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。
去掉标点符号
用正则表达式,把分词后的结果中所有的标点符号全部去除
result.toString().replaceAll("[\\pP‘’“”]", "")
觉得好用点个赞吧😄😄😄