使用 Python 从非结构化文本中提取人的年龄

2023-11-26

我有一个行政档案数据集,其中包括简短的传记。我正在尝试使用 python 和一些模式匹配来提取人们的年龄。一些句子的例子是:

  • “邦德先生,67 岁,是英国的一名工程师”
  • “阿曼达·B·拜恩斯 (Amanda B. Bynes),34 岁,是一名演员”
  • “彼得·帕克(45 岁)将成为我们的下一任管理员”
  • “迪伦先生今年46岁。”
  • “史蒂夫·琼斯,年龄:32,”

这些是我在数据集中发现的一些模式。我想补充一点,还有其他模式,但我还没有遇到它们,并且不确定如何实现它们。我编写的以下代码运行得很好,但效率很低,因此在整个数据集上运行需要太多时间。

#Create a search list of expressions that might come right before an age instance
age_search_list = [" " + last_name.lower().strip() + ", age ",
" " + clean_sec_last_name.lower().strip() + " age ",
last_name.lower().strip() + " age ",
full_name.lower().strip() + ", age ",
full_name.lower().strip() + ", ",
" " + last_name.lower() + ", ",
" " + last_name.lower().strip()  + " \(",
" " + last_name.lower().strip()  + " is "]

#for each element in our search list
for element in age_search_list:
    print("Searching: ",element)

    # retrieve all the instances where we might have an age
    for age_biography_instance in re.finditer(element,souptext.lower()):

        #extract the next four characters
        age_biography_start = int(age_biography_instance.start())
        age_instance_start = age_biography_start + len(element)
        age_instance_end = age_instance_start + 4
        age_string = souptext[age_instance_start:age_instance_end]

        #extract what should be the age
        potential_age = age_string[:-2]

        #extract the next two characters as a security check (i.e. age should be followed by comma, or dot, etc.)
        age_security_check = age_string[-2:]
        age_security_check_list = [", ",". ",") "," y"]

        if age_security_check in age_security_check_list:
            print("Potential age instance found for ",full_name,": ",potential_age)

            #check that what we extracted is an age, convert it to birth year
            try:
                potential_age = int(potential_age)
                print("Potential age detected: ",potential_age)
                if 18 < int(potential_age) < 100:
                    sec_birth_year = int(filing_year) - int(potential_age)
                    print("Filing year was: ",filing_year)
                    print("Estimated birth year for ",clean_sec_full_name,": ",sec_birth_year)
                    #Now, we save it in the main dataframe
                    new_sec_parser = pd.DataFrame([[clean_sec_full_name,"0","0",sec_birth_year,""]],columns = ['Name','Male','Female','Birth','Suffix'])
                    df_sec_parser = pd.concat([df_sec_parser,new_sec_parser])

            except ValueError:
                print("Problem with extracted age ",potential_age)

我有几个问题:

  • 有没有更有效的方法来提取这些信息?
  • 我应该使用正则表达式吗?
  • 我的文本文档很长,而且有很多。我可以一次搜索所有项目吗?
  • 检测数据集中其他模式的策略是什么?

从数据集中提取的一些句子:

  • “2010年授予Love先生的股权奖励占其总薪酬的48%”
  • “乔治·F·鲁宾 (George F. Rubin)(14)(15),68 岁,自 1997 年起担任受托人。”
  • “INDRA K. NOOYI,56 岁,自 2006 年起担任百事公司首席执行官 (CEO)”
  • “47 岁的洛瓦洛先生于 2011 年被任命为财务主管。”
  • “查尔斯·贝克先生,79 岁,是生物技术公司的商业顾问。”
  • “Botein 先生,43 岁,自我们成立以来一直是我们董事会的成员。”

由于必须处理您的文本,而不仅仅是模式匹配,因此正确的方法是使用多种方法之一NLP那里有可用的工具。

你的目标是使用命名实体识别 (NER)这通常是基于机器学习模型完成的。 NER 活动尝试识别一组确定的实体类型在文本中。例子有:地点、日期、组织和人名.

