Spaces:
Runtime error
Runtime error
''' | |
Методы преобразования слов для аннотаций | |
''' | |
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) |