线条不相似时,2个文本之间的输出差异

时间:2017-07-05 16:19:37

标签: python difflib

我对Python比较陌生,所以提前道歉,有时听起来有些笨拙。我会尝试带谷歌并尽可能多地尝试你的提示,然后再提出更多问题。 这是我的情况:我正在使用R和测针来找出文本的(可能的)作者身份。我想做的是看一下(假设的)共同作者之一去世后,第二版小说的风格测量是否存在差异,因此无法做出贡献。为了研究我需要的

  • 文字版1
  • Text edition 2

和python输出

  • 出现在文字1中但不出现在文字2中的文字
  • 出现在文字2中但未出现在文字1中的文字

我希望每次出现时都会出现这样的话,不仅仅是“一次”,而是每当程序遇到它时,它与第一版不同(是的,我知道我要求很多抱歉)

我试过通过

接近这个
file1 = open("FRANKENST18.txt", "r")
file2 = open("FRANKENST31.txt", "r")
file3 = open("frankoutput.txt", "w")
list1 = file1.readlines()
list2 = file2.readlines()
file3.write("here: \n")
for i in list1:
    for j in list2:
        if  i==j:
            file3.write(i)

但当然这不起作用,因为文本是两个巨大的文本球而不是可以比较的单独行,加上第一个文本比第二个文本有更多的行。有没有办法从线条到“文字”或一般文字来克服这个问题?我可以把整本小说放在一个字符串中吗?我假设没有。 我也试过使用difflib,但我几周前才开始编码,我发现它很复杂。例如,我使用fraxel的脚本作为基础:

from difflib import Differ

s1 = open("FRANKENST18.txt", "r")
s1 = open("FRANKENST31.txt", "r")

def appendBoldChanges(s1, s2):
#"Adds <b></b> tags to words that are changed"
    l1 = s1.split(' ')
    l2 = s2.split(' ')
dif = list(Differ().compare(l1, l2))
return " ".join(['<b>'+i[2:]+'</b>' if i[:1] == '+' else i[2:] for i in dif 
                                                       if not i[:1] in '-?'])

print appendBoldChanges

但我无法让它发挥作用。

所以我的问题是,有没有办法输出这样的行中不相似的文本之间的差异?这听起来很可行,但我大大低估了我发现Python的难度哈哈。 感谢阅读,感谢任何帮助!

编辑:发布我当前的代码,以防万一可以帮助谷歌搜索答案的学习者:

file1 = open("1stein.txt")
originaltext1 = file1.read()
wordlist1={}

import string
text1 = [x.strip(string.punctuation) for x in originaltext1.split()]
text1 = [x.lower() for x in text1]

for word1 in text1:
    if word1 not in wordlist1:
        wordlist1[word1] = 1
    else:
        wordlist1[word1] += 1

for k,v in sorted(wordlist1.items()):
    #print "%s %s" % (k, v)
    col1 = ("%s %s" % (k, v))
    print col1

file2 = open("2stein.txt")
originaltext2 = file2.read()
wordlist2={}

import string
text2 = [x.strip(string.punctuation) for x in originaltext2.split()]
text2 = [x.lower() for x in text2]

for word2 in text2:
    if word2 not in wordlist2:
        wordlist2[word2] = 1
    else:
        wordlist2[word2] += 1

for k,v in sorted(wordlist2.items()):
    #print "%s %s" % (k, v)
    col2 = ("%s %s" % (k, v))
    print col2 

我希望仍然可以编辑和输出是这样的: 使用字典的键和值系统(应用于col1和col2):{apple 3,bridge 7,chair 5} - {apple 1,bridge 9,chair 5} = {apple 2,bridge -2,chair 5}?

3 个答案:

答案 0 :(得分:0)

请告诉我这是不是您正在寻找的内容,但似乎您想要遍历文件行,您可以在python中轻松完成。这是一个例子,我省略每行末尾的换行符,并将这些行添加到列表中:

f = open("filename.txt", 'r')
lines = []
for line in f:
    lines.append(f[:-1])

希望这有帮助!

答案 1 :(得分:0)

我不完全确定你是否在尝试比较单词出现时的差异或出现时的行数,但是你可以通过使用字典来实现这一点。如果您想查看哪些行发生了变化,您可以通过执行以下操作来分割句点:

text = 'this is a sentence. this is another sentence.'
sentences = text.split('.')

这将在句点上拆分你拥有的字符串(包含我假设的整个文本),并返回所有句子的数组(或列表)。

然后你可以用dict = {}创建一个字典,在先前创建的数组中循环每个句子,使它成为字典中具有相应值的一个键(可能是任何东西,因为大多数句子可能不会发生更多比一次)。在为第一个版本执行此操作后,您可以浏览第二个版本并检查哪些句子是相同的。下面是一些代码,它们将为您提供一个开始(假设版本1包含第一个版本中的所有句子):

for sentence in version1:
    dict[sentence] = 1                     #put a counter for e  

然后你可以遍历第二个版本并检查第一个版本是否找到相同的句子,例如:

  for sentence in version2:
       if sentence in dict:            #if the sentence is in the dictionary
            pass
            #or do whatever you want here
       else:                           #if the sentence isn't
            print(sentence)

再次不确定这是否是您正在寻找的,但希望它有所帮助

答案 2 :(得分:0)

您想要输出:

  • 出现在文字1中但不出现在文字2中的文字
  • 出现的词语 文本2但不是文本1

有趣。您需要的是一组差异。

import re
s1 = open("FRANKENST18.txt", "r").read()
s1 = open("FRANKENST31.txt", "r").read()

words_s1 = re.findall("[A-Za-z]",s1)
words_s2 = re.findall("[A-Za-z]",s2)

set_s1 = set(words_s1)
set_s2 = set(words_s2)

words_in_s1_but_not_in_s2 = set_s1 - set_s2
words_in_s2_but_not_in_s1 = set_s2 - set_s1

words_in_s1 = '\n'.join(words_in_s1_but_not_in_s2)
words_in_s2 = '\n'.join(words_in_s2_but_not_in_s1)

with open("s1_output","w") as s1_output:
    s1_output.write(words_in_s1)

with open("s2_output","w") as s2_output:
    s2_output.write(words_in_s2)