三个相似但不相同的字符串的逐行比较

时间:2017-11-07 00:44:59

标签: python string string-comparison

好的,我在这里遇到了一个棘手的问题,我似乎无法正确实施。

我有三个字符串。我们称它们为string1,string2和string3。这些字符串来自语音到文本API(所有这些我已经整理出来)。它们非常相似但不完全相同(例如,可能存在翻译错误......某些单词可能稍微偏离,并且string1中可能有一个额外的单词不在string2或string3中)。

为了比较string1,string2和string3,我将它们打印成文本文件。问题是,如果这些字符串相当大,很难将它们并排比较。

比较它们的更好方法是“逐行”。

我正在寻找一种方法来打印string1,new line的n个单词,然后打印string2的m个单词,直到string1 [n] == string2 [m]的点,然后对string3执行相同的操作。

然后我需要对string1,string2和string3的其余部分重复此过程,以便它们“逐行”地进行充分比较。

我发现这是一个难以置信的难题。这是我到目前为止所得到的:

我开始通过string1.split()标记字符串。

然后有一个占位符来跟踪我们在每个字符串中使用哪个单词是有意义的。

我定义了一个k的批量大小(比方说10个单词),它代表一条线的长度。然后我打印string1的k个单词,为string2 = string2.index(string1 [k])设置占位符。

但是从这里开始,我完全被惊吓了!

有关如何进行的任何提示/建议/理论。是否有任何图书馆可以做到这一点?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

如何将批量大小与计数器一起使用。在这里,说' l1',' l2'和' l3'是每个字符串的行号。

string1 = string1.split(" ")
while(len(string1) > l1 + k:
    file.write(string1[l1 : l1 + k])
    l1 = l1 + k
    file.write(string2[l2 + k])
    l2 = l2 + k
    file.write(string3[l3 + k])
    l3 = l3 + k
file.write(string1[l1:])
file.write(string2[l2:])
file.write(string3[l3:])

我相信这应该做到。如果这没有帮助,请详细说明您的问题。

更新: 根据您的评论,我建议不要在l2和l3上使用批量大小,而是在string2和string3中查找string1的最后一个单词。 例如,在循环中尝试这个:

#k1 = 10
file.write(string1[l1 : l1+k1])
l1 = l1 + k1
k2 = string2.find(string1[l1], beg=l2)
# Read note below
if k2 > 15 or k2 < 0:
    k2 = 10
file.write(string2[l2 : l2+k2])
l2 = l2 + k2
#same for string3

这里,第二个字符串被写入,直到遇到相同的单词。

注意:if条件是检查索引是否变为庞大的数字。假设您的解析器不识别该特定字,因此该程序将写入,直到读取该特定字或最终写入整个字符串。所以我已经包含了批量限制,如果在接下来的15个单词中没有识别出相同的单词,那么程序只会写入10个单词。 -1条件是在没有遇到这个词的时候。

这仍然不是完美的逻辑,因为仍然存在失败的情况,例如,当句子中的单词重复时,所以你可以理想地使用如果k2不会说谎的情况在8 - 12然后它被设置为10,否则在8-12之间。在使用示例和基于结果时应该清除这一点,如果不进行测试,我无法确认它应该是什么。我相信你应该能够达到理想的指数值范围。

答案 1 :(得分:0)

好的,我有一个答案。事实证明这比我原先想象的要困难得多。所以,我创建了一个名为find_closest_index的函数,如下所示:

def find_closest_index(str1, str2, n):
value = str1[n]
print(value)
indices = []
mins = []
for i, x in enumerate(str2):
    if x == value:
        indices.append(i)
for num in indices:
    mins.append(abs(num-n))
try:
    minvalue = min(mins)
    index = mins.index(minvalue)
    if(indices[index] - n) < 10:
        return indices[index]
    else:
        return 0
except:
    return 0

然后我用它来编写直到字符串之间相似点的行:

k = batch_size
s1 = 0
f1 = k
s2 = 0
f2 = k
s3 = 0
f3 = k


outfile = open('compare.txt','w')

while(s1 + k < len(tok_string1)):
    for word in tok_string1[s1:f1]:
        outfile.write("%s " %word)
    outfile.write("\n")
    f2 = find_closest_index(tok_string1, tok_string2, f1)
    for word in tok_string2[s2:f2]:
        outfile.write("%s " %word)
    outfile.write("\n")
    s2 = f2
    f3 = find_closest_index(tok_string1, tok_string2, f1)
    for word in tok_string3[s3:f3]:
        outfile.write("%s " %word)
    outfile.write("\n\n")
    s3 = f3
    s1 = s1 + k
    f1 = f1 + k

最后我输出剩下的剩余字符串

for word in tok_string1[s1:-1]:
    outfile.write("%s " %word)
outfile.write("\n")
for word in tok_string2[s2:-1]:
    outfile.write("%s " %word)
outfile.write("\n")
for word in tok_string3[s3:-1]:
    outfile.write("%s " %word)

它并不完美。但它完成了这项工作。谢谢你的帮助!

相关问题