我有2個字符串loss of gene
和aquaporin protein
。在一行中,我想查找這兩個字是否存在於我的文件的一行中,並且在5個字的範圍內。 任何想法?我已經廣泛搜索,但找不到任何東西。 另外,由於這些是多字字符串,所以我不能在這兩個字符中使用abs(array.index)(這對於單個字是可能的)。'難'確定python中的2個字符串之間的相似度
感謝
我有2個字符串loss of gene
和aquaporin protein
。在一行中,我想查找這兩個字是否存在於我的文件的一行中,並且在5個字的範圍內。 任何想法?我已經廣泛搜索,但找不到任何東西。 另外,由於這些是多字字符串,所以我不能在這兩個字符中使用abs(array.index)(這對於單個字是可能的)。'難'確定python中的2個字符串之間的相似度
感謝
你可以試試下面的辦法:
首先通過將其轉換爲小寫,只保留人物和執行每個字之間有一個空格淨化你的文字。
接下來,搜索結果文本中的每個短語,並記錄起始索引和匹配短語的長度。排序這個索引列表。
接下來,通過確保所有找到的索引不是-1
,確保所有短語都出現在文本中。
如果找到全部數字,則計數第一個短語結尾與最後一個短語開始之間的詞數。要做到這一點,從第一個詞組的末尾開始到第二個詞組的開始,並將其分成單詞。
腳本如下:
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
請注意,這隻會在每行中找到一個詞組對。
我不能完全肯定,如果這是你想要的,但我給它一個鏡頭!
在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!
請給出一個例子,所謂的'proximity' ... – Sayakiss
@Sayakiss通過鄰近,我的意思是如果這兩個謊言彼此接近,說5個單詞相隔。 – user1993