estnltk / estnltk

Open source tools for Estonian natural language processing
GNU General Public License v2.0
114 stars 20 forks source link

Lemmatiseerimise patoloogilised juhud #55

Closed urdvr closed 8 years ago

urdvr commented 8 years ago

Lemmatiseerimine jääb ebamõistlikult pikaks ajaks jooksma (mul pole alust väita, et ebaõnnestub, aga ka mitte kannatust oodata, et töö lõppeks) näiteks järgmise reaalelulise teksti korral:

Hüpoteese:

• ajavahemikus tuvastamata aeg – 25.september 2003.a reprodutseeris levitamise eesmärgil domeeniga salusoft.dyn.ee seotud, tuvastamata serverisse arvutiõigusega kaitstud arvutiprogramme (samuti autoriõiguste kaitse meetmete eemaldamiseks mõeldud programme): 1) Keygen's for all Nero 6.x apps ( HOT! ) 2) Downloads since 10.sept.2003: 38984 3) WinRAR 3.20 Corp Edit (Regged) ( HOT! ) 4) Downloads since 10.sept.2003: 11798 5) Generic Crack For All Macromedia 2004 Apps by Paradox ( new ) 6) Norton Antivirus 2004 Keygen by TMG ( new ) 7) TotalRecorder 4.2 Pro Retail 8) Ashampoo WinOptimizer Platinum Suite v.1.00 + Crack ( new ) 9) DivX 5.1 Pro Bundle + Keygen ( new ) 10) Download Accelerator Plus v.7 + Crack ( new ) 11) FlashFXP 2.1.924 + Crack 12) ZoneAlarm Pro 4.0.146.029 + Keygen ( new ) 13) AdAware Pro 6.0.181 + Keygen 14) CloneCD 4.2.0.2 + Keygen 15) SiSoft Sandra 3Max! Retail 16) ABBYY_FineReaderPro_7_KG.rar 157 488 09.20.2003 08:07 PL 17) ACRONIS.TXT 30 09.01.2003 12:00 EL 18) AD-AWARE_6_PRO_EST_LANG.EXE 58 261 09.01.2003 12:00 EL 19) AD-AWARE_6_PRO_KEYGEN.EXE 52 224 09.01.2003 12:00 EL 20) ADOBE GOLIVE VERSION 6.0 ENGLISH - PATCH BY BIDJAN.RAR 2 719 476 09.01.2003 12:00 EL 21) ADOBE_ILLUSTRATOR_V10B76_CRACK.EXE 4 694 09.01.2003 12:00 EL 22) ANTIFIREWALL_V1.01.49.ZIP 589 288 09.01.2003 12:00 EL 23) ANTITROJAN_55_4xx_KEYGEN.EXE 9 648 09.01.2003 12:00 EL 24) BIRWCAM.EXE 76 800 09.01.2003 12:00 EL 25) BITTORRENT-3.2.1.EXE 2 680 761 09.01.2003 12:00 EL 26) BORLANDTURBOPASCAL_7.ZIP 2 017 205 09.01.2003 12:00 EL 27) bpftp_243.rar 0 09.24.2003 10:47 PL 28) CDRDIAGNOSTIC_1.7.2_RETAIL.EXE 1 107 319 09.01.2003 12:00 EL 29) CLONECD_4.2.0.2+KEYGEN.zip 9 231 09.01.2003 12:00 EL 30) CODECVIEWER .EXE 23 040 09.01.2003 12:00 EL 31) COOL_EDIT_PRO_V2.0_TRIAL_TO_FULL_VERSION_BY_BIDJAN.ZIP 1 162 253 09.01.2003 12:00 EL 32) CUTEFTP_PRO_AND_TRANSFER_ENGINE_V2+CRACK.ZIP 2 776 196 09.01.2003 12:00 EL 33) DAMN_NFO_VIEWER_V2.10.0031.RC3_SETUP.EXE 252 928 09.01.2003 12:00 EL 34) DFX FOR WINAMP KEYMAKER.EXE 15 872 09.01.2003 12:00 EL 35) DIGITALPATROL_4.0.65.EXE 4 094 272 09.01.2003 12:00 EL 36) DIRECTX-9.0-CONTROL-PANEL.ZIP 58 519 09.01.2003 12:00 EL 37) DISKSTATE_2.82_RETAIL.RAR 1 482 967 09.01.2003 12:00 EL 38) DISKVISION1190.EXE 583 559 09.01.2003 12:00 EL 39) DIVXREPAIR_BIN_V1.0.1.ZIP 427 297 09.01.2003 12:00 EL 40) DKCRACK.EXE 77 221 09.01.2003 12:00 EL 41) DVD_REGIONFREE_1.39+CRACK.ZIP 691 154 09.01.2003 12:00 EL 42) EASY_CD-DA_EXTRACTOR_506+KEYGEN.RAR 2 724 290 09.01.2003 12:00 EL 43) ES1938_1946_SE3047.ZIP 2 059 606 09.01.2003 12:00 EL 44) FFXP_CRACK.RAR 151 517 09.01.2003 12:00 EL 45) FILEEXT.EXE 651 886 09.01.2003 12:00 EL 46) FIRESTARTER_6_RETAIL.EXE 3 995 384 09.01.2003 12:00 EL 47) Fireworks_MX_crack.rar 52 866 09.01.2003 12:00 EL 48) FLASHFXP_SERIALS.TXT 1 214 09.01.2003 12:00 EL 49) HANSA.ZIP 1 481 002 09.01.2003 12:00 EL 50) HIEW_670.ZIP 580 599 09.01.2003 12:00 EL 51) HOLLYWOODFXPROV4.6.7.34.HTM 1 565 09.01.2003 12:00 EL 52) IEACCELERATOR.ZIP 658 015 09.01.2003 12:00 EL 53) IHATESPAM_OE.EXE 4 783 019 09.01.2003 12:00 EL 54) index.ht 3 994 09.21.2003 01:06 EL 55) INF-A212_CRK.ZIP 63 081 09.01.2003 12:00 EL 56) INVISIBLE_KEYLOGGER_KEYGEN.ZIP 28 238 09.01.2003 12:00 EL 57) ISOBUSTER_13.ZIP 2 350 023 09.01.2003 12:00 EL 58) LOCALWEB2000.RAR 2 148 170 09.01.2003 12:00 EL 59) MAILCHK.RAR 97 771 09.01.2003 12:00 EL 60) MDVDP12.EXE 2 354 713 09.01.2003 12:00 EL 61) MYBOOTDISK+KEYGEN.RAR 595 204 09.01.2003 12:00 EL 62) NEOTRACE_3.25_PRO_FULL.EXE 1 878 731 09.01.2003 12:00 EL 63) NERO_PLUGIN_PACK.RAR 694 543 09.01.2003 12:00 EL 64) NORTONCOMMANDER5.RAR 2 792 259 09.01.2003 12:00 EL 65) NRG2ISO.ZIP 484 617 09.01.2003 12:00 EL 66) NTFSDOSPRO4.03.ZIP 2 480 717 09.01.2003 12:00 EL 67) NVIDIADDS_PLUGIN.ZIP 23 781 09.01.2003 12:00 EL 68) OFFICE XP PROOF EST RUS.EXE 188 416 09.01.2003 12:00 EL 69) OFFICE_XP_EESTI_KEELE_KORREKTUUR.EXE 4 792 918 09.01.2003 12:00 EL 70) OUTPOST_PRO_REG.RAR 324 09.01.2003 12:00 EL 71) P8CRACK.RAR 37 728 09.01.2003 12:00 EL 72) PARTITION_MAGIC_802_RETAIL_KEYGEN.EXE 24 064 09.01.2003 12:00 EL 73) PASS.ZIP 76 839 09.01.2003 12:00 EL 74) PATCH_CREATOR.ZIP 181 958 09.01.2003 12:00 EL 75) PEBUNDLE.EXE 496 822 09.01.2003 12:00 EL 76) PINNACLE_README.ZIP 4 069 09.01.2003 12:00 EL 77) PIXMAKER_KEYGEN.EXE 28 871 09.01.2003 12:00 EL 78) POPPY.EXE 348 491 09.01.2003 12:00 EL 79) POPUPKILLER_1453.EXE 2 249 522 09.01.2003 12:00 EL 80) PORTS LIST.HTM 456 167 09.01.2003 12:00 EL 81) POWERDVD_XP_40.TXT 41 09.01.2003 12:00 EL 82) POWERSTRIP.V3.30.BUILD.364.FINAL.RETAIL.EXE 1 050 453 09.01.2003 12:00 EL 83) POWERVCR_CRACK_BY_SALUSOFT.ZIP 280 988 09.01.2003 12:00 EL 84) REALDRAW_V3_PRO_KEYGEN.ZIP 17 997 09.01.2003 12:00 EL 85) REGIOCD_REG.TXT 88 09.01.2003 12:00 EL 86) SANDRA_MAX3.rar 214 09.01.2003 12:00 EL 87) SETUP_SYSTRAYX_250_067.EXE 339 331 09.01.2003 12:00 EL 88) SONY_USB_DRIVERS_95_98_ME_2000_XP_BY_SALUSOFT.ZIP 1 202 558 09.01.2003 12:00 EL 89) spamkiller4040_30day.exe 0 09.21.2003 01:20 EL 90) SPYCOP+KEYGEN.RAR 1 316 513 09.01.2003 12:00 EL 91) SUPERCAT.EXE 1 564 600 09.01.2003 12:00 EL 92) SUSTEM_MECHANIC_3.7H_KEYGEN.RAR 147 113 09.01.2003 12:00 EL 93) systemmechanic_4.0a_keygen.zip 6 757 09.18.2003 08:28 PL 94) systemmechanic_4.0a_pro_keygen.rar 66 454 09.18.2003 08:34 PL 95) ZONEALARMPRO_4_BLACKLIST(FIXED).RAR 11 666 09.01.2003 12:00 EL 96) TASKINFO50.ZIP 1 542 186 09.01.2003 12:00 EL 97) TNO_WB35.RAR 13 286 09.01.2003 12:00 EL 98) TOTALRECORDER_4.2_PRO_RETAIL.EXE 52 007 09.24.2003 08:47 PL 99) TRAYICONPRO_1.3.89+LOADER.RAR 494 511 09.01.2003 12:00 EL 100) TROJANREMOVER_5.0.RAR 2 441 373 09.01.2003 12:00 EL 101) TURBOPASCAL_5.5.ZIP 985 839 09.01.2003 12:00 EL 102) TWEAKUI.EXE 113 152 09.01.2003 12:00 EL 103) TV-TOOL_6.8.4.4+KEYGEN.ZIP 807 765 09.01.2003 12:00 EL 104) ULEADPATCH.RAR 808 406 09.01.2003 12:00 EL 105) ULTRAEDIT_10+KEYGEN.ZIP 2 211 907 09.01.2003 12:00 EL 106) ULTRAEDIT-32_V10_KEYGEN.ZIP 18 776 09.01.2003 12:00 EL 107) UXTHEME_1090.RAR 96 725 09.01.2003 12:00 EL 108) W32DASM.RAR 759 346 09.01.2003 12:00 EL 109) WEBCAM_XP_PRO.EXE 962 178 09.01.2003 12:00 EL 110) WEBPOS20.LIC 426 09.01.2003 12:00 EL 111) viahyperion4in1446vp6.exe 0 09.24.2003 09:10 PL 112) WIN2K3_ACTIVATION.ZIP 1 720 09.01.2003 12:00 EL 113) WINBEJEWELED_SETUP.EXE 1 695 544 09.01.2003 12:00 EL 114) WINBMSETUP.EXE 2 181 864 09.01.2003 12:00 EL 115) WINDIAGS.EXE 2 484 349 09.01.2003 12:00 EL 116) WINDYNOMITE_CRACK.EXE 29 506 09.01.2003 12:00 EL 117) WINDYNOMITE_SETUP.ZIP 2 286 324 09.01.2003 12:00 EL 118) WINISO53.EXE 1 428 605 09.01.2003 12:00 EL 119) WINZIP81SR1-CORP.EXE 1 734 656 09.01.2003 12:00 EL 120) WINXP_CRACK.RAR 63 983 09.01.2003 12:00 EL 121) WINXP_EST.RAR 3 227 315 09.01.2003 12:00 EL 122) WINXP_SERVICES1.ZIP 20 554 09.01.2003 12:00 EL 123) WINXPKEYVIEWER.EXE 22 533 09.01.2003 12:00 EL 124) VOLKOV.ZIP 108 255 09.01.2003 12:00 EL 125) WSOSER.TXT 21 09.01.2003 12:00 EL 126) XARA_WEBSTYLE_3_CRACK_BY_SALUSOFT.EXE 77 824 09.01.2003 12:00 EL 127) XP_DEACTIVATE.REG 346 09.01.2003 12:00 EL 128) XP-ANTISPY.EXE 65 682 09.01.2003 12:00 EL 129) XP-DEACTIVATOR.EXE 10 752 09.01.2003 12:00 EL 130) XPKEYCHANGER.EXE 87 552 09.01.2003 12:00 EL 131) XVID.ALPHA.17.07.2003.CODEC.EXE Arvutiprogramme oli võimalik alla laadida veebilehelt http://salusoft.dyn.ee/. Alates oktoobrist 2003.a toimus allalaadimise alustades ümbersuunamine aadressile http://salusoft.com/.

