Hackathon DevDays'19 (Rhan 2): Parser Neges Llais ar gyfer Telegram a Gwiriwr Gramadeg yn IntelliJ IDEA

Rydym yn parhau i siarad am brosiectau hacathon y gwanwyn DevDays, y cymerodd myfyrwyr y rhaglen feistr ran ynddynt "Datblygu Meddalwedd / Peirianneg Meddalwedd".

Hackathon DevDays'19 (rhan 2): parser neges sain ar gyfer Telegram a gwirio gramadeg yn IntelliJ IDEA

Gyda llaw, hoffem wahodd darllenwyr i ymuno VK-grŵp o fyfyrwyr meistr. Ynddo byddwn yn cyhoeddi'r newyddion diweddaraf am recriwtio ac astudio. Mae fideo o'r diwrnod agored hefyd i'w weld yn y grŵp. Rydym yn eich atgoffa: bydd y digwyddiad yn cael ei gynnal ar Ebrill 29, manylion ar-lein.

Parser Neges Llais Bwrdd Gwaith Telegram

Hackathon DevDays'19 (rhan 2): parser neges sain ar gyfer Telegram a gwirio gramadeg yn IntelliJ IDEA

Awdur y syniad
Khoroshev Artyom

Llinell-up

Khoroshev Artem – rheolwr prosiect/datblygwr/SA
Eliseev Anton – dadansoddwr busnes/arbenigwr marchnata
Maria Kuklina - dylunydd/datblygwr UI
Bakhvalov Pavel - dylunydd UI / datblygwr / SA

O'n safbwynt ni, mae Telegram yn negesydd modern a chyfleus, ac mae ei fersiwn PC yn boblogaidd ac yn ffynhonnell agored, sy'n ei gwneud hi'n bosibl ei addasu. Mae'r cleient yn cynnig ymarferoldeb eithaf cyfoethog. Yn ogystal â negeseuon testun safonol, mae'n cynnwys galwadau llais, negeseuon fideo, a negeseuon llais. A'r olaf sydd weithiau yn dwyn anghyfleusdra i'w derbyniwr. Yn aml nid yw'n bosibl gwrando ar neges llais tra wrth gyfrifiadur neu liniadur. Efallai bod sŵn amgylchynol, diffyg clustffonau, neu nad ydych chi am i unrhyw un glywed cynnwys y neges. Nid yw problemau o'r fath bron byth yn codi os ydych chi'n defnyddio Telegram ar ffôn clyfar, oherwydd yn syml gallwch chi ddod ag ef i'ch clust, yn wahanol i liniadur neu gyfrifiadur personol. Rydym yn ceisio datrys y broblem hon.

Nod ein prosiect yn DevDays oedd ychwanegu'r gallu i gyfieithu negeseuon llais a dderbyniwyd yn destun i'r cleient bwrdd gwaith Telegram (y cyfeirir ato o hyn ymlaen fel Telegram Desktop).

Mae pob analog ar hyn o bryd yn fot y gallwch anfon neges sain iddynt a derbyn neges destun mewn ymateb. Nid ydym yn hapus iawn â hyn: nid yw anfon neges ymlaen at bot yn gyfleus iawn; hoffem gael swyddogaethau brodorol. Yn ogystal, mae unrhyw bot yn drydydd parti sy'n gweithredu fel cyfryngwr rhwng yr API adnabod lleferydd a'r defnyddiwr, ac mae hyn, o leiaf, yn anniogel.

Fel y nodwyd yn gynharach, mae gan telegram-bwrdd gwaith ddwy fantais sylweddol: rhwyddineb a chyflymder gweithredu. Ac nid yw hyn yn gyd-ddigwyddiad, oherwydd mae wedi'i ysgrifennu'n gyfan gwbl yn C ++. Ac ers i ni benderfynu ychwanegu ymarferoldeb newydd yn uniongyrchol i'r cleient, roedd yn rhaid i ni ei ddatblygu yn C ++.

Hackathon DevDays'19 (rhan 2): parser neges sain ar gyfer Telegram a gwirio gramadeg yn IntelliJ IDEARoedd 4 o bobl yn ein tîm. I ddechrau, roedd dau berson yn chwilio am lyfrgell addas ar gyfer adnabod lleferydd, roedd un person yn astudio cod ffynhonnell Telegram-desktop, roedd un arall yn defnyddio'r prosiect adeiladu Nesaf Telegram. Yn ddiweddarach, roedd pawb yn brysur yn trwsio'r UI a dadfygio.

