使用 spacy 依赖解析在字典中进行句子分割
sentence segmentation within a dictionary using spacy dependency parse
我有一个包含原文和译文片段的 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,例如。
我有一个包含原文和译文片段的 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,例如。