-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtextutils.py
30 lines (26 loc) · 1.5 KB
/
textutils.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import re
import Levenshtein
def clean_text(text):
# Заменить все символы, кроме русских букв, английских букв и цифр, на пробел
text = re.sub(r'[^a-zA-Zа-яА-Я0-9]', ' ', text)
# Удалить повторяющиеся пробелы
text = re.sub(r'\s+', ' ', text).strip()
return text
def find_best_match(string_list, text, length_penalty_factor):
cleaned_text = clean_text(text)
best_match = None
best_score = float('inf')
for current_string in string_list:
cleaned_current_string = clean_text(current_string)
if len(cleaned_current_string) == 0:
continue
for i in range(len(cleaned_text) - len(cleaned_current_string) + 1):
substring = cleaned_text[i:i+len(cleaned_current_string)]
distance = Levenshtein.distance(cleaned_current_string, substring)
# Нормализуем расстояние делением на длину строки и добавляем штраф за длину
normalized_distance = (distance / len(cleaned_current_string)) + (length_penalty_factor * len(cleaned_current_string))
# Используем нормализованное расстояние для определения лучшего совпадения
if normalized_distance < best_score:
best_score = normalized_distance
best_match = current_string
return best_match