虽然不是 100% 精确,这比简单的模式匹配要精确得多(特别是对于英语),因为它依赖于模式以外的其他信息,例如词性(POS)、依存解析等。

看看我通过使用您提供的短语获得的结果艾伦 NLP 在线工具(使用细粒度 NER 模型):

  • “邦德先生,67 岁,是英国的一名工程师”:

Mr Bond, 67, is an engineer in the UK

  • “阿曼达·B·拜恩斯 (Amanda B. Bynes),34 岁,是一名演员”

Amanda B. Bynes, 34, is an actress

  • “彼得·帕克(45 岁)将成为我们的下一任管理员”

Peter Parker (45) will be our next administrator

  • “迪伦先生今年46岁。”

Mr. Dylan is 46 years old.

  • “史蒂夫·琼斯,年龄:32,”

Steve Jones, Age: 32,

请注意,最后一项是错误的。正如我所说,不是 100%,但易于使用。

这种方法的一大优点是:您不必为数百万种可用可能性中的每一种制作特殊的图案。

最好的事情是:您可以将其集成到您的 Python 代码中:

pip install allennlp

And:

from allennlp.predictors import Predictor
al = Predictor.from_path("https://s3-us-west-2.amazonaws.com/allennlp/models/fine- 
grained-ner-model-elmo-2018.12.21.tar.gz")
al.predict("Your sentence with date here")

然后,查看“日期”实体的结果字典。

Spacy 也是如此:

!python3 -m spacy download en_core_web_lg
import spacy
sp_lg = spacy.load('en_core_web_lg')
{(ent.text.strip(), ent.label_) for ent in sp_lg("Your sentence with date here").ents}

(然而,我在那里有过一些糟糕的经历和糟糕的预测——尽管它被认为更好)。

有关更多信息,请阅读 Medium 上这篇有趣的文章:https://medium.com/@b.terryjack/nlp-pretrained-named-entity-recognition-7caa5cd28d7b

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 从非结构化文本中提取人的年龄 的相关文章

随机推荐

  • 如何仅删除字符串中的 html 标签?

    我已经编写了删除 HTML 标签的代码 但它也删除了a
  • 除了日志记录和事务管理之外,AOP 还有哪些实际应用?

    我理解这些原理 但我很难看出实际应用在哪些地方 请赐教 询问任何支持人员 日志记录是notAOP的一个很好的应用 他们不关心应用程序内部调用什么方法 他们关心应用程序正在执行的重要操作 并需要以他们理解的方式呈现该信息 要创建像样的日志 您
  • 3DSv2 Sagepay 直接集成基础知识

    协议 4 00 的文档可能会更有帮助 对于每个努力让 3DSV2 工作的人来说 我希望任何已经设法让 3DSV2 工作的人能够详细阐述基础知识 我将根据我的理解总结流程 请大家帮忙纠正必要的地方并添加任何问题 例如从 VPSTx Id 中删
  • 如何在 pyspark pandas_udf 中记录/打印消息?

    我已经测试过logger and print无法打印消息pandas udf 无论是在集群模式还是客户端模式 测试代码 import sys import numpy as np import pandas as pd from pyspa
  • 具有任意类型值的 C++ 关联数组

    在 C 中为每个键创建具有任意值类型的关联数组的最佳方法是什么 目前我的计划是创建一个 值 类 其中包含我期望类型的成员变量 例如 class Value int iValue Value int v iValue v std string
  • 如何禁用底部的反应本机警告消息

    我正在开发一个react native IOS应用程序 这个应用程序有时会引发一条警告消息 setState 只能更新已安装或正在安装的组件 我明白该消息的含义 这是由于长时间的AJAX调用造成的 考虑到这个警告不会对APP造成任何严重的问
  • HTTP 错误 500.19 - 内部服务器错误?

    我正在将一个非常基本的站点从 Win 2003 迁移到 Win 2008 R2 该网站出现下面列出的错误 我该如何诊断这个问题 我在这两台服务器之间移动了许多其他站点 这是唯一收到此错误的站点 我看过有关此问题的其他帖子 但没有一个列出适合
  • 使用 Nhibernate 过滤通过聚合根返回的子集合

    我正在尝试在使用 Nhibernate 加载聚合根时过滤它的子集合 向客户加载所有已发货的订单 这可能吗 那么 您可以公开在地图中过滤的属性 如下所示
  • 如何在 processStartInfo 中传递多个参数?

    我想运行一些cmd命令来自c 代码 我关注了一些博客和教程并得到了答案 但我有点困惑 即我应该如何传递多个参数 我使用以下代码 System Diagnostics Process process new System Diagnostic
  • Python美汤表单输入解析

    我的目标是获取所有输入名称和值的列表 将它们配对并提交表格 名称和值是随机的 from bs4 import BeautifulSoup parsing html
  • 可以设置Python对象的任何属性[重复]

    这个问题在这里已经有答案了 例如 这段代码是Python a object a b 3 throws AttributeError object object has no attribute b 但是 这段代码 class c objec
  • 将 sonar.test.exclusions 与 Sonarqube 6.3 一起使用

    我目前正在评估 Sonarqube 6 3 对我当前的 5 5 实例进行了重大升级 并且在尝试找出该功能的过程中我感到很困惑声纳 测试 排除环境 有这样一个问题 Sonar Maven 插件 如何排除测试源目录 这似乎表明它用于从分析中排除
  • Python 中的重复数据删除

    在浏览 Python 中用于重复数据删除的 Dedupe 库的示例时 我发现它创建了一个集群 ID输出文件中的列 根据文档 该列指示哪些记录相互引用 虽然我无法找出两者之间的任何关系集群 ID这对查找重复记录有什么帮助 如果有人对此有见解
  • Java线程阻塞

    我的java环境有问题 我运行 Solr 1 3 搜索引擎 已有一年多了 突然间我遇到了很多麻烦 我所有的线程池 250 每天都会被随机阻塞一两次 我没有对 solr 应用程序或 tomcat 服务器进行任何更改 我正在运行 tomcat
  • 测试两个 __m128i 变量之间的相等性

    如果我想在两个之间进行按位相等测试 m128i变量 我是否需要使用 SSE 指令或者我可以使用 如果不是 我应该使用哪条SSE指令 虽然使用 mm movemask epi8是一种解决方案 如果您有一个带有 SSE4 1 的处理器 我认为更
  • 获取点击事件中按钮的 ID/名称。网络

    我在 VB NET 中有一个事件可以同时处理多个按钮单击 我需要知道选择的哪个按钮启动了事件 有什么想法如何做到这一点 我的代码如下 Private Sub Answer Click ByVal sender As System Objec
  • 检查字符串中是否包含表情符号

    我用这个得到字符串的文本大小 textSize tempDict valueForKeyPath caption text sizeWithFont UIFont systemFontOfSize 12 constrainedToSize
  • 在 C 套接字编程中刷新套接字流

    我想知道如何在用 C 进行套接字编程时刷新套接字流 我尝试了所有选项设置TCP NODELAY使用以下代码 setsockopt sockfd IPPROTO TCP TCP NODELAY char flag sizeof int 注 所
  • 当窗体具有许多下拉列表控件时,C#.net windows 窗体调整大小的速度缓慢

    我制作了一个带有许多下拉列表的 Windows 窗体 这些下拉列表放置在网格 不是数据网格 内 当我在所有这些窗体中使用anchor left right top Bottom 和 dock fill 选项时 窗体调整大小在运行时会变慢 停
  • 使用 Python 从非结构化文本中提取人的年龄

    我有一个行政档案数据集 其中包括简短的传记 我正在尝试使用 python 和一些模式匹配来提取人们的年龄 一些句子的例子是 邦德先生 67 岁 是英国的一名工程师 阿曼达 B 拜恩斯 Amanda B Bynes 34 岁 是一名演员 彼得