Roedd yn ymddangos na fyddai'n anodd gweithredu'r swyddogaethau a fwriadwyd, ond, fel sy'n digwydd bob amser, cododd anawsterau.

Roedd yr ateb i'r broblem yn cynnwys dwy is-dasg annibynnol: dewis offeryn adnabod lleferydd addas a gweithredu UI ar gyfer swyddogaethau newydd.

Wrth ddewis llyfrgell ar gyfer adnabod llais, bu'n rhaid i ni roi'r gorau i bob API all-lein ar unwaith, oherwydd mae modelau iaith yn cymryd llawer o le. Ond dim ond un iaith yr ydym yn sôn. Daeth yn amlwg y byddai'n rhaid i ni ddefnyddio'r API ar-lein. Yn ddiweddarach daeth i'r amlwg nad yw gwasanaethau adnabod lleferydd cewri fel Google, Yandex a Microsoft yn rhad ac am ddim o gwbl, a bydd yn rhaid i ni fod yn fodlon â chyfnod prawf. O ganlyniad, dewiswyd Google Speech-To-Text oherwydd ei fod yn caniatáu ichi gael tocyn ar gyfer defnyddio'r gwasanaeth, a fydd yn para am flwyddyn gyfan.

Mae'r ail broblem y daethom ar ei thraws yn ymwneud â rhai o ddiffygion C++ - sw o amrywiol lyfrgelloedd yn absenoldeb ystorfa ganolog. Mae'n digwydd felly bod Telegram Desktop yn dibynnu ar lawer o lyfrgelloedd fersiwn-benodol eraill. Mae gan yr ystorfa swyddogol cyfarwyddyd ar gyfer cydosod y prosiect. A hefyd nifer fawr o faterion agored am broblemau adeiladu, er enghraifft amser и два. Daeth yr holl broblemau i fod yn gysylltiedig â'r ffaith bod y sgript adeiladu wedi'i ysgrifennu ar gyfer Ubuntu 14.04, ac er mwyn adeiladu telegram yn llwyddiannus o dan Ubuntu 18.04, roedd yn rhaid gwneud newidiadau.

Mae Telegram Desktop ei hun yn cymryd amser eithaf hir i'w ymgynnull: ar liniadur gyda Intel Core i5-7200U, mae cynulliad cyflawn (baner -j 4) gyda phob dibyniaeth yn cymryd tua thair awr. O'r rhain, cymerir tua 30 munud trwy gysylltu'r cleient ei hun (yn ddiweddarach, yn y ffurfweddiad Debug, mae cysylltu yn cymryd tua 10 munud), ond mae'n rhaid ailadrodd y cam cysylltu bob tro ar ôl gwneud newidiadau.

Er gwaethaf y problemau, fe wnaethom lwyddo i weithredu'r syniad a luniwyd, yn ogystal â'r diweddariad adeiladu sgript ar gyfer Ubuntu 18.04. Mae arddangosiad o'r gwaith i'w weld yn cyswllt. Rydym hefyd yn cynnwys sawl animeiddiad. Mae botwm wedi ymddangos wrth ymyl pob neges llais, sy'n eich galluogi i gyfieithu'r neges yn destun. Trwy dde-glicio, gallwch hefyd nodi'r iaith a ddefnyddir ar gyfer darlledu. Gan cyswllt cleient ar gael i'w lawrlwytho.

Ystorfa.

Yn ein barn ni, daeth yn Brawf Cysyniad da o ymarferoldeb a fyddai'n gyfleus i lawer o ddefnyddwyr. Gobeithiwn ei weld mewn datganiadau Telegram Desktop yn y dyfodol.

Gwell Cefnogaeth Iaith Naturiol yn IntelliJ IDEA

Hackathon DevDays'19 (rhan 2): parser neges sain ar gyfer Telegram a gwirio gramadeg yn IntelliJ IDEA

Awdur y syniad

Vladislav Tankov

Llinell-up

Tankov Vladislav (arweinydd tîm, yn gweithio gyda LanguageTool ac IntelliJ IDEA)
Nikita Sokolov (yn gweithio gyda LanguageTool a chreu UI)
Khvorov Alexander (gweithio gyda LanguageTool ac optimeiddio perfformiad)
Sadovnikov Alexander (cefnogaeth ar gyfer dosrannu ieithoedd marcio a chod)

