如何注释和训练数据以主要提取数字数据

时间:2018-08-26 22:00:15

标签: nlp stanford-nlp spacy information-extraction ner

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

  

首席执行官最近寻求了有关正在开发中的卡车的功能的建议,他透露了一些计划中的功能,例如400至500英里续航里程的选装件,带动态悬架的双电机全轮驱动动力总成'300,000磅牵引力”等等。当被问及发布日期时,首席执行官估计了2021年第二季度的时间。

理想的输出类似于

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

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

我正在尝试使用在线资源/教程,但它们似乎都集中在单独的命名实体识别或提取与基于字符串的实体的关系上(例如,LOC:巴黎,REL:是LOC:法国的首都) )。我需要提取的大多数(不是全部)数据只是属性数字值对。如何使用NLP工具完成此任务?在大多数情况下,我只是不确定是否应该将数字视为实体,如果是,则应将其标注为名为“ Value”的实体还是应为具有关联属性的实体名称标注。例如,这两种方法中哪一种是更好的注释方法?:

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

1 个答案:

答案 0 :(得分:0)

如果继续使用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之类的新标签,尽管我强烈建议您阅读catastrophic forgetting问题,该模型将“忘记”磨合新标签时的旧标签。我个人和同事一起遇到了这个问题,因为我们训练了这位ner来识别COMPANY作为标签。

我可能要做的是代替训练NER来识别每个功能,我可能会训练它来将FEATURE识别为一个实体,然后提供诸如“全轮驱动”或“越野”之类的东西暂停”,这样您就可以汇总一条文本中的所有FEATURE,而不必为每条文本进行训练。当然,这取决于最终游戏对NLP的需求。我建议的唯一原因是,我想象车辆上可能有的选择数量会越来越多(例如,您是否将雷达巡航作为理想输出中的一项功能?)并且具有万能的意愿使事情变得容易。同样,这取决于您的最终目标