首页 > 解决方案 > 如何注释和训练数据以提取主要是数字数据

问题描述

我正在尝试从非结构化文本中提取信息。例如

这位首席执行官最近寻求为正在开发的卡车添加功能的建议,他透露了一些计划中的功能,例如 400 至 500 英里范围的选项、带动态悬架的双电机全轮驱动动力系统、“300,000 磅的牵引力”容量”等。当被问及发布日期时,首席执行官给出了 2021 年第二季度的估计时间。

理想的输出是这样的

[minRange = 400, maxRange = 500, allWheelDrive = TRUE, susepnsionType = 'Dynamic', releaseDate = 2021-04-01 00:00]

因为我要提取的数据并不总是以行为良好的对结构(例如,上面的 releaseDate 提取需要对整个句子进行语义处理)正则表达式和一些规则可能不够用。我相信我需要对我的数据集进行注释,然后使用 NLP 和 spaCy、NLTK 或斯坦福 NLP 等学习工具从未来的示例中提取属性值对。

我正在尝试使用在线资源/教程,但它们似乎都专注于单独的命名实体识别或提取与基于字符串的实体的关系(例如,LOC:Paris,REL:is capital of,LOC:France)。我需要提取的大多数(不是全部)数据只是属性-数字值对。我如何使用 NLP 工具完成此任务?在大多数情况下,我只是不确定这些数字是否应该被视为实体,如果是的话,是否应该将它们注释为名为“Value”的实体或赋予具有关联属性的实体名称。例如,这两者中哪一个是更好的注释方式?:

  1. <\PRODUCT>车辆<\PRODUCT>的牵引能力为<\TOWING_CAP>300,000 lbs<\TOWING_CAP>
  2. <\PRODUCT>车辆<\PRODUCT>的牵引能力为<\VALUE>300,000 lbs<\VALUE>,关系:“有牵引能力”

标签: nlpstanford-nlpspacyinformation-extractionnamed-entity-recognition

解决方案


如果您继续使用 spaCy,我会避免尝试识别 NER 中的数字,因为它们已经在解析器的依赖关系树中被识别为QUANTITY.

>>> import spacy
>>> text = "We have a towing capacity of 5,000 lbs"
>>> nlp = spacy.load('en_core_web_lg')
>>> doc = nlp(text)
doc.print_tree()
<stdin>:1: DeprecationWarning: Positional arguments to Doc.merge are deprecated. Instead, use the keyword arguments, for example tag=, lemma= or ent_type=.
[{'word': 'have', 'lemma': 'have', 'NE': '', ...{'word': 'of', ... 'modifiers': [{'word': '5,000 lbs', 'lemma': '5,000 lbs', 'NE': 'QUANTITY', 'POS_fine': 'NNS', 'POS_coarse': 'NOUN', 'arc': 'pobj', 'modifiers': []}]}]}]}]

您可以训练ner管道以获取新标签,例如PRODUCT,但我强烈建议您阅读灾难性遗忘问题,当您磨练新标签时,模型将“忘记”旧标签。COMPANY当我们训练ner将其识别为标签时,我亲自与一位同事遇到过这种情况。

我可能会做的不是训练 NER 来识别每个特征,我可能会训练它识别FEATURE为一个实体,然后给它提供诸如“全轮驱动”或“越野悬架”之类的东西,这样你就可以聚合所有的FEATUREs 都来自一段文本,而不是针对每个文本进行训练。当然,这取决于你想从 NLP 中得到什么。我建议的唯一原因是,我认为车辆上可能的选项数量会越来越多(例如,您是否会将雷达巡航作为理想输出中的一个功能包括在内?)并且拥有一个包罗万象的意愿让事情变得更容易。同样,这取决于您的最终目标


推荐阅读