Nlp 将Spacy生成的依赖项转换为CoNLL格式无法处理多个根?

Nlp 将Spacy生成的依赖项转换为CoNLL格式无法处理多个根?,nlp,spacy,dependency-parsing,conll,Nlp,Spacy,Dependency Parsing,Conll,我使用SpaCy库生成依赖项,并使用下面的代码将其保存为CoNLL格式 import pandas as pd import spacy df1 = pd.read_csv('cleantweets', encoding='latin1') df1['tweet'] = df1['tweet'].astype(str) tweet_list = df1['tweet'].values.tolist() nlp = spacy.load("en_core_web_sm") for i in tw

我使用SpaCy库生成依赖项,并使用下面的代码将其保存为CoNLL格式

import pandas as pd
import spacy

df1 = pd.read_csv('cleantweets', encoding='latin1')
df1['tweet'] = df1['tweet'].astype(str)
tweet_list = df1['tweet'].values.tolist()
nlp = spacy.load("en_core_web_sm")
for i in tweet_list:
    doc = nlp(i)
    for sent in doc.sents:
        print('\n')
        for i, word in enumerate(sent):
            if word.head is word:
                head_idx = 0
            else:
                 head_idx = doc[i].head.i + 1
            print("%d\t%s\t%d\t%s\t%s\t%s" % (
                i+1, 
                word.head,
                head_idx,
                word.text,
                word.dep_,
                word.pos_, 
                ))
这是可行的,但我的数据集中有一些句子被空间分割成两部分,因为它们有两个根。这导致CoNLL格式的一个句子有两个字段

示例:我的数据集中的一个随机句子是:“蒂安娜·特朗普可能更干净,但是”

以CoNLL格式保存为:

    1   trump   2   teanna      compound
    2   cleaner 4   trump       nsubj
    3   cleaner 4   probably    advmod
    4   cleaner 4   cleaner     ROOT
    5   hoe     6   twitter     amod
    6   cleaner 4   hoe         dobj


    1   but 2   but ROOT
是否有一种方法可以将所有内容保存在一个字段而不是两个字段中,即使它有两个根,这样“but”就成为字段1中的第7项?这意味着它看起来会像这样

    1   trump   2   teanna      compound
    2   cleaner 4   trump       nsubj
    3   cleaner 4   probably    advmod
    4   cleaner 4   cleaner     ROOT
    5   hoe     6   twitter     amod
    6   cleaner 4   hoe         dobj
    7   but     2   but         ROOT
我建议使用(或调整)textacy CoNLL exporter以获得正确的格式,请参见:

Spacy的解析器正在进行句子分割,您正在迭代
doc.sents
,因此您将看到它分别导出的每个句子。如果您想提供自己的句子切分,可以使用自定义组件,例如:

def set_custom_boundaries(doc):
    for token in doc[:-1]:
        if token.text == "...":
            doc[token.i+1].is_sent_start = True
    return doc

nlp.add_pipe(set_custom_boundaries, before="parser")
详细信息(特别是关于如何处理
None
False
True
):

Spacy的默认模型不是在类似twitter的文本上训练的,解析器在这里可能无法很好地处理句子边界

(请将不相关的问题作为单独的问题提问,并查看spacy的文档:)