Rydym wedi datblygu ategyn ar gyfer IntelliJ IDEA sy'n gwirio testunau amrywiol (sylwadau a dogfennaeth, llinellau llythrennol mewn cod, testun wedi'i fformatio yn Markdown neu XML markup) ar gyfer cywirdeb gramadegol, sillafu ac arddull (yn Saesneg gelwir hyn yn brawfddarllen).

Syniad y prosiect oedd ehangu'r gwirydd sillafu safonol IntelliJ IDEA i raddfa Gramadeg, i wneud rhyw fath o Gramadeg y tu mewn i IDE.

Gallwch weld beth ddigwyddodd по ссылке.

Wel, isod byddwn yn siarad yn fwy manwl am alluoedd yr ategyn, yn ogystal â'r anawsterau a gododd wrth ei greu.

Cymhelliant

Mae yna lawer o gynhyrchion wedi'u cynllunio ar gyfer ysgrifennu testun mewn ieithoedd naturiol, ond mae dogfennaeth a sylwadau cod yn cael eu hysgrifennu amlaf mewn amgylcheddau datblygu. Ar yr un pryd, mae DRhA yn gwneud gwaith ardderchog o ddod o hyd i wallau mewn cod, ond nid ydynt yn addas iawn ar gyfer testunau mewn ieithoedd naturiol. Mae hyn yn ei gwneud hi'n hawdd iawn gwneud camgymeriadau mewn gramadeg, atalnodi neu arddull heb i'r amgylchedd datblygu eu nodi. Mae'n hollbwysig gwneud camgymeriad wrth ysgrifennu'r rhyngwyneb defnyddiwr, gan y bydd hyn yn effeithio nid yn unig ar ddealladwyaeth y cod, ond hefyd ar ddefnyddwyr y rhaglen ddatblygedig eu hunain.

Un o'r amgylcheddau datblygu mwyaf poblogaidd a datblygedig yw IntelliJ IDEA, yn ogystal â IDEs yn seiliedig ar y Platfform IntelliJ. Mae gan IntelliJ Platform wiriwr sillafu adeiledig yn barod, ond nid yw'n cael gwared ar hyd yn oed y gwallau gramadegol symlaf. Fe benderfynon ni integreiddio un o'r systemau dadansoddi iaith naturiol poblogaidd i IntelliJ IDEA.

Gweithredu

Hackathon DevDays'19 (rhan 2): parser neges sain ar gyfer Telegram a gwirio gramadeg yn IntelliJ IDEANi wnaethom osod y dasg o greu ein system dilysu testun ein hunain, felly fe wnaethom ddefnyddio datrysiad a oedd yn bodoli eisoes. Trodd allan i fod yr opsiwn mwyaf addas Offeryn Iaith. Roedd y drwydded yn caniatáu inni ei defnyddio'n rhydd at ein dibenion: mae'n rhad ac am ddim, wedi'i hysgrifennu mewn Java ac yn ffynhonnell agored. Yn ogystal, mae'n cefnogi 25 o ieithoedd ac mae wedi bod yn cael ei datblygu ers mwy na phymtheg mlynedd. Er ei fod yn agored, mae LanguageTool yn gystadleuydd difrifol i atebion dilysu testun taledig, a'r ffaith y gall weithio'n lleol yw ei nodwedd laddol yn llythrennol.

Mae'r cod ategyn i mewn storfeydd ar GitHub. Ysgrifennwyd y prosiect cyfan yn Kotlin gydag ychwanegiad bach o Java ar gyfer yr UI. Yn ystod yr hacathon, fe wnaethom lwyddo i weithredu cefnogaeth ar gyfer Markdown, JavaDoc, HTML a Plain Text. Ar ôl yr hacathon, ychwanegodd diweddariad mawr gefnogaeth i XML, llythrennau llinynnol yn Java, Kotlin a Python, a gwirio sillafu.

Anawsterau

Yn eithaf cyflym sylweddolom, os ydym yn bwydo'r holl destun i LanguageTool i'w archwilio bob tro, yna bydd y rhyngwyneb IDEA yn rhewi ar unrhyw destun mwy neu lai difrifol, gan fod yr arolygiad ei hun yn rhwystro'r llif UI. Datryswyd y broblem trwy'r gwiriad `ProgressManager.checkCancelled` - mae'r swyddogaeth hon yn taflu eithriad os yw IDEA yn credu ei bod yn bryd erthylu'r arolygiad.