tpetmanson commented 8 years ago

Ei õnnestunud probleemi korrata -- muidugi sellele lõigatud-kleebitud tekstil on kadunud vormistus. input.txt

timo@vm-silicon ~/estnltktest $ time python3.4 -c "import estnltk; estnltk.analyze(open('input.txt').read())"

real    0m1.362s
user    0m1.216s
sys 0m0.140s
timo@vm-silicon ~/estnltktest $ time python2.7 -c "import estnltk; estnltk.analyze(open('input.txt').read())"

real    0m1.135s
user    0m0.928s
sys 0m0.200s

Aga huvitav, kuidas see probleem tekib, sest estnltk-ga on õnnestunud läbi analüüsida terve koondkorpus kui ka eestikeelne vikipeedia. Kasutasin siis estnltk versiooni 1.3 .

urdvr commented 8 years ago

Ma kinnitan, et sinu näide töötab. Aga proovi näiteks

time python -c "import estnltk; estnltk.Text(open('./input.txt').read()).lemmas"

Raul testis ja leidis, et probleem on liiga pikas reas. Aga seni ei ole kellelgi olnud aega seda pikemalt uurida.

urdvr commented 8 years ago

Okei, viga, nagu ikka, on keerukam kui esialgu tundus.

estnltk.analyze võtab argumendina kas tokenite listi või tokeniseerimata stringi. Kui ta saab tokeniseerimata stringi, ei kasuta ta mitte estnltk vaiketokeniseerijat vaid teeb words.split() ehk tokeniseerib whitespace -i järgi.

