需求背景
标记出一句话中所有关键词
inpu:我想买苹果手机,请问哪里可以买苹果手机
keyword:“苹果”, “苹果手机”, “哪里”
result:我想买[[苹果手机]],请问[[哪里]]可以买[[苹果手机]]
10w条耗时:41ms
难点:需要考虑单词重叠问题(overlap),例如“苹果手机”同时包含两个关键词,只标记一次。
思路
通过ac自动机遍历得到所有关键词;
- 新建一个byte[],长度等于原句子,根据ac算法结果将关键字位置设为1;
- 将原句子转为char[],遍历char[]和byte[],如果byte[]前后位置不一致,则插入替换符;
3.1 如果前一个为1,后一个为0,则插入“]]”;
3.2 如果前一个为0,后一个为1,则插入“[[”; - 判断末尾是否插入替换符;
代码
pom文件引入hanlp,使用其中ac算法
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.7.8</version>
</dependency>
package com.bincoder.StringUtils;
import com.hankcs.hanlp.collection.AhoCorasick.AhoC