需求:客户给销售员自己的个人信息,销售帮助客户下单,此过程需要销售人员手动复制粘贴收获地址,电话,姓名等等,一个智能的分词系统可以让销售人员一键识别以上各种信息
经过调研,找到了一下开源项目
1、word 分词器
2、ansj 分词器
3、mmseg4j 分词器
4、ik-analyzer 分词器
5、jcseg 分词器
6、fudannlp 分词器
7、smartcn 分词器
8、jieba 分词器
9、stanford 分词器
10、hanlp 分词器
最后选择了hanlp,步骤官网都有,下面演示智能匹配地址
List<Term> list = HanLP.newSegment().seg("汤姆江西省南昌市红谷滩新区111号电话12023232323");
System.out.println(list);
输出
[汤姆/nrf, 江西省/ns, 南昌市/ns, 红谷滩/nz, 新区/n, 111/m, 号/q, 电话/n, 12023232323/m]
可以看出已经初步识别,但是我们需要的是完整的地址,通过输出容易猜出字符串后面的ns,nz之类的是类型,此时首先想到的是判断类型,符合地址的类型就拼接字符串,但是无所不能的开源社区肯定有人早就写好了,查看官网,发现这样的字段 NLP分词 NLPTokenizer 会执行全部命名实体识别和词性标注。
貌似是我想要的
terms = NLPTokenizer.segment("汤姆江西省南昌市红谷滩新区111号电话12023232323");">
System.out.println(terms);
结果
[汤姆/nr, 江西省南昌市红谷滩新区/nt, 111/m, 号/q, 电话/n, 12023232323/m]
大公告成,不过前提必须下载那个600多M的data包并导入,才可以识别地址,否则只是做了初步的识别
附上完整代码
String str = "汤姆 江西省南昌市红谷滩新区111号 12023232323";
String address = "";
String phone = "";
String name = "";
List<Term> terms = NLPTokenizer.segment(str);
System.out.println(terms);
for (Term term : terms) {
if (term.nature.startsWith("nr")){
//nr代表人名
name = term.word;
System.out.println("name: " + term.word);
}else if (term.nature.startsWith("m") && term.word.length() == 11){
//m代表数字
phone = term.word;
System.out.println("电话: " + term.word);
}
}
//由于地址包含了数字,解析的时候数字成为单独的个体,与实际不符,所以通过差集求出地址
address = str.replace(phone, "").replace(name, "").trim();
System.out.println("address: " + address);
运行结果
name: 汤姆
电话: 12023232323
address: 江西省南昌市红谷滩新区111号