gpt4 book ai didi

python - 段落匹配 Python

转载 作者:太空狗 更新时间:2023-10-29 21:11:12 28 4
gpt4 key购买 nike

背景资料

我有一个 Python 脚本,它生成带有 docx 的 word 文档。模块。这些文档是根据日志生成的,然后打印并存储为记录。但是,日志可以追溯编辑,因此需要修改文档记录,并且必须跟踪这些修改。我实际上并不是在修改文档,而是生成一个新文档,显示当前日志中的内容与日志中即将包含的内容之间的区别(在打印修改后的文件后更新日志)。当发生修订时,我的脚本使用 diff_match_patch使用以下函数生成更改内容的标记:

def revFinder(str1,str2):
dmp = dmp_module.diff_match_patch()

diffs = dmp.diff_main(str1,str2)
paratext = []

for diff in diffs:
paratext.append((diff[1], '' if diff[0] == 0 else ('s' if diff[0] == -1 else 'b')))

return paratext
docx如果需要逐字格式化,可以将文本作为字符串或元组,因此[请参阅“需要注意的事项”中的第二个项目符号]
[("Hello, ", ''), ("my name ", 'b'), ("is Brad", 's')]

产生

Hello my name is Brad



问题
diff_match_patch是一个非常有效的代码,可以找到两个文本之间的差异。不幸的是,它有点太高效了,所以更换 redundantdune结果是

re dun ant e



这很丑陋,但对于单个单词来说很好。但是,如果整个段落被替换,结果将完全不可读。那不行。

以前我通过将所有文本折叠成一个段落来解决这个问题,但这并不理想,因为它变得非常困惑并且仍然非常难看。

到目前为止的解决方案

我有一个创建修订文档的功能。这个函数被传递一个像这样设置的元组列表:
[(fieldName, original, revised)]

所以文档设置为
Orignial fieldName (With Markup)
result of revFinder diffing orignal and revised

Revised fieldName
revised

我假设为了解决这个问题,我需要在段落之间进行某种匹配,以确保我不会区分两个完全独立的段落。我还假设这种匹配将取决于是否添加或删除段落。这是我到目前为止的代码:
if len(item[1].split('\n')) + len(item[1].split('\n'))) == 2:

body.append(heading("Original {} (With Markup)".format(item[0]),2))
body.append(paragraph(revFinder(item[1],item[2])))
body.append(paragraph("",style="BodyTextKeep"))
body.append(heading("Revised {}".format(item[0]),2))
body.append(paragraph(item[2]))
body.append(paragraph(""))

else:
diff = len(item[1].split('\n')) - len(item[1].split('\n'))
if diff == 0:

body.append(heading("Original {} (With Markup)".format(item[0]),2))
for orPara, revPara in zip(item[1].split('\n'),item[2].split('\n')):
body.append(paragraph(revFinder(orPara,revPara)))
body.append(paragraph("",style="BodyTextKeep"))
body.append(heading("Revised {}".format(item[0]),2))
for para in item[2].split('\n'):
body.append(paragraph("{}".format(para)))
body.append(paragraph(""))

elif diff > 0:
#Removed paragraphs



elif diff < 0:
#Added paragraphs

到目前为止,我已经计划使用类似 difflib 的东西。做段落匹配。但是如果有更好的方法来避免这个问题,那就是一种完全不同的方法,那也很好。

一些注意事项:
  • 我在 Windows 7 64 位上运行 Python 2.7.6 32 位
  • 我对 docx 的本地副本进行了一些更改(即通过格式添加删除线)所以如果您测试此代码,您将无法复制我在这方面所做的工作


  • 整个流程的描述(粗体显示修订步骤):

    1) 用户打开 Python 脚本并使用 GUI 向称为“条件报告”(CR) 的事物添加信息

    NOTE: A full CR contains 4 parts, all completed by different people. But each part gets individually printed. All 4 parts are stored together in the log



    2) 当用户完成后,将信息保存到日志中(如下所述),然后打印为 .docx文件

    3) 打印的文件被签名并保存

    4) 当用户想要修改 CR 的一部分时,打开 GUI,并编辑每个字段中的信息。我只关心这个问题中的几个字段,那些是多行文本控件(可能导致多个段落)

    5) 用户完成修订后,代码会生成我在“到目前为止的解决方案”部分中描述的元组列表,并将其发送到生成修订文档的函数

    6) 修订文档与该 CR 的那部分的原始文档一起创建、打印、签名和存储

    7) 日志被完全重写以包含修改后的信息

    日志:

    原木简直就是一个巨大的 dict它存储有关所有 CR 的所有信息。一般格式是
    {"Unique ID Number": [list of CR info]}

    日志不存储 CR 的过去版本,因此当修订 CR 时,旧信息将被覆盖(这是我们希望系统实现的)。正如我之前提到的,每次编辑日志时,都会重写整个内容。要获取日志中的信息,我 import它(因为它始终与脚本位于同一目录中)

    最佳答案

    尝试使用@tzaman 上面提到的 diff_match_patch 后差异清理选项,特别是查看 diff_cleanupSemantic用于当 diff 输出是人类可读的时使用的函数。

    清理选项不会自动运行,因为 diff_match_patch 提供了几个清理选项供您选择(取决于您的需要)。

    下面是一个例子:

    import diff_match_patch

    dmp = diff_match_patch.diff_match_patch()
    diffs = dmp.diff_main('This is my original paragraph.', 'My paragraph is much better now.')
    print diffs # pre-cleanup

    dmp.diff_cleanupSemantic(diffs)
    print diffs # post cleanup

    输出:
    [(-1, 'This is m'), (1, 'M'), (0, 'y'), (-1, ' original'), (0, ' paragraph'), (1, ' is much better now'), (0, '.')]
    [(-1, 'This is my original paragraph'), (1, 'My paragraph is much better now'), (0, '.')]

    如您所见,第一个差异是最佳的但不可读,而第二个差异(清理后)正是您正在寻找的。

    关于python - 段落匹配 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21466890/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com