10,1 ΡΡΡ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠΈΠΊΠΎΠ²
π₯ DeepPavlov Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ» Π΄Π»Ρ Π·Π°Π΄Π°ΡΠΈ NLP Π½Π° Python
Π£ ΠΌΠ΅Π½Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΠ΅ΠΊΡΡΠ° ΠΏΠΎΡΡΠΎΠ² Π½Π° habr.com. Π Π°ΡΡΠΌΠΎΡΡΡ Π·Π°Π΄Π°ΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΡΠ΅ΠΊΡΡΠ΅ ΠΎΡΠ²Π΅ΡΡ Π½Π° Π²ΠΎΠΏΡΠΎΡΡ (Context Question Answering, Π΄Π°Π»Π΅Π΅ CQA).
Π ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Π½Π°Π΄ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ Π·Π°Π΄Π°ΡΠΈ ΠΎΠΊΠ°Π·Π°Π»ΡΡ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΌ ΡΠ΅ΡΠ²ΠΈΡ HuggingFace, ΠΏΡΠ΅Π΄Π»Π°Π³Π°ΡΡΠΈΠΉ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΌΡΠ»ΡΡΠΈΡΠ·ΡΡΠ½ΡΡ
ΠΏΠ΅ΡΠ΅Π΄ΠΎΠ±ΡΡΠ΅Π½Π½ΡΡ
NLP ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠ΅Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΎΡΠ΄Π°Π½ΠΎ ΡΠΎΡΡΠΈΠΉΡΠΊΠΎΠΌΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ DeepPavlov, ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΡΡΠ΅ΠΌΡΡΡ Π½Π° Π·Π°Π΄Π°ΡΠ°Ρ
NLP. Π’Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, ΡΡΠΎ DeepPavlov ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ NLP-ΠΌΠΎΠ΄Π΅Π»ΡΠΌΠΈ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΡΠΌΠΈ Π½Π° HuggingFace Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ».
Π Π°Π·ΠΎΠ±ΡΡ Π·Π°Π΄Π°ΡΡ Π½Π° ΡΡΠΈ ΡΡΠ°ΠΏΠ°:
ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΈΡΡ Π½Π°Π±ΠΎΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ² ΠΈΠ· ΠΎΡΠ²Π΅ΡΠΎΠ².
ΠΠ°ΡΡΡΠΎΠΈΡΡ 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, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠ°ΡΡ Π²ΠΎΠΏΡΠΎΡ-ΠΎΡΠ²Π΅Ρ Π½Π° ΡΡΡΡΠΊΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
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 ΠΌΠΈΠ½ΡΡΡ
22Β ΠΈΡΠ½ΡΒ 2023