У меня есть огромное количество записей, содержащих последовательности ('ATCGTGTGCATCAGTTTCGA ...'), до 500 символов. У меня также есть список меньших последовательностей, обычно 10-20 символов. Я хотел бы использовать расстояние Левенштейна, чтобы найти эти меньшие последовательности внутри записей, допускающие небольшие изменения или индексы (L_distance < = 2).Получить позицию подпоследовательности с использованием Levenshtein-Distance
Проблема в том, что я также хочу получить начальную позицию таких меньших последовательностей, и, по-видимому, она сравнивает только последовательности одной и той же длины.
>>> import Levenshtein
>>> s1 = raw_input('first word: ')
first word: ATCGTAATACGATCGTACGACATCGCGGCCCTAGC
>>> s2 = raw_input('second word: ')
first word: TACGAT
>>> Levenshtein.distance(s1,s2)
29
В этом примере я хотел бы получить позицию (7) и расстояние (в данном случае 0).
Есть ли простой способ решить эту проблему, или мне нужно разбить большие последовательности на более мелкие, а затем запустить расстояние Левенштейна для всех из них? Это может занять слишком много времени.
Спасибо.
UPDATE #Naive реализация, генерирующая все подстроки после поиска точного соответствия.
def find_tag(pattern,text,errors):
m = len(pattern)
i=0
min_distance=errors+1
while i<=len(text)-m:
distance = Levenshtein.distance(text[i:i+m],pattern)
print text[i:i+m],distance #to see all matches.
if distance<=errors:
if distance<min_distance:
match=[i,distance]
min_distance=distance
i+=1
return match
#Real example. In this case just looking for one pattern, but we have about 50.
import re, Levenshtein
text = 'GACTAGCACTGTAGGGATAACAATTTCACACAGGTGGACAATTACATTGAAAATCACAGATTGGTCACACACACATTGGACATACATAGAAACACACACACATACATTAGATACGAACATAGAAACACACATTAGACGCGTACATAGACACAAACACATTGACAGGCAGTTCAGATGATGACGCCCGACTGATACTCGCGTAGTCGTGGGAGGCAAGGCACACAGGGGATAGG' #Example of a record
pattern = 'TGCACTGTAGGGATAACAAT' #distance 1
errors = 2 #max errors allowed
match = re.search(pattern,text)
if match:
print [match.start(),0] #First we look for exact match
else:
find_tag(pattern,text,errors)
Возможный дубликат [Проверка нечеткой/приблизительной подстроки, существующей в более длинной строке, на Python?] (Http://stackoverflow.com/questions/17740833/checking-fuzzy-approximate-substring-existing-in-a-longer -string-in-python) – flup
Я уже прочитал, что один и на него не ответил полностью. Как вы получаете позицию? Это просто создает подстроки, как я указал в исходном вопросе. – biojl
get_matching_blocks docs say: _Верните список троек, описывающих соответствующие подпоследовательности. Каждая тройка имеет вид (i, j, n) и означает, что a [i: i + n] == b [j: j + n]. Тройки монотонно возрастают в i и j. Неужели это не поможет вам? – flup