'难'确定python中2个字符串之间的接近程度

时间:2015-12-03 05:27:12

标签: python algorithm proximity

我有2个字符串loss of geneaquaporin protein。在一行中,我想找到这两个是否存在于我的文件的一行中,在5个单词的附近。 有任何想法吗?我已经广泛搜索但找不到任何东西。 另外,由于这些是多字符串,我不能使用abs(array.index)作为两个字符串(单字可能使用)。

由于

2 个答案:

答案 0 :(得分:0)

我不完全确定这是否是你想要的,但我会试一试!

在Python中,您可以使用“in”来检查字符串是否在另一个字符串中。我假设您已经有办法从文件中存储一行:

"loss of gene" in fileLine -> returns boolean (either True or False)

有了这个,你可以检查你的文件中是否有“基因丢失”和“水通道蛋白”。一旦你确认他们都在那里,你可以通过将文本行分成一个列表来检查他们的接近度:

wordsList = fileLine.split()

如果在您的文本文件中有字符串:

  

“水通道蛋白有时可能表现出基因缺失”

分裂之后变为:

["The","aquaporin","protein","sometimes","may","exhibit","a","loss","of","gene"]

我不确定这是否是一个有效的句子但是为了举例我们忽略它:P

一旦你将文本行拆分成单词列表并确认单词在那里,你就可以接近python中列表附带的索引函数了!

wordsList.index("protein") -> returns index 2

在找到“蛋白质”的索引后,您可以查看“损失”的索引,然后减去它们以确定它们是否在5字附近。

您可以使用索引功能辨别“水通道蛋白”之前或之后“基因丢失”。如果首先出现“基因丢失”,则索引“基因”和“水通道蛋白”并减去这些指数。如果首先出现“水通道蛋白”,则将“蛋白质”和“损失”作为索引并减去这些指数。

如果单词的顺序不同,您将需要做更多的工作以确保正确地减去索引,但这应该涵盖问题的内容。祝你好运Chahat!

答案 1 :(得分:0)

您可以尝试以下方法:

  1. 首先通过将文本转换为小写来清理文本,仅保留字符并在每个单词之间强制使用一个空格。

  2. 接下来,搜索结果文本中的每个短语,并记下起始索引和匹配短语的长度。对此索引列表排序。

  3. 接下来确保所有找到的索引都不是-1,确保文本中存在所有短语。

  4. 如果找到所有内容,则计算第一个短语结尾与最后一个短语开头之间的单词数。要执行此操作,请从第一个短语的结尾开始到第二个短语的开头,然后将其拆分为单词。

  5. 脚本如下:

    import re
    
    text = "The  Aquaporin protein, sometimes  'may' exhibit a big LOSS of gene."
    text = ' '.join(re.findall(r'\b(\w+)\b', text.lower()))
    
    indexes = sorted((text.find(x), len(x)) for x in ['loss of gene', 'aquaporin protein'])
    
    if all(i[0] != -1 for i in indexes) and len(text[indexes[0][0] + indexes[0][1] : indexes[-1][0]].split()) <= 5:
        print "matched"
    

    要扩展此功能以处理包含短语列表的文件,可以使用以下方法:

    import re
    
    log = 'loss of gene'
    phrases = ['aquaporin protein', 'another protein']
    
    with open('input.txt') as f_input:
        for number, line in enumerate(f_input, start=1):
            # Sanitise the line
            text = ' '.join(re.findall(r'\b(\w+)\b', line.lower()))
    
            # Only process lines containing 'loss of gene'
            log_index = text.find(log)
    
            if log_index != -1:
                for phrase in phrases:
                    phrase_index = text.find(phrase)
    
                    if phrase_index != -1:
                        if log_index < phrase_index:
                            start, end = (log_index + len(log), phrase_index)
                        else:
                            start, end = (phrase_index + len(phrase), log_index)
    
                        if len(text[start:end].split()) <= 5:
                            print "line {} matched - {}".format(number, phrase)
                            break
    

    这会给你以下类型的输出:

    line 1 matched - aquaporin protein
    line 5 matched - another protein
    

    请注意,每行只会发现一个短语对。