Nlp 关于英语模式中括号的解析

Nlp 关于英语模式中括号的解析,nlp,spacy,dependency-parsing,Nlp,Spacy,Dependency Parsing,这句话是简化维基百科的一部分: 空气中有三种物质:氮气(79%)、氧气(20%)和其他类型的气体(1%) spaCy 2.0和2.1中的附加百分比处理得不好。处理这类问题的最佳方法是什么 以下是可视化: 使用regex&spacy的merge/retokenize方法将括号中的内容合并为单个标记 >>> import spacy >>> import re >>> my_str = "There are three things in ai

这句话是简化维基百科的一部分:

空气中有三种物质:氮气(79%)、氧气(20%)和其他类型的气体(1%)

spaCy 2.0和2.1中的附加百分比处理得不好。处理这类问题的最佳方法是什么

以下是可视化:

  • 使用regex&spacy的merge/retokenize方法将括号中的内容合并为单个标记

    >>> import spacy
    >>> import re
    >>> my_str = "There are three things in air, Nitrogen (79%), oxygen (20%), and other types of gases (1%)."
    >>> nlp = spacy.load('en')
    >>> parsed = nlp(my_str)
    >>> [(x.text,x.pos_) for x in parsed]
    [('There', 'ADV'), ('are', 'VERB'), ('three', 'NUM'), ('things', 'NOUN'), ('in', 'ADP'), ('air', 'NOUN'), (',', 'PUNCT'), ('Nitrogen', 'PROPN'), ('(', 'PUNCT'), ('79', 'NUM'), ('%', 'NOUN'), (')', 'PUNCT'), (',', 'PUNCT'), ('oxygen', 'NOUN'), ('(', 'PUNCT'), ('20', 'NUM'), ('%', 'NOUN'), (')', 'PUNCT'), (',', 'PUNCT'), ('and', 'CCONJ'), ('other', 'ADJ'), ('types', 'NOUN'), ('of', 'ADP'), ('gases', 'NOUN'), ('(', 'PUNCT'), ('1', 'NUM'), ('%', 'NOUN'), (')', 'PUNCT'), ('.', 'PUNCT')]
    
    >>> indexes = [m.span() for m in re.finditer('\([\w%]{0,5}\)',my_str,flags=re.IGNORECASE)]
    >>> indexes
    [(40, 45), (54, 59), (86, 90)]
    >>> for start,end in indexes:
    ...     parsed.merge(start_idx=start,end_idx=end)
    ...
    (79%)
    (20%)
    (1%)
    >>> [(x.text,x.pos_) for x in parsed]
    [('There', 'ADV'), ('are', 'VERB'), ('three', 'NUM'), ('things', 'NOUN'), ('in', 'ADP'), ('air', 'NOUN'), (',', 'PUNCT'), ('Nitrogen', 'PROPN'), ('(79%)', 'PUNCT'), (',', 'PUNCT'), ('oxygen', 'NOUN'), ('(20%)', 'PUNCT'), (',', 'PUNCT'), ('and', 'CCONJ'), ('other', 'ADJ'), ('types', 'NOUN'), ('of', 'ADP'), ('gases', 'NOUN'), ('(1%)', 'PUNCT'), ('.', 'PUNCT')]
    

最初在上写了一个答案,但堆栈溢出绝对是解决此类问题的更好地方

我刚刚用最新版本测试了您的示例,标记化如下所示:

['There'、'are'、'three'、'things'、'in'、'air'、'non'、'('、'79'、'%'、')、',
"氧","氧","氧","氧","氧","氧","氧","氧","氧",
这是解析树,我觉得很不错。(如果您想自己尝试一下,请注意我设置了
options={'collapse\u punct':False,'compact':True}
以分别显示所有标点符号,并使大树更易于阅读。)

也就是说,您可能还会发现许多边缘情况和示例,说明开箱即用的标记化规则无法概括所有标点符号和括号的组合,或者预先训练的解析器或标记器做出了错误的预测。因此,如果您要处理括号中较长的插入,而解析器难以处理这些插入,那么您可能需要使用更多类似的示例对其进行微调


孤立地看一句话并没有多大帮助,因为它不能让你很好地了解数据的总体准确性以及重点。即使你训练了一个奇特的、最先进的模型,使你的数据准确率达到90%,这仍然意味着每10次预测都是错误的。

你以前是否尝试过使用代码/库,而不仅仅是可视化演示,对句子进行标记并将其传递给解析器?谢谢你的代码。作为spaCy编码的一个示例,它确实有所帮助。另外,您使用了什么版本的spaCy?如何将这些
选项添加到spaCy标记器中?