Seega kui sõne meie (mina ja sina). tokeniseeritaks reeglina tükkideks "meie", "(", "mina", "ja", "sina", ")", siis Timo näites hoopis tükkideks "meie", "(mina", "ja", "sina)"

Põhjus, miks Timo näites patoloogilist juhtu ei ilmnenud, on, et probleemiks pole mitte pikk sõnalist vaid pikk sõnalist, mis sisaldab tokenitena lõpetavaid sulge. Mu hüpotees siinkohal oleks, et vabamorf püüab neid millegipärast matchida ja kasutab selleks ebaefektiivset algoritmi. Mul puudub hetkel aeg/pädevus/kogemus et probleemi juuri vabamorfi koodist edasi otsida ja minust jääb see hetkel ilmselt siiapaika.

Ma arvan küll, et estnltk.analyze peaks kasutama vaiketokeniseerijat, sest see vastaks paremini kasutajate ootustele.

Jätan siia ka näiteprogrammi, mis demonstreerib minu arvutis vähemalt kümnekordset kiirusevahet 1000 elemendilise sõnalisti peal sõltuvalt sellest kas kümnendik neist on lõpetavad sulud või mitte.

import random
import string
def generate_word(n):
    return  ''.join([random.choice(string.ascii_letters) for  i in range(n)])

