使用 spacy 依赖解析在字典中进行句子分割

问题描述

我有一个包含原文句段和译文句段的 TMX 文件。其中一些片段由几个句子组成。我的目标是将这些多句段分段,以便整个 TMX 文件由单句段组成。

我打算使用 spacy 的依赖解析器来分割这些多句段。

为了实现这一点,我使用 Translate Toolkit 包提取了原文和译文句段。

然后我将源和目标段添加到字典 (seg_dic) 中。接下来,我将这些段转换为 nlp doc 对象,并再次将它们存储在字典 (doc_dic) 中。我现在想使用 spacy 的依赖解析器分割任何多句段...

for sent in doc.sents:
    print(sent.text)

...但我不知道如何使用存储在字典中的段来做到这一点。

这是我目前所拥有的:

import spacy
from translate.storage.tmx import tmxfile

with open("./files/NTA_test.tmx",'rb') as fin:
    tmx_file = tmxfile(fin,'de-DE','en-GB')

nlp_de = spacy.load("de_core_news_lg")
nlp_en = spacy.load("en_core_web_lg")

seg_dic = {}
doc_dic = {}

for node in tmx_file.unit_iter():
    seg_dic[node.source] = node.target
for source_seg,target_seg in seg_dic.items():
    doc_dic[nlp_de(source_seg)] = nlp_en(target_seg)

谁能解释我如何从这里开始?如何使用“for sent in doc.sents”逻辑迭代我的字典键和值?

解决方法

这里的解决方案是你不应该把你的东西放在这样的字典里——使用一个列表。也许像这样。

import spacy
from translate.storage.tmx import tmxfile

with open("./files/NTA_test.tmx",'rb') as fin:
    tmx_file = tmxfile(fin,'de-DE','en-GB')

de = spacy.load("de_core_news_lg")
en = spacy.load("en_core_web_lg")

out = []

for node in tmx_file.unit_iter():
    de_sents = list(de(node.source).sents)
    en_sents = list(en(node.target).sents)
    assert len(de_sents) == len(en_sents),"Different number of sentences!"
    
    for desent,ensent in zip(de_sents,en_sents):
        out.append( (desent,ensent) )

这其中的难点在于当句子数量不对齐时该怎么办。另请注意,我首先会谨慎对待您的转换,因为翻译人员可能会整体地做事,因此即使句子按数字排列,也不能保证第一个 DE 对应于第一个 EN,例如。>