Spaces:
Runtime error
Runtime error
Update utils.py
Browse files
utils.py
CHANGED
@@ -1,58 +1,98 @@
|
|
1 |
import pymorphy2
|
|
|
|
|
2 |
morph = pymorphy2.MorphAnalyzer()
|
|
|
|
|
|
|
|
|
|
|
3 |
|
4 |
def counter(s: str) -> dict:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5 |
d = {}
|
6 |
for i in s:
|
7 |
if i not in d:
|
8 |
d[i] = 0
|
9 |
d[i] += 1
|
10 |
return d
|
|
|
|
|
|
|
|
|
11 |
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
s1 = s1.lower()
|
19 |
s2 = s2.lower()
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
|
|
24 |
diff_s1 = ' '.join(list(set_s1 - set_s2))
|
25 |
diff_s2 = ' '.join(list(set_s2 - set_s1))
|
|
|
|
|
26 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
if len(diff_s1) == 0:
|
28 |
-
# return diff_s2
|
29 |
return True
|
30 |
if len(diff_s2) == 0:
|
31 |
return False
|
32 |
-
|
33 |
return True
|
34 |
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
|
|
|
|
|
|
|
|
47 |
if set_s1 == set_s2:
|
48 |
return False
|
49 |
-
|
50 |
-
diff_s1 = ' '.join(list(set_s1 - set_s2))
|
51 |
-
diff_s2 = ' '.join(list(set_s2 - set_s1))
|
52 |
-
if debag:
|
53 |
-
print(s1)
|
54 |
-
print(s2)
|
55 |
-
|
56 |
if len(diff_s1) == 0:
|
57 |
return True
|
58 |
if len(diff_s2) == 0:
|
@@ -70,11 +110,6 @@ def check(s1: str, s2: str, debag=False, morph=morph) -> float:
|
|
70 |
c_s2[i] -= 1
|
71 |
else:
|
72 |
c -= 1
|
73 |
-
|
74 |
-
if len(diff_s2) == len(diff_s1):
|
75 |
-
c -= 1
|
76 |
-
if debag:
|
77 |
-
print(c / len(min_s))
|
78 |
-
if c / len(min_s) < 1.0:
|
79 |
return True
|
80 |
return False
|
|
|
1 |
import pymorphy2
|
2 |
+
from typing import List
|
3 |
+
|
4 |
morph = pymorphy2.MorphAnalyzer()
|
5 |
+
STOP_PUNCT = list(',./!@#$%^&*()_+=-<>?\|{}[]`~/')
|
6 |
+
STOP = set(
|
7 |
+
["скидка", "скидкой", "скидки", "скидке", "скидкой", "скидке", "недорого", "дешево",
|
8 |
+
"в", "на", "для", "о", "у", "и", "с", "из"] + STOP_PUNCT
|
9 |
+
)
|
10 |
|
11 |
def counter(s: str) -> dict:
|
12 |
+
"""
|
13 |
+
Словарь, который позволяет нам считать количество неизменяемых объектов
|
14 |
+
|
15 |
+
Args:
|
16 |
+
s: Входная строка, по которой строится словарь
|
17 |
+
Returns:
|
18 |
+
Количество неизменяемых объектов
|
19 |
+
"""
|
20 |
d = {}
|
21 |
for i in s:
|
22 |
if i not in d:
|
23 |
d[i] = 0
|
24 |
d[i] += 1
|
25 |
return d
|
26 |
+
|
27 |
+
def prepare4check(s1: str, s2: str, STOP: set = STOP, morph=morph) -> List[set, set, str, str]:
|
28 |
+
"""
|
29 |
+
Предобработка данных для проверки
|
30 |
|
31 |
+
Args:
|
32 |
+
s1: Первая сравнимая строка
|
33 |
+
s2: Вторая сравнимая строка
|
34 |
+
STOP: множество стоп слов, которые мы хотели бы исключать
|
35 |
+
morph: Морфологический анализатор, для лемматизации слов
|
36 |
+
Returns:
|
37 |
+
Список предобработанных данных:
|
38 |
+
set_s1: уникальные слова первой строки с учетом удаленных стоп слов
|
39 |
+
set_s2: уникальные слова второй строки с учетом удаленных стоп слов
|
40 |
+
diff_s1: Разница между множеством слов 1 строки и множеством слов 2 строки
|
41 |
+
diff_s2: Разница между множеством слов 2 строки и множеством слов 1 строки
|
42 |
+
"""
|
43 |
s1 = s1.lower()
|
44 |
s2 = s2.lower()
|
45 |
+
s1 = [morph.parse(i)[0].normal_form for i in s1.split(' ')]
|
46 |
+
s2 = [morph.parse(i)[0].normal_form for i in s2.split(' ')]
|
47 |
+
set_s1 = set(s1) - STOP
|
48 |
+
set_s2 = set(s2) - STOP
|
49 |
+
|
50 |
diff_s1 = ' '.join(list(set_s1 - set_s2))
|
51 |
diff_s2 = ' '.join(list(set_s2 - set_s1))
|
52 |
+
|
53 |
+
return [set_s1, set_s2, diff_s1, diff_s2]
|
54 |
|
55 |
+
def easy_check(s1: str, s2: str, STOP: set = STOP) -> bool:
|
56 |
+
"""
|
57 |
+
Простой уровень проверки. Есть 3 типа проверки:
|
58 |
+
1: если s1 имеет такие же слова, как и s2
|
59 |
+
2: если s1 входит в множество слов s2 (предполагаем, что s2 хранит дополнительные признаки, например s1=обувь, а s2=обувь Адидас)
|
60 |
+
3: если s2 входит в множество слов s1 (предполагаем, что s2 не хранит никакой дополнительной информацией, а является частью s1)
|
61 |
+
Args:
|
62 |
+
s1: Первая сравнимая строка
|
63 |
+
s2: Вторая сравнимая строка
|
64 |
+
STOP: множество стоп слов, которые мы хотели бы исключать
|
65 |
+
Returns:
|
66 |
+
результат всех условий первой проверки
|
67 |
+
"""
|
68 |
+
set_s1, set_s2, diff_s1, diff_s2 = prepare4check(s1, s2, STOP)
|
69 |
+
if set_s1 == set_s2:
|
70 |
+
return False
|
71 |
if len(diff_s1) == 0:
|
|
|
72 |
return True
|
73 |
if len(diff_s2) == 0:
|
74 |
return False
|
|
|
75 |
return True
|
76 |
|
77 |
+
def check(s1: str, s2: str, STOP: set = STOP, morph=morph) -> bool:
|
78 |
+
"""
|
79 |
+
Более сложный уровень проверки. Есть 4 типа проверки:
|
80 |
+
1: если s1 имеет такие же слова, как и s2
|
81 |
+
2: если s1 входит в множес��во слов s2 (предполагаем, что s2 хранит дополнительные признаки, например s1=обувь, а s2=обувь Адидас)
|
82 |
+
3: если s2 входит в множество слов s1 (предполагаем, что s2 не хранит никакой дополнительной информацией, а является частью s1)
|
83 |
+
4: проверяем частотность минимальной строки, к максимальной, чтобы определить разницу между количеством уникальных токенов
|
84 |
+
Args:
|
85 |
+
s1: Первая сравнимая строка
|
86 |
+
s2: Вторая сравнимая строка
|
87 |
+
STOP: множество стоп слов, которые мы хотели бы исключать
|
88 |
+
morph: Морфологический анализатор, для лемматизации слов
|
89 |
+
Returns:
|
90 |
+
результат всех условий второй проверки
|
91 |
+
"""
|
92 |
+
set_s1, set_s2, diff_s1, diff_s2 = prepare4check(s1, s2, STOP)
|
93 |
if set_s1 == set_s2:
|
94 |
return False
|
95 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
if len(diff_s1) == 0:
|
97 |
return True
|
98 |
if len(diff_s2) == 0:
|
|
|
110 |
c_s2[i] -= 1
|
111 |
else:
|
112 |
c -= 1
|
113 |
+
if (c / len(min_s)) < 1.0:
|
|
|
|
|
|
|
|
|
|
|
114 |
return True
|
115 |
return False
|