-
Notifications
You must be signed in to change notification settings - Fork 49
/
rus_preprocessing_mystem.py
63 lines (52 loc) · 2.79 KB
/
rus_preprocessing_mystem.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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#!/usr/bin/env python
# coding: utf-8
import sys
import requests
from pymystem3 import Mystem
'''
Этот скрипт принимает на вход необработанный русский текст
(одно предложение на строку или один абзац на строку).
Он токенизируется, лемматизируется и размечается по частям речи с использованием Mystem.
На выход подаётся последовательность разделенных пробелами лемм с частями речи
("зеленый_NOUN трамвай_NOUN").
Их можно непосредственно использовать в моделях с RusVectōrēs (https://rusvectores.org).
Примеры запуска:
echo 'Мама мыла раму.' | python3 rus_preprocessing_mystem.py
zcat large_corpus.txt.gz | python3 rus_preprocessing_mystem.py | gzip > processed_corpus.txt.gz
'''
def tag_mystem(text='Текст нужно передать функции в виде строки!', mapping=None, postags=True):
# если частеречные тэги не нужны (например, их нет в модели), выставьте postags=False
# в этом случае на выход будут поданы только леммы
processed = m.analyze(text)
tagged = []
for w in processed:
try:
lemma = w["analysis"][0]["lex"].lower().strip()
pos = w["analysis"][0]["gr"].split(',')[0]
pos = pos.split('=')[0].strip()
if mapping:
if pos in mapping:
pos = mapping[pos] # здесь мы конвертируем тэги
else:
pos = 'X' # на случай, если попадется тэг, которого нет в маппинге
tagged.append(lemma.lower() + '_' + pos)
except KeyError:
continue # я здесь пропускаю знаки препинания, но вы можете поступить по-другому
if not postags:
tagged = [t.split('_')[0] for t in tagged]
return tagged
# Таблица преобразования частеречных тэгов Mystem в тэги UPoS:
mapping_url = 'https://raw.githubusercontent.com/akutuzov/universal-pos-tags/master/ru-rnc.map'
mystem2upos = {}
r = requests.get(mapping_url, stream=True)
for pair in r.text.split('\n'):
pair = pair.split()
if len(pair) > 1:
mystem2upos[pair[0]] = pair[1]
print('Loading the model...', file=sys.stderr)
m = Mystem()
print('Processing input...', file=sys.stderr)
for line in sys.stdin:
res = line.strip()
output = tag_mystem(text=res, mapping=mystem2upos)
print(' '.join(output))