基于HanLP的地址信息识别:识别出人名、地址和电话号码
摘要:本文介绍了一个Java工具类AddressUtils
,它借助HanLP自然语言处理库,实现从给定文本中提取人名、地址和电话号码的功能。该工具类通过正则表达式识别电话号码,并利用HanLP的分词和词性标注功能区分人名与地址,同时对直辖市地址进行了特殊处理。
关键词:Java;HanLP;文本信息提取;正则表达式
一、引言
在文本处理的众多场景中,从自然语言文本里提取特定信息,人名、地址和电话号码。AddressUtils
类,结合正则表达式和HanLP库的功能,能够较为准确地从文本中提取这些关键信息,为后续的数据分析、信息整理等工作提供支持。
二、AddressUtils
类设计
2.1 类结构与常量定义
AddressUtils
类定义了一个私有静态常量MUNICIPALITIES
,用于存储直辖市列表。该列表在后续处理地址时,用于识别和特殊处理直辖市地址。
// 定义直辖市列表
private static final List<String> MUNICIPALITIES = Arrays.asList("北京市", "天津市", "上海市", "重庆市");
2.2 核心方法extractInfo
extractInfo
方法是该类的核心,负责从输入文本中提取人名、地址和电话号码。
- 电话号码提取:
使用正则表达式1[3 - 9]\\d{9}
匹配电话号码。若找到匹配的电话号码,将其保存到phoneNumber
变量中,并从原始文本中移除该电话号码,以便后续对剩余文本进行人名和地址的提取。
// 使用正则表达式识别电话号码
Pattern phonePattern = Pattern.compile("1[3 - 9]\\d{9}");
Matcher phoneMatcher = phonePattern.matcher(text);
String phoneNumber = "";
if (phoneMatcher.find()) {phoneNumber = phoneMatcher.group();// 从原始文本中移除电话号码text = text.replace(phoneNumber, "").trim();
}
- 直辖市地址处理:
遍历直辖市列表,检查文本是否以直辖市名称开头。如果是,则将直辖市名称从文本中移除,同时不单独处理省份,因为直辖市本身就是省级行政区。
// 检查是否为直辖市地址
for (String municipality : MUNICIPALITIES) {if (text.startsWith(municipality)) {// 直辖市直接添加到地址中,不单独处理省份text = text.substring(municipality.length()).trim();break;}
}
- 人名和地址提取:
利用HanLP库对处理后的文本进行分词和词性标注。遍历标注结果,根据词性nr
(表示人名)和ns
(表示地名)来分别构建人名和地址字符串。对于既不是人名也不是地名的词,认为可能是地址的一部分,也添加到地址字符串中。
// 使用 HanLP 进行分词和词性标注
List<Term> termList = HanLP.segment(text);
StringBuilder name = new StringBuilder();
StringBuilder address = new StringBuilder();for (Term term : termList) {if ("nr".equals(term.nature.toString())) { // nr 表示人名name.append(term.word);} else if ("ns".equals(term.nature.toString())) { // ns 表示地名address.append(term.word);} else {// 非人名和地名,可能是地址的一部分,继续添加address.append(term.word);}
}
最后,将提取到的人名、地址和电话号码作为数组返回。
return new String[]{name.toString().trim(), address.toString().trim(), phoneNumber};
2.3 main
方法测试
main
方法提供了一个简单的测试示例,输入一段包含人名、地址和电话号码的文本,调用extractInfo
方法进行信息提取,并将结果打印输出。
public static void main(String[] args) {// 测试直辖市地址String text = "吉林省长春市飞扬街道三凯路1111号 13067895543 贾冰";String[] result = extractInfo(text);System.out.println("识别到人名: " + result[0]);System.out.println("识别到地址: " + result[1]);System.out.println("识别到电话号码: " + result[2]);
}
三、结论
AddressUtils
类通过正则表达式和HanLP库的功能,实现了对文本中人名、地址和电话号码的有效提取。在实际应用中,这种工具类可以应用于信息采集、文本分析等多个领域。然而,由于自然语言的复杂性,该工具类可能在一些特殊或复杂的文本情况下存在局限性,例如某些生僻地名、不规范的地址表述等。未来可以进一步优化算法,增强对更多复杂文本情况的处理能力,提高信息提取的准确性和鲁棒性。