我的目标是在两个文本段落中提取对齐的匹配序列。接下来是我的文本:
txt1='the heavy lorry crashed into the building at midnight'
txt2='what a heavy lorry it is that crashed into the building'
预期产出:
'heavy lorry'
'crashed into the building'
我的尝试:
def sequ(s1,s2):
_split1=s1.split()
_split2=s2.split()
_match=''.join(list(set(_split1) & set(_split2)))
return _match
print sequ(txt1, txt2)
Result: heavybuildingintocrashedthelorry
......扭曲的结果。
有关如何达到预期结果的任何建议? 谢谢。
答案 0 :(得分:7)
difflib.SequenceMatcher.get_matching_blocks
完全符合您的要求。
import difflib
def sequ(s1, s2):
words1 = s1.split()
words2 = s2.split()
matcher = difflib.SequenceMatcher(a=words1, b=words2)
for block in matcher.get_matching_blocks():
if block.size == 0:
continue
yield ' '.join(words1[block.a:block.a+block.size])
txt1 = 'the heavy lorry crashed into the building at midnight'
txt2 = 'what a heavy lorry it is that crashed into the building'
print list(sequ(txt1, txt2))
输出:
['heavy lorry', 'crashed into the building']
答案 1 :(得分:2)
txt1='the heavy lorry crashed into the building at midnight'
txt2='what a heavy lorry it is that crashed into the building'
s1, s2 = txt1.split(), txt2.split()
l1, l2 = len(s1), len(s2)
set1 = {" ".join(s1[j:j+i]) for i in range(1,l1+1) for j in range(l1+1-i)}
set2 = {" ".join(s2[j:j+i]) for i in range(1,l2+1) for j in range(l2+1-i)}
r = sorted(set1.intersection(set2), key = lambda x: len(x.split()))
rs = [j for k,j in enumerate(r) if all(j not in r[i] for i in range(k+1,len(r)))]
print rs
# ['heavy lorry', 'crashed into the building']