-
Notifications
You must be signed in to change notification settings - Fork 38
/
Copy pathtext_tools.py
48 lines (32 loc) · 2.11 KB
/
text_tools.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import pymorphy2
import string
def _clean_word(word):
word = word.replace('«', '').replace('»', '').replace('…', '')
# FIXME какие еще знаки пунктуации часто встречаются ?
word = word.strip(string.punctuation)
return word
def split_by_words(morph, text):
"""Учитывает знаки пунктуации, регистр и словоформы, выкидывает предлоги."""
words = []
for word in text.split():
cleaned_word = _clean_word(word)
normalized_word = morph.parse(cleaned_word)[0].normal_form
if len(normalized_word) > 2 or normalized_word == 'не':
words.append(normalized_word)
return words
def test_split_by_words():
# Экземпляры MorphAnalyzer занимают 10-15Мб RAM т.к. загружают в память много данных
# Старайтесь организовать свой код так, чтоб создавать экземпляр MorphAnalyzer заранее и в единственном числе
morph = pymorphy2.MorphAnalyzer()
assert split_by_words(morph, 'Во-первых, он хочет, чтобы') == ['во-первых', 'хотеть', 'чтобы']
assert split_by_words(morph, '«Удивительно, но это стало началом!»') == ['удивительно', 'это', 'стать', 'начало']
def calculate_jaundice_rate(article_words, charged_words):
"""Расчитывает желтушность текста, принимает список "заряженных" слов и ищет их внутри article_words."""
if not article_words:
return 0.0
found_charged_words = [word for word in article_words if word in set(charged_words)]
score = len(found_charged_words) / len(article_words) * 100
return round(score, 2)
def test_calculate_jaundice_rate():
assert -0.01 < calculate_jaundice_rate([], []) < 0.01
assert 33.0 < calculate_jaundice_rate(['все', 'аутсайдер', 'побег'], ['аутсайдер', 'банкротство']) < 34.0