vec_len = 1000
words = [generate_word(5) for i in range(vec_len)]

import time
from estnltk.vabamorf.morf import Vabamorf
from estnltk.vabamorf import vabamorf as vm
t = time.time()
v = Vabamorf()
morfresults = v._morf.analyze( vm.StringVector(words), True, True, True, True)
print('Aeg ilma sulgudeta', time.time() - t)

for i in range(vec_len):
    if i % 10 == 0:
        words[i] = ')'

from estnltk.vabamorf.morf import Vabamorf
from estnltk.vabamorf import vabamorf as vm
t = time.time()
v = Vabamorf()
morfresults = v._morf.analyze( vm.StringVector(words), True, True, True, True)
print('Aeg lõpetavate sulgudega', time.time() - t)

Ja väljund

Aeg ilma sulgudeta 0.41082334518432617 Aeg lõpetavate sulgudega 10.071750164031982

tpetmanson commented 8 years ago

Tundub, et probleem avaldub pärisnimede tuvastamisega (postag H)

$ python3.4 test.py 
Aeg ilma sulgudeta 0.44490551948547363
Aeg lõpetavate sulgudega 13.82964301109314
Aeg lõpetavate sulgudega ja propername==False 0.3258984088897705

Halb uudis on see, et probleem tekib ka etanaga.

