Nlp 将Spacy生成的依赖项转换为CoNLL格式无法处理多个根?
我使用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
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的文档:)