annotator_demo / word_transformations.py
senyukhin's picture
Upload 11 files
a8dc9d8
'''
Методы преобразования слов для аннотаций
'''
import pymorphy2
from collections import Counter
morph = pymorphy2.MorphAnalyzer()
# Определение пола автора по тексту
def get_gender(tokens):
'''
Определение пола автора по тексту
Возвращает ``Fem`` — женский род, ``Masc`` — мужской род.
'''
gender = []
for i in [token for sent in tokens for token in sent]:
for token in i:
if token.feats.get('Gender') and token.pos == 'VERB':
gender.append(token.feats.get('Gender'))
return Counter(gender).most_common(1)[0][0]
def inflector(word, case):
'''
Склонение существительных по падежам.
word : существительное
case : падеж
`nomn` – именительный
`gent` — родительны
`datv` — дательный
`accs` — винительный
`ablt` — творительный
`loct` — предложный
'''
return morph.parse(word)[0].inflect({case}).word
def gender_transformer(verb, gender):
'''
Преобразование глагола в нужный род прошедшего времени
'''
# Преобразование формата рода Natasha к pymorphy2
if gender == 'Fem' : gender = 'femn'
else: gender = 'masc'
# Если автор пишет о себе в первом лице "Я пишу..."
# if {'1per'} in morph.parse(verb)[0].tag:
for w in morph.parse(verb)[0].lexeme:
if {gender, 'past', 'VERB'} in w.tag:
return w.word
def get_pronoun(gender):
if gender == 'Fem': return 'она'
else: return 'он'
def get_noun(gender):
if gender == 'Fem': return 'авторка'
else: return 'автор'
def get_fact_to_annotation(fact, gender, most_mentioned_word):
'''
Проверяет, нужно ли взять факт в аннотацию
Пока работает, если глагол в нужном лице и роде и не упоминается распространённое место.
'''
if gender == 'Fem' : gender = 'femn'
else: gender = 'masc'
flag = False
for word in fact.split(' '):
for form in morph.parse(word):
# Если глагол прошедшего времени
if {gender, 'VERB'} in form.tag:
flag = True
# Если глагол от "первого лица"
if {'1per', 'sing', 'VERB'} in form.tag:
flag = True
if form.normal_form in most_mentioned_word:
return False
if form.normal_form in ['она', 'он']:
return False
return flag
def transform_fact(tokens, fact, gender):
'''
Если факт написан в первом лице, то трансформирует его в третье лицо.
На вход поступает столбец с записями фактов — там есть токены
'''
facts = [(fact_string[1], fact_string[2]) for entry in tokens for fact_string in entry]
for f in facts:
if f[0] == fact:
fact = fact.split(' ')
delete_index = None
for i in range(0, len(fact)):
# глагол в первом лице
if (f[1][i][0] == 'VERB') and (f[1][i][1].get('Person') == '1'):
replaced_verb = gender_transformer(fact[i], gender)
del fact[i]
fact.insert(i, replaced_verb)
if fact[i].lower() == 'я':
delete_index = i
if delete_index != None:
del fact[delete_index]
return ' '.join(fact)