一、缘起
我们有时候辛辛苦苦写一个几千字、上万字甚至数万字的Word文件,写完之后往往需要进行错别字和多漏字的校对,其中文字重复是一项重要的检查内容。自动查错与纠错是NLP的一个研究领域,这种技术需要语言学知识的参与。本文给出的小程序不涉及到自动查错与纠错,只是从形式上机械检查所有重复的单字词、双字词、三字词和四字词。
二、环境
Win 10 中文专业版64位 + Python 3.65 64位 + 8G RAM
三、思路
正则表达式是个好东西,单字词重复可以用模式串 (.)\1 来匹配,双字词重复可以用模式串 (..)\1 或 (.)(.)\1\2 来匹配……如果只想检查双字节字符的重复,可以用如下的正则表达式:
([^\x00-\xff…—])\1
([^\x00-\xff…—])([^\x00-\xff…—])\1\2
由于省略号和破折号是两个相同的双字节字符连在一起的,我们不想找出这样的重复,所以在方括号里面写入了单字节字符和…及—这两个双字节字符,并使用了脱字符^。
四、代码1

在这段代码中,pt1、pt2、pt3、pt4这四个模式串中之所以没有\1是因为\1代表整个匹配到的结果,不是重复的汉字。
五、结果示例
上述代码读取Word文件test.docx,把所有重复的单字词、双字词、三字词和四字词所在的行写入文本文件。众多的疑似重复和真重复都出现在最终的结果中,到底哪些是伪重复,哪些是真重复,还需要人工辨识。下面是实际检测出来的部分结果示例:
上图中,红圈内的是真重复,是错误的,蓝圈内的是伪重复,是正常的文本。我们一行一行地检查下来,如果发现真重复,就去Word文件中修改。相信这会比直接检查Word文件有效得多。
六、代码2
代码1中代码有些繁琐,可以进一步简化,简化后的代码如下:

欢迎指出本文的不足之处,欢迎就本文的相关问题跟作者进行交流。如果需要联系作者,请发邮件到 tbv_me@163.com 。