Kolesnikov Dmitry commited on
Commit
753b589
·
1 Parent(s): 4c753f6

fix: Добавлено скачивание через nltk

Browse files
Files changed (1) hide show
  1. src/tokenizers_cmp.py +81 -9
src/tokenizers_cmp.py CHANGED
@@ -73,8 +73,36 @@ class TokenizationComparator:
73
  """Инициализация компаратора."""
74
  self.methods = {}
75
  self.results = {}
 
76
  self._initialize_methods()
77
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
78
  def _initialize_methods(self):
79
  """Инициализирует доступные методы токенизации."""
80
  # Наивная токенизация
@@ -128,16 +156,24 @@ class TokenizationComparator:
128
 
129
  def _tokenize_nltk(self, text: str) -> List[str]:
130
  """Токенизация с помощью NLTK."""
 
131
  try:
132
  return word_tokenize(text, language='russian')
133
- except LookupError:
134
- # Автоматическая загрузка необходимых данных NLTK (punkt)
135
- import nltk # local import to avoid hard dependency if NLTK not used
136
  try:
137
- nltk.download('punkt', quiet=True)
 
 
138
  except Exception:
139
- pass
140
- return word_tokenize(text, language='russian')
 
 
 
 
 
 
141
 
142
  def _tokenize_spacy(self, text: str) -> List[str]:
143
  """Токенизация с помощью SpaCy."""
@@ -146,13 +182,37 @@ class TokenizationComparator:
146
 
147
  def _tokenize_with_stemming(self, text: str) -> List[str]:
148
  """Токенизация с применением стемминга Porter."""
149
- tokens = word_tokenize(text, language='russian')
 
 
 
 
 
 
 
 
 
 
 
 
150
  stemmer = PorterStemmer()
151
  return [stemmer.stem(token) for token in tokens if token.isalpha()]
152
 
153
  def _tokenize_with_snowball(self, text: str) -> List[str]:
154
  """Токенизация с применением стемминга Snowball."""
155
- tokens = word_tokenize(text, language='russian')
 
 
 
 
 
 
 
 
 
 
 
 
156
  stemmer = SnowballStemmer('russian')
157
  return [stemmer.stem(token) for token in tokens if token.isalpha()]
158
 
@@ -163,7 +223,19 @@ class TokenizationComparator:
163
 
164
  def _tokenize_with_pymorphy(self, text: str) -> List[str]:
165
  """Токенизация с применением лемматизации PyMorphy2."""
166
- tokens = word_tokenize(text, language='russian')
 
 
 
 
 
 
 
 
 
 
 
 
167
  lemmas = []
168
  for token in tokens:
169
  if token.isalpha():
 
73
  """Инициализация компаратора."""
74
  self.methods = {}
75
  self.results = {}
76
+ self._ensure_nltk_resources()
77
  self._initialize_methods()
78
 
79
+ def _ensure_nltk_resources(self):
80
+ """Обеспечивает наличие необходимых ресурсов NLTK."""
81
+ if not NLTK_AVAILABLE:
82
+ return
83
+
84
+ import nltk
85
+ try:
86
+ # Пробуем использовать punkt_tab для русского языка
87
+ try:
88
+ nltk.data.find('tokenizers/punkt_tab/russian')
89
+ except LookupError:
90
+ try:
91
+ nltk.download('punkt_tab', quiet=True)
92
+ except Exception:
93
+ pass
94
+ except Exception:
95
+ pass
96
+
97
+ # Также загружаем обычный punkt как fallback
98
+ try:
99
+ nltk.data.find('tokenizers/punkt')
100
+ except LookupError:
101
+ try:
102
+ nltk.download('punkt', quiet=True)
103
+ except Exception:
104
+ pass
105
+
106
  def _initialize_methods(self):
107
  """Инициализирует доступные методы токенизации."""
108
  # Наивная токенизация
 
156
 
157
  def _tokenize_nltk(self, text: str) -> List[str]:
158
  """Токенизация с помощью NLTK."""
159
+ import nltk
160
  try:
161
  return word_tokenize(text, language='russian')
162
+ except LookupError as e:
163
+ # Автоматическая загрузка необходимых данных NLTK
 
164
  try:
165
+ # Пробуем загрузить punkt_tab для русского языка
166
+ nltk.download('punkt_tab', quiet=True)
167
+ return word_tokenize(text, language='russian')
168
  except Exception:
169
+ try:
170
+ # Если не получилось, пробуем загрузить обычный punkt
171
+ nltk.download('punkt', quiet=True)
172
+ # Используем английский язык как fallback
173
+ return word_tokenize(text, language='english')
174
+ except Exception:
175
+ # Если и это не сработало, используем простую токенизацию
176
+ return text.split()
177
 
178
  def _tokenize_spacy(self, text: str) -> List[str]:
179
  """Токенизация с помощью SpaCy."""
 
182
 
183
  def _tokenize_with_stemming(self, text: str) -> List[str]:
184
  """Токенизация с применением стемминга Porter."""
185
+ import nltk
186
+ try:
187
+ tokens = word_tokenize(text, language='russian')
188
+ except LookupError:
189
+ try:
190
+ nltk.download('punkt_tab', quiet=True)
191
+ tokens = word_tokenize(text, language='russian')
192
+ except Exception:
193
+ try:
194
+ nltk.download('punkt', quiet=True)
195
+ tokens = word_tokenize(text, language='english')
196
+ except Exception:
197
+ tokens = text.split()
198
  stemmer = PorterStemmer()
199
  return [stemmer.stem(token) for token in tokens if token.isalpha()]
200
 
201
  def _tokenize_with_snowball(self, text: str) -> List[str]:
202
  """Токенизация с применением стемминга Snowball."""
203
+ import nltk
204
+ try:
205
+ tokens = word_tokenize(text, language='russian')
206
+ except LookupError:
207
+ try:
208
+ nltk.download('punkt_tab', quiet=True)
209
+ tokens = word_tokenize(text, language='russian')
210
+ except Exception:
211
+ try:
212
+ nltk.download('punkt', quiet=True)
213
+ tokens = word_tokenize(text, language='english')
214
+ except Exception:
215
+ tokens = text.split()
216
  stemmer = SnowballStemmer('russian')
217
  return [stemmer.stem(token) for token in tokens if token.isalpha()]
218
 
 
223
 
224
  def _tokenize_with_pymorphy(self, text: str) -> List[str]:
225
  """Токенизация с применением лемматизации PyMorphy2."""
226
+ import nltk
227
+ try:
228
+ tokens = word_tokenize(text, language='russian')
229
+ except LookupError:
230
+ try:
231
+ nltk.download('punkt_tab', quiet=True)
232
+ tokens = word_tokenize(text, language='russian')
233
+ except Exception:
234
+ try:
235
+ nltk.download('punkt', quiet=True)
236
+ tokens = word_tokenize(text, language='english')
237
+ except Exception:
238
+ tokens = text.split()
239
  lemmas = []
240
  for token in tokens:
241
  if token.isalpha():