2015-12-03 28 views
0

我有2個字符串loss of geneaquaporin protein。在一行中,我想查找這兩個字是否存在於我的文件的一行中,並且在5個字的範圍內。 任何想法?我已經廣泛搜索,但找不到任何東西。 另外,由於這些是多字字符串,所以我不能在這兩個字符中使用abs(array.index)(這對於單個字是可能的)。'難'確定python中的2個字符串之間的相似度

感謝

+0

請給出一個例子,所謂的'proximity' ... – Sayakiss

+0

@Sayakiss通過鄰近,我的意思是如果這兩個謊言彼此接近,說5個單詞相隔。 – user1993

回答

0

你可以試試下面的辦法:

  1. 首先通過將其轉換爲小寫,只保留人物和執行每個字之間有一個空格淨化你的文字。

  2. 接下來,搜索結果文本中的每個短語,並記錄起始索引和匹配短語的長度。排序這個索引列表。

  3. 接下來,通過確保所有找到的索引不是-1,確保所有短語都出現在文本中。

  4. 如果找到全部數字,則計數第一個短語結尾與最後一個短語開始之間的詞數。要做到這一點,從第一個詞組的末尾開始到第二個詞組的開始,並將其分成單詞。

腳本如下:

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 

請注意,這隻會在每行中找到一個詞組對。

+0

謝謝馬丁。你能解釋什麼是索引[0] [1],索引[-1] [0]和索引[0] [0]? – user1993

+0

如果你打印索引,你會看到一個元組列表。第一個是索引,第二個是長度,所以'indexes [0] [1]'是第一個條目的長度。 '-1'是最後一項(我可以使用'1',因爲只有兩個)。 –

+0

再次感謝。另外,正如我在對前一個答案的評論中指出的那樣,「水通道蛋白」實際上是含有300,000個這樣的字符串的列表中的一個元素;所有這些都要檢查。所以,你不認爲我應該首先檢查我的品系是否有'缺失基因'來消除沒有它的品系,然後按照你的建議進行嗎? – user1993

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!

+0

非常感謝!這很不錯。讓我看看是否有人有任何其他建議! – user1993

+0

你應該注意不要用'\ n'劃界,並且可能使用一些標點作爲'.split()'的分隔符?如果用'\ n'分隔,你可以分開可以進行比賽的句子/句子。取決於文件的寫入方式。 – tijko

+0

嘿,我也想問一下,實際上「水通道蛋白」不是一次性的字符串。它是一個文件的一部分,有300,000多這樣的字符串。那麼我應該首先檢查是否有任何300K字符串在線? – user1993

相關問題