在google-diff-match-patch中做差异时如何忽略某些字符?

wea*_*ish 5 diff text-processing nlp

我正在使用google-diff-match-patch来比较自然语言中的纯文本。

如何使google-diff-match-patch忽略某些字符?(一些无关紧要的细微差别。)

例如,给定text1:

give me a cup of bean-milk. Thanks.
Run Code Online (Sandbox Code Playgroud)

和text2:

please give mom a cup of bean milk!  Thank you.
Run Code Online (Sandbox Code Playgroud)

(请注意,在“谢谢”之前有两个空格字符。)

google-diff-match-patch输出如下所示:

[please] give m(e)[om] a cup of bean(-)[ ]milk(.)[!] Thank(s)[ you].
Run Code Online (Sandbox Code Playgroud)

看来google-diff-match-patch仅忽略不同数量的空格。

我怎样才能告诉google-diff-match-patch也忽略像这样的字符[-.!]

预期结果将是

[please] give m(e)[om] a cup of bean-milk. Thank(s)[ you].
Run Code Online (Sandbox Code Playgroud)

谢谢。

wea*_*ish 3

google-diff-match-patch 可以输出元组列表

第一个元素指定它是插入 (1)、删除 (-1) 还是相等 (0)。第二个元素指定受影响的文本。

例如:

diff_main("Good dog", "Bad dog") => [(-1, "Goo"), (1, "Ba"), (0, "d dog")]
Run Code Online (Sandbox Code Playgroud)

因此我们只需要过滤这个列表。

Python 中的示例代码:

Ignored_marks = re.compile('[ ,\.;:!\'"?-]+$')

def unmark_minor_diffs(diffs): #diffs are list of tuples produced by google-diff-match-patch

  cooked_diffs = []
  for (op, data) in diffs: 
  if not Ignored_marks.match(data):
    cooked_diffs.append((op, data))
  else:
    if op in (0, -1):
      cooked_diffs.append((0, data))
  return cooked_diffs
Run Code Online (Sandbox Code Playgroud)