Найти Ρ‚Π΅ΠΌΡƒ
10,1 тыс подписчиков

πŸ–₯ DeepPavlov Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ» для Π·Π°Π΄Π°Ρ‡ΠΈ NLP Π½Π° Python


Π£ мСня Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° тСкста постов Π½Π° habr.com. Π Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ, которая позволяСт Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ тСкстС ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ Π½Π° вопросы (Context Question Answering, Π΄Π°Π»Π΅Π΅ CQA).

Π’ процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°Ρ‡ΠΈ оказался ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ сСрвис HuggingFace, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠΉ мноТСство ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄ΠΎΠ±ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… NLP ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. Однако, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ тСкста Π½Π° русском языкС ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΠΎΡ‚Π΄Π°Π½ΠΎ российскому инструмСнту DeepPavlov, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌΡƒΡΡ Π½Π° Π·Π°Π΄Π°Ρ‡Π°Ρ… NLP. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ DeepPavlov позволяСт Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с NLP-модСлями, прСдставлСнными Π½Π° HuggingFace Β«ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈΒ».

Разобью Π·Π°Π΄Π°Ρ‡Ρƒ Π½Π° Ρ‚Ρ€ΠΈ этапа:

Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ тСкст поста с habr.com.
ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ вопросов ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ².
ΠΠ°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ deepPavlov для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ CQA.
Для получСния тСкста постов с habr.com Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ urllib для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ html-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° с сайта ΠΈ bs4 для доступа ΠΊ элСмСнтам. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° urllib Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав прСдустановлСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ языка Python, Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ bs4 ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

pip install beautifulsoup4
Код для получСния тСкста ΠΏΠΎ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ url ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ getHtmlDocument ΠΈ getTextFromHtml:

from urllib import request
def getHtmlDocument(url):
""" ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ html-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ с сайта ΠΏΠΎ url. """
fp = request.urlopen(url)
mybytes = fp.read()
fp.close()
return mybytes.decode('utf8')
from bs4 import BeautifulSoup
def getTextFromHtml(HtmlDocument):
""" ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ тСкст ΠΈΠ· html-Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. """
soup = BeautifulSoup(HtmlDocument,
features='html.parser')
content = soup.find('div', {'id': 'post-content-body'})
return content.text

Набор вопросов ΠΈΠ· ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

questions = (
'О Ρ‡Ρ‘ΠΌ пост?',
'Какая Ρ†Π΅Π»ΡŒ поста?',
'Какая Π·Π°Π΄Π°Ρ‡Π° Ρ€Π΅ΡˆΠ°Π»Π°ΡΡŒ?',
'Π§Ρ‚ΠΎ использовалось Π² Ρ€Π°Π±ΠΎΡ‚Π΅?',
'КакиС Π²Ρ‹Π²ΠΎΠ΄Ρ‹?',
'Π§Ρ‚ΠΎ использовалось?',
'КакиС Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ использовались?',
'Какой язык программирования использовали?',
'Π’ Ρ‡Ρ‘ΠΌ отличия?',
'Π§Ρ‚ΠΎ особСнного ΠΏΡ€ΠΎΡΠ²ΠΈΠ»ΠΎΡΡŒ?',
'Какова ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния?',
'Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ?',
'Каков Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚?',
'Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΎ Π² Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ?',
)
Π”Π°Π»Π΅Π΅ ΠΏΠ΅Ρ€Π΅ΠΉΠ΄Ρƒ ΠΊ настройкС deepPavlov для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π·Π°Π΄Π°Ρ‡ΠΈ Π‘QA. Π£ΡΡ‚Π°Π½ΠΎΠ²Π»ΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ deeppavlov Π² соотвСтствии с ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ сайтом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

pip install deeppavlov, transformers

Π˜ΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ configs ΠΈ build_model с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄:

from deeppavlov import configs, build_model

Π”Π°Π»Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΌΠΎΠ΄Π΅Π»ΠΈ squad_ru_bert ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:

model = build_model('squad_ru_bert', download=True)
МодСль squad_ru_bert β€” это модСль Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ обучСния Π½Π° основС Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ BERT, обучСнная Π½Π° Π½Π°Π±ΠΎΡ€Π΅ Π΄Π°Π½Π½Ρ‹Ρ… SQuAD-Ru, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит ΠΏΠ°Ρ€Ρ‹ вопрос-ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° русском языкС.

Π’Ρ‹Π±Π΅Ρ€Ρƒ посты с habr.com:

paper_urls = (
'https://habr.com/ru/articles/339914/',
'https://habr.com/ru/articles/339915/',
'https://habr.com/ru/articles/339916/',
)
ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ модСлью squad_ru_bert для построСния ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² Π½Π° ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ вопросы (questions) для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ поста ΠΈΠ· списка paper_urls:

for url in paper_urls:
content = getTextFromHtml(getHtmlDocument(url))
for q in questions:
answer = model([content], [q])
if abs(answer[2] – 1) > 1e-6:
print(q, ' ', answer[0])

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΌΠΎΠ΄Π΅Π»ΠΈ являСтся:

β€” Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ тСкста, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠΌ Π½Π° Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ вопрос Π½Π° основании тСкста,

β€” позиция этого ΠΎΡ‚Π²Π΅Ρ‚Π° Π² тСкстС ΠΈ качСство ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Β«ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ…Β» ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ², ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, Π½Π° вопросы ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½Ρ‹ Π·Π΅Π»Ρ‘Π½Ρ‹ΠΌ Ρ†Π²Π΅Ρ‚ΠΎΠΌ Π½Π° рисунках 1-3.


2 ΠΌΠΈΠ½ΡƒΡ‚Ρ‹