Danil commited on
Commit
8329a95
1 Parent(s): c05a5b4

Update utils.py

Browse files
Files changed (1) hide show
  1. utils.py +72 -37
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
- def sweet_check(s1: str, s2: str):
14
- STOP_PUNCT = list(',./!@#$%^&*()_+=-<>?\|{}[]`~/')
15
- STOP = set(
16
- ["скидка", "скидкой", "скидки", "скидке", "скидкой", "скидке", "недорого", "дешево", "в", "на", "для", "о", "у",
17
- "и", "с", "из"] + STOP_PUNCT)
 
 
 
 
 
 
18
  s1 = s1.lower()
19
  s2 = s2.lower()
20
- set_s1 = set(s1.split(' ')) - STOP
21
- set_s2 = set(s2.split(' ')) - STOP
22
- if set_s1 == set_s2:
23
- return False
 
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
- def check(s1: str, s2: str, debag=False, morph=morph) -> float:
37
- STOP_PUNCT = list(',./!@#$%^&*()_+=-<>?\|{}[]`~/')
38
- STOP = set(
39
- ["скидка", "скидкой", "скидки", "скидке", "скидкой", "скидке", "недорого", "дешево", "в", "на", "для", "о", "у",
40
- "и", "с", "из"] + STOP_PUNCT)
41
- s1 = s1.lower()
42
- s2 = s2.lower()
43
- s1 = [morph.parse(i)[0].normal_form for i in s1.split(' ')]
44
- s2 = [morph.parse(i)[0].normal_form for i in s2.split(' ')]
45
- set_s1 = set(s1) - STOP
46
- set_s2 = set(s2) - STOP
 
 
 
 
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