Roedd hyn yn dileu'r rhewiadau yn llwyr, ond mae'n amhosibl ei ddefnyddio: mae'r testun yn cymryd amser hir iawn i'w brosesu. Ar ben hynny, yn ein hachos ni, yn fwyaf aml mae rhan fach iawn o'r testun yn newid ac rydym am storio'r canlyniadau rywsut. Dyna'n union a wnaethom. Er mwyn peidio â gwirio popeth bob tro, fe wnaethom rannu'r testun yn ddarnau yn bendant a gwirio dim ond y rhai a oedd wedi newid. Gan y gall y testunau fod yn fawr ac nad oeddem am lwytho'r storfa, gwnaethom storio nid y testunau eu hunain, ond eu hashes. Roedd hyn yn caniatáu i'r ategyn weithredu'n esmwyth hyd yn oed ar ffeiliau mawr.

Mae LanguageTool yn cefnogi mwy na 25 o ieithoedd, ond mae'n annhebygol bod unrhyw un defnyddiwr eu hangen i gyd. Roeddwn i eisiau rhoi'r cyfle i lawrlwytho llyfrgelloedd ar gyfer iaith benodol ar gais (os ydych chi'n ei dicio yn yr UI). Fe wnaethom hyd yn oed roi hyn ar waith, ond roedd yn rhy gymhleth ac annibynadwy. Yn benodol, bu’n rhaid i ni lwytho LanguageTool gyda set newydd o ieithoedd gan ddefnyddio llwythwr dosbarth ar wahân, ac yna ei gychwyn yn ofalus. Ar yr un pryd, roedd yr holl lyfrgelloedd mewn ystorfa defnyddiwr .m2, ac ar bob cychwyn roedd yn rhaid i ni wirio eu cywirdeb. Yn y diwedd, fe wnaethom benderfynu pe bai defnyddwyr yn cael problemau gyda maint yr ategyn, yna byddem yn darparu ategyn ar wahân ar gyfer sawl un o'r ieithoedd mwyaf poblogaidd.

Ar ôl yr hacathon

Daeth yr hacathon i ben, ond parhaodd y gwaith ar yr ategyn gyda thîm culach. Roeddwn i eisiau cefnogi llinynnau, sylwadau, a hyd yn oed lluniadau iaith fel enwau newidiol ac enwau dosbarth. Ar hyn o bryd dim ond ar gyfer Java, Kotlin a Python y cefnogir hyn, ond gobeithiwn y bydd y rhestr hon yn tyfu. Rydyn ni wedi trwsio llawer o fygiau bach ac wedi dod yn fwy cydnaws â gwiriwr sillafu adeiledig Syniad. Yn ogystal, mae cefnogaeth XML a gwirio sillafu wedi ymddangos. Mae hyn i gyd i'w weld yn yr ail fersiwn, a gyhoeddwyd gennym yn ddiweddar.

Beth sydd nesaf?

Gall ategyn o'r fath fod yn ddefnyddiol nid yn unig i ddatblygwyr, ond hefyd i awduron technegol (yn aml yn gweithio, er enghraifft, gyda XML mewn IDE). Bob dydd mae'n rhaid iddynt weithio gydag iaith naturiol, heb gael cynorthwyydd ar ffurf awgrymiadau golygydd am wallau posibl. Mae ein ategyn yn darparu awgrymiadau o'r fath ac yn ei wneud gyda lefel uchel o gywirdeb.
Rydyn ni'n bwriadu datblygu'r ategyn, trwy ychwanegu ieithoedd newydd a thrwy archwilio dull cyffredinol o drefnu gwirio testun. Mae ein cynlluniau uniongyrchol yn cynnwys gweithredu proffiliau arddull (setiau o reolau sy'n diffinio canllaw arddull ar gyfer testun, er enghraifft, "peidiwch ag ysgrifennu e.e., ond ysgrifennwch y ffurflen lawn"), ehangu'r geiriadur a gwella'r rhyngwyneb defnyddiwr (yn benodol, rydym am roi cyfle i'r defnyddiwr nid yn unig anwybyddu gair, ond ei ychwanegu at y geiriadur, gan nodi'r rhan o lefaru).

Ffynhonnell: www.habr.com

Ychwanegu sylw