1.目的
需要将一句话中的所有人名抽出来,一句话是没有规律的,人员随机说的话
2.思路
没有规律,没法用正则表达式,所以我们用达到了自然语言HanLP来解决,此方法,识别率高,论效率来讲的话,标准分词会比较快,nlp分词要装分析模型,识别率比前者要好一点,但是速度较慢,且此法会有误判率
3.代码
/**
* 获取关联人姓名
*
* @param nameString 姓名字符串
* @return 关联人姓名
*/
private static List<String> getRelationName(String nameString) {
List<String> standard = new ArrayList<>();
List<String> tokenizer = new ArrayList<>();
try {
standard = standardParticiple(nameString);
tokenizer = nlpTokenizer(nameString);
} catch (Exception e) {
System.out.println(e.getMessage());
}
standard.addAll(tokenizer);
return standard.stream().distinct().collect(Collectors.toList());
}
/**
* 标准分词
*
* @param nameString 要分析的字符串
* @return 人名
*/
private static List<String> standardParticiple(String nameString) {
List<Term> termList = HanLP.segment(nameString);
System.out.println(termList);
List<Term> collect = termList.stream().filter(x -> x.nature.equals(Nature.nr)).collect(Collectors.toList());
return collect.stream().map(term -> term.word).collect(Collectors.toList());
}
/**
* NLP分词
*
* @param nameString 要分析的字符串
* @return 人名
*/
private static List<String> nlpTokenizer(String nameString) {
NLPTokenizer.ANALYZER.enableCustomDictionary(false);
List<Term> termList = NLPTokenizer.segment(nameString);
System.out.println(termList);
List<Term> collect = termList.stream().filter(x -> x.nature.equals(Nature.nr)).collect(Collectors.toList());
return collect.stream().map(term -> term.word).collect(Collectors.toList());
}
4.测试
public static void main(String[] args) {
String nameString = "我们这边有李白,杜甫,辛弃疾,李贺,白居易等几个人,你快来救我们。";
System.out.println(getRelationName(nameString));
}
5.结果
[我们/r, 这边/r, 有/v, 李白/nr, ,/w, 杜甫/nr, ,/w, 辛弃疾/nr, ,/w, 李贺/nr, ,/w, 白居易/nr, 等/u, 几/m, 个/q, 人/n, ,/w, 你/r, 快来/d, 救/v, 我们/r, 。/w]
[我们/r, 这边/r, 有/v, 李白/nr, ,/w, 杜甫/nr, ,/w, 辛弃疾/nr, ,/w, 李贺/nr, ,/w, 白居易/nr, 等/u, 几个人/n, ,/w, 你/r, 快/d, 来/v, 救/v, 我们/r, 。/w]
[李白, 杜甫, 辛弃疾, 李贺, 白居易]
6.注意点
使用到了npl的话,就得装HanLp的模型库,将模型库data放到Resource下