我对Python比较陌生,所以提前道歉,有时听起来有些笨拙。我会尝试带谷歌并尽可能多地尝试你的提示,然后再提出更多问题。 这是我的情况:我正在使用R和测针来找出文本的(可能的)作者身份。我想做的是看一下(假设的)共同作者之一去世后,第二版小说的风格测量是否存在差异,因此无法做出贡献。为了研究我需要的
和python输出
我希望每次出现时都会出现这样的话,不仅仅是“一次”,而是每当程序遇到它时,它与第一版不同(是的,我知道我要求很多抱歉)
我试过通过
接近这个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}?
答案 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)
您想要输出:
有趣。您需要的是一组差异。
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)