$ time ./etana analyze -guess -propername -phonetic -lex et.dct -in sulgudeta.json -out sulgudeta_out.json

real    0m0.146s
user    0m0.120s
sys 0m0.004s

$ time ./etana analyze -guess -propername -phonetic -lex et.dct -in sulgudega.json -out sulgudega_out.json

real    0m14.278s
user    0m14.216s
sys 0m0.008s

$ time ./etana analyze -guess -phonetic -lex et.dct -in sulgudega.json -out sulgudega_out.json

real    0m0.201s
user    0m0.144s
sys 0m0.008s

Eelmise kirjas oleva näitega:

$ time python -c "import estnltk; estnltk.Text(open('./input.txt').read(), propername=False).lemmas"

real    0m1.254s
user    0m1.064s
sys 0m0.184s

NB Pidin failidele panema .txt laiendi, sest Github ei lubanud neid muidu üles laadida: sulgudega.json.txt sulgudeta.json.txt test.py.txt

tpetmanson commented 8 years ago

Tundub, et viga sai parandatud/leevendatud järgmise commitiga vabamorfis: https://github.com/Filosoft/vabamorf/commit/f52365944f206d0e614174986bfb1cca001c582b

Vastav muudatus tuleks mergeda estnltk vabamorfi liidesesse ja siis uuesti lauseid benchmarkida.

tpetmanson commented 8 years ago

Mergesin vastava vabamorfi commiti ja probleem minu masinas taandus:

$ python test.py
Aeg ilma sulgudeta 0.3941187858581543
Aeg lõpetavate sulgudega 0.36653900146484375
Aeg lõpetavate sulgudega ja propername==False 0.35704803466796875

Palun kotrollige ja positiivse tulemuse korral v6ib pileti kinni panna.