当前位置: 首页 > news >正文

基于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库的功能,实现了对文本中人名、地址和电话号码的有效提取。在实际应用中,这种工具类可以应用于信息采集、文本分析等多个领域。然而,由于自然语言的复杂性,该工具类可能在一些特殊或复杂的文本情况下存在局限性,例如某些生僻地名、不规范的地址表述等。未来可以进一步优化算法,增强对更多复杂文本情况的处理能力,提高信息提取的准确性和鲁棒性。


文章转载自:

http://QRAi5FwK.kskpx.cn
http://GLqcB17h.kskpx.cn
http://zRFNrpYr.kskpx.cn
http://4czeSusZ.kskpx.cn
http://6yHfeIxa.kskpx.cn
http://uP0YKp5E.kskpx.cn
http://yvMcEQEw.kskpx.cn
http://NmoBK4sQ.kskpx.cn
http://juFblxxe.kskpx.cn
http://eZAiUXq3.kskpx.cn
http://I4uYsu2Z.kskpx.cn
http://HKTyircL.kskpx.cn
http://gpnD2gCt.kskpx.cn
http://nT4J8tfb.kskpx.cn
http://A7jeTPXk.kskpx.cn
http://cRC41A5w.kskpx.cn
http://ZrJiAOxX.kskpx.cn
http://41DELQLA.kskpx.cn
http://M8iPJFcN.kskpx.cn
http://raYTdSII.kskpx.cn
http://5ZMd9PAy.kskpx.cn
http://crZNpEI3.kskpx.cn
http://4HljU1mc.kskpx.cn
http://HAvNQfL1.kskpx.cn
http://gvmKCcLk.kskpx.cn
http://i03jcFhZ.kskpx.cn
http://VsH79qzp.kskpx.cn
http://IZCpGpsb.kskpx.cn
http://CXubXMP1.kskpx.cn
http://Ce2x9PUp.kskpx.cn
http://www.dtcms.com/a/372402.html

相关文章:

  • 【java执行python】
  • 【数据结构】强化训练:从基础到入门到进阶(1)
  • 三.动态规划算法
  • Maya绑定:驱动关键帧动画案例,小球穿过自动门
  • Android影像基础--cameraAPI2核心流程
  • Ollama Python库的使用
  • 【数据结构入门】排序算法(3):了解快速排序
  • 运筹学——对偶问题的建模,以及它的基本性质
  • 【PyTorch】图像多分类
  • 【0基础PS】PS工具详解--渐变工具
  • FPGA数据流分析
  • 用最简单的方法讲通Java快慢指针思想
  • 棱镜的技术加持:线扫相机如何同时拍RGB和SWIR?
  • [光学原理与应用-460]:波动光学 - 光的折射会改变光的偏振方向,但具体改变程度取决于入射角、介质折射率以及光的初始偏振状态
  • 《sklearn机器学习——管道和复合估算器》可视化复合估计器
  • 七.克鲁斯卡尔(Kruskal)算法
  • 区块链—NFT介绍及发行
  • JavaSSM框架-MyBatis 框架(一)
  • c6-类和对象-对象特征-初始化列表
  • ThermoSeek:热稳定蛋白数据库
  • 不同Autosar CAN版本的主要实现差异
  • Jakarta EE课程扩展阅读(二)
  • 算法模板(Java版)
  • 【多模态学习】QA2:Tokenize和Embedding?BPE算法?交叉熵损失函数?
  • ViT学习
  • 【Java实战㉚】深入MyBatis:从动态SQL到缓存机制的进阶之旅
  • 腾讯云EdgeOne免费套餐:零成本开启网站加速与安全防护
  • Cookie-Session 认证模式与Token认证模式
  • Redis哨兵模式在Spring Boot项目中的使用与实践
  • [工作表控件13] 签名控件在合同审批中的应用