【问题标题】:Line-by-line comparison of three similar but non-identical strings三个相似但不相同的字符串的逐行比较
【发布时间】:2018-04-19 06:44:08
【问题描述】:

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

我有三个字符串。我们称它们为 string1、string2 和 string3。这些字符串来自语音转文本 API(所有这些我都已经整理好了)。它们非常相似,但并不完全相同(例如,可能存在翻译错误……有些词可能略有偏差,并且 string1 中可能有一个不在 string2 或 string3 中的额外词)。

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

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

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

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

我发现这是一个非常困难的问题。到目前为止,这是我所得到的:

我首先通过 string1.split() 对字符串进行标记。

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

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

但从这里开始,我绝对被吓到了!

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

任何帮助将不胜感激!

【问题讨论】:

标签: python string string-comparison


【解决方案1】:

好的,我有一个答案。事实证明,这比我最初想的要困难得多。因此,我创建了一个名为 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)

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

【讨论】:

    【解决方案2】:

    如何将批量大小与计数器一起使用。在这里,比如 '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 之间的任何值。在使用示例并根据结果时应该清除这一点,如果没有测试,我无法确认它应该是什么。我相信你应该能够达到那个理想的指数值范围。

    【讨论】:

    • 这可能是我能得到的最好的了。具体来说,我可能在最初的问题中没有说清楚,我试图找到一种方法来使每个字符串排列的点(例如 l1、l2、l3)模块化,以便它们落在每个字符串中的相同单词。我也许可以在其中添加一个影响 l1、l2 和 l3 的索引搜索。感谢您的回复!
    • RE 更新:是的,这就是我一直想要的。我将尝试像您在示例中那样运行搜索,然后对所有搜索结果的索引进行快速差异计算并使用最小的一个。仍然存在 string1 中打印的最后一个单词在 string2 中不存在的问题条件。进步吧!
    • 是的,这就是为什么我包含搜索返回-1的条件,因此将10个单词写入文件。继续测试和分析,我相信你会有一个解决方案。如果我有帮助,请您投票并接受我的回答。谢谢!
    • 一旦我达到代表要求,我肯定会 xD
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多