Определение падежа в предложении с помощью python
Здравствуйте дорогие программисты, я знаю звучит странно, но мне нужно определить падеж в предложении (русского языка).
Например: У него проблемы - Именительный. Актуальность проблемы - Родительный. Он не рад проблеме - Дательный
Я пробовал сайт со склонением и описанием слов https://ru.wiktionary.org/
Update: denisnumb а можно каким либо образом сделать так, что существительное в предложении заменялось на его синоним сохраняя падеж. По моему примеру находим синоним и заменяем по вашему примеру.
Я написал лишь парсер который определяет синонимы слов и склоняет по падежам слово:
import requests
from bs4 import BeautifulSoup
s = "проблемы".lower()
word_s = requests.get("https://ru.wiktionary.org/w/index.php", {"search": s})
word = BeautifulSoup(word_s.text, 'lxml')
quote = word.find('span', class_="mw-headline", id="Синонимы")
print(quote.next.next.next.text)
print(quote.next.next.next.a.get("href"))
quote1 = word.find('table', class_="morfotable ru")
cases = quote1.tbody.find_all("tr")
case_l = []
for case in cases:
_ = []
for i in case.find_all("td"):
a = i.text.replace("́", "").replace("\n", "") # Здесь убирается ударение, символ ударения сюда не скопировался.
_.append(a)
if a == s:
print(_[0], a)
case_l.append(_)
print(case_l)
Ответы (1 шт):
Попробуйте pymorphy2:
pip install pymorphy2
Документация здесь
Допустим, есть текст, в котором нужно определить падежи существительных:
text = 'Актуальность проблем, связанных с изучением значения конфликтов в жизни общества и управлением конфликтами, является на сегодняшний день очевидной и относимой к числу приоритетных.'
Создадим список, который в виде словаря (dict) будет хранить отдельные слова предложения, а также информацию об их падеже и части речи
import pymorphy2
morph = pymorphy2.MorphAnalyzer()
text = 'Актуальность проблем, связанных с изучением значения конфликтов в жизни общества и управлением конфликтами, является на сегодняшний день очевидной и относимой к числу приоритетных.'
text_words = []
# здесь мы создаем список отдельных слов предложения и убираем лишние символы (знаки препинания), оставляя только буквы
for word in [''.join([letter for letter in word if letter.isalpha()]) for word in text.split()]:
word_info = morph.parse(word)[0]
text_words.append(
{
'word': word,
'case': word_info.tag.case,
'POS': word_info.tag.POS
})
Теперь выведем результат
for word in text_words:
print(word)
Вывод:
{'word': 'Актуальность', 'case': 'accs', 'POS': 'NOUN'}
{'word': 'проблем', 'case': 'gent', 'POS': 'NOUN'}
{'word': 'связанных', 'case': 'gent', 'POS': 'ADJF'}
{'word': 'с', 'case': None, 'POS': 'PREP'}
{'word': 'изучением', 'case': 'ablt', 'POS': 'NOUN'}
{'word': 'значения', 'case': 'gent', 'POS': 'NOUN'}
{'word': 'конфликтов', 'case': 'gent', 'POS': 'NOUN'}
{'word': 'в', 'case': None, 'POS': 'PREP'}
{'word': 'жизни', 'case': 'gent', 'POS': 'NOUN'}
{'word': 'общества', 'case': 'gent', 'POS': 'NOUN'}
{'word': 'и', 'case': None, 'POS': 'CONJ'}
{'word': 'управлением', 'case': 'ablt', 'POS': 'NOUN'}
{'word': 'конфликтами', 'case': 'ablt', 'POS': 'NOUN'}
{'word': 'является', 'case': None, 'POS': 'VERB'}
{'word': 'на', 'case': None, 'POS': 'PREP'}
{'word': 'сегодняшний', 'case': 'accs', 'POS': 'ADJF'}
{'word': 'день', 'case': 'accs', 'POS': 'NOUN'}
{'word': 'очевидной', 'case': 'ablt', 'POS': 'ADJF'}
{'word': 'и', 'case': None, 'POS': 'CONJ'}
{'word': 'относимой', 'case': 'gent', 'POS': 'PRTF'}
{'word': 'к', 'case': None, 'POS': 'PREP'}
{'word': 'числу', 'case': 'datv', 'POS': 'NOUN'}
{'word': 'приоритетных', 'case': 'gent', 'POS': 'ADJF'}
Из таблицы, представленной в документации смотрим обозначения падежей (case) и частей речи (POS - Part of speech). Например, NOUN - существительное, gent - родительный падеж
Далее, вашим методом получаем синонимы для нужных слов (часть речи и падеж каждого отдельного слова вы уже знаете) и заменяем в тексте указанное слово на новое через
text = text.replace(old_word, new_word)
Если синоним стоит не в том падеже, в котором было исходное слово, через ту же библиотеку его можно поставить в нужный падеж:
# ставим слово "изучение" в родительный падеж (gent)
morph.parse('изучение')[0].inflect({'gent'}).word
Вывод:
изучения