pwn2dict 2.0

Od wydania pierwszej wersji pwn2dict upłynął ponad rok. Skrypt spotkał się z cieplejszym przyjęciem niż się spodziewałem. W wyniku kolejnych aktualizacji dodałem wsparcie dla różnych mutacji formatu i usunąłem pomniejsze niedopatrzenia. Ponieważ skrypt zauważalnie się rozrósł, od jakiegoś czasu miałem ochotę przepisać co niektóre części. W ostatnich dniach postanowiłem w końcu to zrobić, przy okazji dodając kilka nowych funkcji. Zmiany są na tyle poważne, że postanowiłem podbić wersję do 2.0.

Co nowego:
* Wsparcie dla Słownika Wyrazów Obcych i Słownika Frazeologicznego (zamiana nowych encji i tagów, sam format był już obsługiwany)
* Znacznie obniżone zużycie pamięci dzięki nowemu podejściu do konwersji (definicje są teraz wczytywane i konwertowane pojedynczo)
* Ok. 40% przyśpieszenia dzięki optymalizacji formatowania wpisów indeksu (tylko hasła ze znakami specjalnymi są teraz formatowane)
* Wchłonięcie skryptu pwn2tabfile (funkcjonalność dostępna pod opcją -t / –tabfile)
* Eksperymentalne kolorowanie wzorowane na kydpdict (opcja -c / –colors, domyślnie wyłączone)
* Automatyczny wybór nazwy docelowej, jeśli nie została podana przez użytkownika
* Rozliczne poprawki techniczne i stylistyczne, w tym przepisanie kodu jako klasy

Link: pwn2dict
Repozytorium: GitLab

Obsługa skryptu:

pwn2dict.py [opcje] zrodlo.win [nazwa.dict]

Dostępne opcje:

  -t, --tabfile  konwersja do formatu tabfile
  -c, --colors   eksperymentalne kolorowanie znaczników

Uwagi końcowe:
Domyślnym formatem docelowym jest StarDict. Jeśli nie podano nazwy docelowej, zostanie ona wybrana automatycznie. Skrypt wymaga Pythona 2.6. Nie jest kompatybilny z Pythonem 3.x. Funkcjonalność starego skryptu pwn2tabfile została wchłonięta i skrypt ten nie będzie już wspierany. Autor nie ponosi odpowiedzialności za używanie programu z nielegalnymi kopiami baz słownika. Gorąco zachęcam do kupna słowników.

Historia zmian:
2008.10.31: Pierwsza wersja skryptu obsługująca słownik PWN Oxford 2004.
2009.03.01: Dodana obsługa dla formatu PWN Oxford 2006/2007.
2009.06.17: Obsługa baz papierowego słownika w edycji 2005.
2009.09.01: Obsługę słownika polsko-rosyjskiego/rosyjsko-polskiego.

2010.02.11: Wersja 2.0 dodająca wsparcie dla Słownika Wyrazów Obcych i Słownika Frazeologicznego. Gruntownie przepisany skrypt, optymalizacja szybkości i nowe funkcje.
2010.03.04: Poprawiłem drobne niedopatrzenie przy konwersji do formatu StarDicta.
2010.06.06: Wersja 2.1 dodająca wsparcie dla Pythona 3.x.
2010.12.08: Wersja 2.2 dodająca wsparcie dla formatu PWN 2003.
2010.12.19: Wersja 2.3 dodająca wsparcie dla niemiecko-polskiego/polsko-niemieckiego słownika PWN i poprawiająca sortowanie haseł ze znakami narodowymi
2011.05.02: Wersja 2.4 dodająca obsługę konwersji do formatu dictd
2013.05.13: Wersja 2.5 poprawiająca kompatybilność z Pythonem 3.2+, dodająca wsparcie dla słownika Portal PWN v1.2 2003 i przyśpieszająca konwersję nawet o 30%

77 komentarzy

  1. Witam,
    przesiadłem z Win na Mac. Myślałem, że nie będę miał problemów z instalacją słowników na Mac, a tu porażka 🙁 Mam PWN z 2007 i Słownik Kościuszkowski (obydwa oczywiście na Win). Szukam jakichś możliwości zainstalowania (przyjamniej jednego z nich na Mac’a), trafiłem na Pana stronę. Czy ktoś z Państwa może mi pomóc w instalacji słowników?

  2. bird writes:

    Witam przy pomocy pwn2dict.py walczę z Powszechną Encyklpedia PWN 2006 i mam następujący błąd – czy ktoś może spotkał się z takowym?
    Traceback (most recent call last):
    File "C:TMPpwn2dict.py", line 727, in
    src_dict.write_stardict(dest_name)
    File "C:TMPpwn2dict.py", line 532, in write_stardict
    definition = self.read_definition(addr)
    File "C:TMPpwn2dict.py", line 602, in read_definition
    temp = zlib.decompress(word_buffer[first_byte + 1:])
    zlib.error: Error -3 while decompressing data: incorrect header check

  3. Anonymous writes:

    Przy uruchamianiu pod Pythonem 2.6.1 na Mac OS X 10.6.8 otrzymuję:

    Traceback (most recent call last):
    File "pwn2dict.py", line 689, in
    help="convert to tabfile format instead")
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/optparse.py", line 1004, in add_option
    raise TypeError, "invalid arguments"
    TypeError: invalid arguments

    Wynika to z:
    from __future__ import unicode_literals

    Musiałem zmienić na:

    parser = optparse.OptionParser(usage=usage)
    parser.add_option(str("-t"), str("–tabfile"), action="store_true", dest="tabfile",
    help="convert to tabfile format instead")
    parser.add_option(str("-d"), str("–dictd"), action="store_true", dest="dictd",
    help="convert to dictd format instead")
    parser.add_option(str("-c"), str("–colors"), action="store_true", dest="colors",
    help="add some colors for readability (experimental)")

    Wówczas zadziałało.

  4. Kefir writes:

    Dziękuję bardzo, wszystko zadziałało z pythonem 2.7.2. Informacja o wymaganiu wersji 2.6 była trochę myląca… 🙂 wiem, ta informacja jest w opisie wersji 2.0 a masz już wersję 2.4 ale instrukcja obsługi odsyła do opisu wersji 2.0 właśnie 🙂 to tylko uwaga funkcjonalna, nie krytyka bynajmniej, bo generalnie wieeelki szacun !

  5. Informacja nie jest myląca. Zaręczam, że u mnie pod Pythonem 2.6.4 pod Gentoo działa. Bardzo możliwe, że to jakaś różnica między dystrybucjami. Wiem na pewno, że OpenSUSE ma tego buga nawet w Pythonie 2.7. Jakiej używasz dystrybucji?

  6. Zygmunt writes:

    Używam linuxa i nie wiem czemu ale wpisująć komendę:

    pwn2dict.py angpol.win angpol.dict

    tylko to dostaje z powrotem.

    pwn2dict.py: command not found

    Zmieniłem pierwszą linijkę skryptu na

    #!/usr/bin/ python

    bo myślałem, że może skrypt nie widzi ścieżki do pytona,
    ale to chyba inny problem.

    Nie mogę sobie z tym poradzić. Byłbym bardzo wdzięczny za pomoc dzięki.

    Zygmunt

  7. kefir writes:

    Witam, pwn2dict wersja 2.4, python wersja 2.6 angpol.win wersja 3.0 2007

    C:a>pwn2dict.py angpol.win
    Traceback (most recent call last):
    File "C:apwn2dict.py", line 687, in
    help="convert to tabfile format instead")
    File "C:Python26liboptparse.py", line 1012, in add_option
    raise TypeError, "invalid arguments"
    TypeError: invalid arguments

    C:a>

    W czym może być problem ?
    pozdrawiam…

  8. voytek writes:

    czesc, dzieki za skrypt

    czy ten skrypt pomoze przygotowac zbiory 'ydp' z Palm na Androida Color Dict ?

    dostaje to:

    # pwn2dict.py DICT100.DAT new.dict
    Traceback (most recent call last):
    File "/usr/local/bin/pwn2dict.py", line 674, in
    src_dict = PwnDict(args[0], use_colors=options.colors)
    File "/usr/local/bin/pwn2dict.py", line 604, in __init__
    raise ValueError("Incorrect file header")
    ValueError: Incorrect file header
    root@palm:/home/voytek#

  9. J. writes:

    Cześć zainstalowałem Pythona w wersji 2.6 i 2.6.6 odpalam command line. wpisuje pwn2dict.py -t polang.win i pojawia się błąd File "", line 1 …SyntaxError: invalid syntax. Próbowałem na win xp sp3 i win 7. wersja słownika pwn to 2007 r.

  10. Anonim writes:

    skrypt ściągnięty z tej strony pwn oxford w wersji CD, po instalce przegrałem plik do folderu python26 na c. Może wersja słownika jest inna niż twój skrypt obsługuje? wielkość pliku polang.win to 68 962 348.

  11. Dobra robota, bardzo przydatny skrypt. Jeszcze może ktoś zdoła uruchomić ścieżkę dźwiękową słówek, tak jak to miało miejsce w "kydpdict" dla bazy "ydp". Swoją drogą to szkoda że kydpdict nie jest już rozwijany. Jak się komuś uda zainstalować pwn oxford 3 2007 pod wine, to będę wdzięczny za rady. U mnie kończy się to błędem o podanie nośnika CD.

  12. Anonymous writes:

    Witam. Skrypt działa idealnie z oryginalnym PWN który mam. Ale (wiem ze to juz nie Twoj problem) jest mozliwosc odsluchu oryginalnego lektora na StarDict zamiast jakiegos robocopa?

  13. No to podobnie jak ja. Pierwsza wersja była po prostu portem kodu kydpdict do pythona 🙂 Potem zacząłem dodawać obsługę innych mutacji formatu, nowe encje dodane przez PWN, ulepszać kod itd. Nie powiem, było to bardzo pouczające. Co do repo, postaram się je niedługo postawić. Gitorious nie ma wbudowanego issue trackera ani hostingu, ale jakoś go wolę 🙂

    UPDATE: http://gitorious.org/pwn2dict/pwn2dict

  14. gryf writes:

    Podstawą był kod kydpdict[1] na bazie którego zrobiłem prototyp w pythonie, żeby zrozumieć jak to działa. Poza samym wypakowaniem haseł do bazy planowałem napisać albo interfejs w pygtk albo dodać wsparcie dla tego słownika do ydpdict[2]. Pierwszy pomysł zarzuciłem, ze względu na performance, drugim nie miałem czasu się zająć 🙂

    No cóż. Na razie słownika używam poprzez stardicta (którego i tak używałem wcześniej) i jestem zadowolony.

    [1] http://ytm.bossstation.dnsalias.org/html/kydpdict.html
    [2] http://toxygen.net/ydpdict/

  15. No to szkoda, że narobiłeś się na marne 🙂 Na podstawie czego pisałeś?

    W każdym razie, mam konto na Gitoriousie, więc prędzej tam bym to wrzucił. Szkoda tylko, że nie mają tam żadnej bugzilli, ale cóż… Mówiąc szczerze, gita używam od dłuższego czasu do utrzymywania skryptu w ryzach, tylko lokalnie. Jeśli to potrzebne, mogę pchnąć commity na Gitoriousa.

  16. gryf writes:

    Dobra robota! Szkoda tylko, że znalazłem Twój skrypt jak swój (konwersja
    pwn2004 do bazy sqlite) miałem prawie gotowy. Może lepszym pomysłem na
    trzymanie kodu byłby sourceforge, berlios, github czy bitbucket?

    Przynajmniej byłaby większa szansa na znalezienie Twojego skryptu. Zwłaszcza github lub bitbucket wydają się być stworzone do utrzymywania "jednoplikowców" 🙂 Oprócz dobrodziejstw wynikających z CSV, masz za darmo issue tracker czy wiki 🙂

  17. Dla każdego słownika należy utworzyć oddzielny katalog i wrzucić do niego 3 wygenerowane pliki – pliki polang.idx, polang.dict, polang.ifo do /usr/share/stardict/dic/polang, pliki angpol.idx, angpol.dict, angpol.ifo do /usr/share/stardict/dic/angpol. Przy następnym uruchomieniu stardicta powinny w Manage dictionaries powinny pojawić się dwa nowe słowniki. Jeśli tak nie jest, coś poszło nie tak. A tak na marginesie, pliki można też skopiować do /home/nazwa_uzytkownika/.stardict/dic/nazwa_slownika.

  18. Ok, sortowanie rzeczywiście było nie do końca zgodne z tym, czego spodziewał się StarDict. Pogrzebałem trochę przy tym, upiększając przy okazji parę rzeczy. Następna wersja powinna działać poprawnie z hasłami w cyrylicy.

  19. Coś mi świta, że kiedyś miałem podobne problemy, kiedy źle sortowałem hasła, tj. w innej kolejności niż spodziewał się StarDict. Dostosowałem więc skrypt i przynajmniej problemy z polsko-angielskim słownikiem, których osobiście doświadczałem, zniknęły. To, że działa w GoldenDict, znacznie zawęża pole poszukiwań. StarDict wypluwa coś na terminal może?

  20. StarDict nie obsługuje tabfile. Kazałem przekonwertować to tylko do celów diagnostycznych. Tak, tabfile ma zwracać tylko jeden plik wynikowy. Nie chodziło mi o hasła "nieopracowane", chodzi mi o to czy w pliku tabfile widzisz te hasła. W razie problemów proszę o kontakt mailowy.

  21. zbynek3m writes:

    dzieje się tak przy większości słów, raczej niemożliwe że są to hasła nieopracowane w słowniku. przekonwertowałem na tabfile, ale nie wiem co dalej z tym zrobić. wrzuciłem do folderu …/dic ale Stardict tego nie widzi. czy to ok że w tabfile jest tylko jeden plik wynikowy?

  22. Dzieje się tak tylko dla niektórych haseł? Mógłbyś przekonwertować na tabfile i zobaczyć czy w pliku wynikowym te hasła są? Jedyne co mi przychodzi do głowy to, że dla tych haseł definicje są po prostu puste.

  23. zbynek3m writes:

    używam StarDicta. oczywiście pod ubuntu. trochę mnie to martwi i będę rad jeśli udałoby się jakoś to usprawnić. dwa razy konwertowałem bo myślałem, że może po drodze coś pogubił, ale sytuacja się nie poprawiła.

  24. zbynek3m writes:

    Hej chciałem podziękować bardzo za skrypcik, który ratuje pingwinka ponieważ dostęp do tych słowników jest absolutnie niezbędny dla mnie. chodzi zarówno o słowniki z angielskim jak i rosyjskim. mam jednak mały problem. Otóż po konwersji słownika rosysjko-polskiego bardzo dużo chaseł wyświetla jako "not found" czy to tylko mój problem czy jakiś szerszy? będę wdzięczny bo akurat w tę stronę tłumaczyć sobie trzeba dość często. dzięki za odpowiedzi i ewentualne próby naprawienia tego.

    pozdrawiam,

  25. Adam writes:

    Witam
    A jak to zrobić pod Win Xp
    Mam Pythona ale nie udaje mi się go uruchomic na konsoli
    Co trzeba zrobić aby
    Bo mam pliki z Oxford PWN angpol.win i polang.win i chciałbym je przerobić tak aby wrzucić do Kindla ale nie za bardzo umiem sie w tym temacie poruszac
    Pozdrawiam Adam

  26. Nie mam za bardzo nic rozpracowanego. Doszedłem do tego, że hasła nie są raczej kompresowane gzipem, ale nic więcej przy tym nie dłubałem. Pomoc w rozgryzieniu tego jak najbardziej mile widziana.

  27. one_and_only writes:

    I jak tam idzie z uniwersalnym słownikiem języka polskiego? Bo bardzo go lubię i nawet sam zacząłem coś przy nim dłubać, ale jak już go masz rozpracowanego to nie ma się co męczyć ;]

  28. Anonim writes:

    Pliki otaczające wydają się podobne do innych słowników PWN. Plik słownika ma nazwę slo.win. Przy próbie konwersji pojawia się:
    Detected Oxford PWN 2006/2007 format…
    Reading alphabetical index…
    Reading words…
    Traceback (most recent call last):
    File "pwn2dict.py", line 693, in
    src_dict = PwnDict(args[0], use_colors=options.colors)
    File "pwn2dict.py", line 648, in __init__
    length = word_buffer.index(b"x00")
    ValueError: substring not found

  29. JerryT writes:

    Po instalacji Python 3.1.2 poszło z warningiem:
    pwn2dict.py:524: DeprecationWarning: With-statements now directly support multiple context managers
    open(book_name + ".ifo", "wb")) as (dictionary, idx, ifo):

    Swoją drogą to czy są jakieś szanse na usprawnienie skryptu tak by konwertował Uniwersalny Słownik Języka Polskiego?

  30. Warning niegroźny i mi znany. Co do SJP, wydaje mi się, że to zupełnie inny format, ale pewności nie mam. Jeśli tak jest, marne szanse na dodanie wsparcia. Jakie nazwy mają pliki baz z SJP i co pokazuje skrypt przy próbie konwersji?

  31. Problem tkwi w kodowaniu argumentów. Przypadkiem któraś ze ścieżek do plików nie ma znaków spoza alfabetu łacińskiego? W każdym razie, u mnie problem nie występuje. Musi to być coś z macową wersją Pythona.

  32. JerryT writes:

    A ja na Macu mam następujący błąd:
    Traceback (most recent call last):
    File "pwn2dict.py", line 670, in
    help="convert to tabfile format instead")
    File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/optparse.py", line 1018, in add_option
    raise TypeError, "invalid arguments"
    TypeError: invalid arguments

  33. Anonymous writes:

    dzieki!
    swietna robota-od dÅuzszego czasu nie chcialo mi sie v2005 odpalac przez wina.
    teraz nam linuksiarzom uczacym sie ang brakuje juz tylko longmana wspolczesnego przerobionego na format stardicta.
    jeszcze raz dzieki

  34. boomerang writes:

    Czy działa wam w wywołaniu skryptu opcja -c?
    U mnie wywala błąd:

    Traceback (most recent call last):
    File " ", line 1, in
    NameError: name 'pwn2dict' is not defined

  35. maciek writes:

    ok, dzieki michal. wyszukalem na forum informacje, ze ma python byc wkrotce uaktualniony do wersji 2.6. jesli tak sie stanie i nie bede mogl sobie poradzic ze skryptem to sie zglosze;)

  36. Anonymous writes:

    czy ktos bylby tak uprzejmy i wyjasnil łopatologicznie jak to przekonwertowac i zainstalowac? mam pliki angpol.win i polang.win z pwn oxford 2004.

    z gory bardzo dziekuje:)

  37. vit0 writes:

    Dzięki wielkie za ten skrypcik! Wszystko działa jak należy.
    Nie wiecie może jak jest z konwersją plików z najnowszej wersji słownika (3.0)? Szczerze powiedziawszy nie próbowałem tego…

  38. stach writes:

    Cos jest nie tak z wyrazami zaczynajacymi sie od akcentowanych liter. W slowniku wyrazow obcych dla hasel Ce ira, A (angstrem) wyswietla mi sie tylko (not found). Czesc hasel w ogole zniknela, np "B".

    Pozdrawiam!

  39. Martin writes:

    Hej,

    Przy uruchomieniu z uniwersalnum slownikiem j polskiego 2004 dostaje taki blad:

    Detected Oxford PWN 2004 format…
    Reading alphabetical index…
    Reading words…
    Traceback (most recent call last):
    File "c:DownloadseBookspwn2dictpwn2dict.py", line 660, in
    src_dict = PwnDict(args[0], use_colors=options.colors)
    File "c:DownloadseBookspwn2dictpwn2dict.py", line 615, in __init__
    length = word_buffer.index("x00")
    ValueError: substring not found

    Uzywam Python 2.6.5. Any idea?

  40. Anonim writes:

    dostaje taki bÅąd przy próbie konwersji. nie moge dojÅÄ co jest nie tak

    pwn2dict.py:502: Warning: 'with' will become a reserved keyword in Python 2.6
    File "pwn2dict.py", line 502
    with nested(codecs.open(fname, "w", "UTF-8"),
    ^
    SyntaxError: invalid syntax

  41. Trochę to subiektywne czy taki zapis jest bardziej czytelny. Nie jestem w stanie zagwarantować, że nie zepsuje to czegoś innego. Ale ogólnie wydaje mi się, że wystarczyłyby dwie dodatkowe linie kodu, by osiągnąć taki efekt.

    Jeśli chodzi o SJP, coś obiło mi się o uszy, że używa całkiem innego formatu. Proszę o kontakt mailowy w każdym razie ( mziab at o2 pl ).

  42. z0rr0 writes:

    MZiab
    Jeszcze raz dzięki za skrypt – dzięki niemu korzystam z słowników, nie przesadzając, codziennie. Naprawdę super robota.
    Jeśli mógłbym, to chciałbym przekazać kilka sugestii, które wydaje mi się, trochę sprawią, ze słownik będzie bardziej przejrzysty. Sam zmodyfikowałem finalny plik, ale może warto to wrzucić od razu do skryptu.
    1. każde, nie wiem jak to nazwać, wyrażenie/związek frazeologiczny lepiej wygląda od nowej linijki, np:

    "From angpol new
    sea level

    n poziom m morza;
    above/below sea level ponad poziomem/poniżej poziomu morza;
    1,000 m above sea level 1 000 metrów nad poziomem morza;
    rising sea levels threaten the coastline podwyższający się poziom morza zagraża wybrzeżom
    From angpol
    sea level

    n poziom m morza; above/below sea level ponad poziomem/poniżej poziomu morza; 1,000 m above sea level 1 000 metrów nad poziomem morza; rising sea levels threaten the coastline podwyższający się poziom morza zagraża wybrzeżom"

    Ręcznie to poprawiłem wstawiając enter pomiędzy ; i znacznik boldowania

    2. Phrasal verbs.
    Zdarzają się takie hasła, gdzie pojawia się znak końca akapitu. Jak domyślam się rozróżnia on rożne znaczenia tego samego phrasla, np:

    fuck about, fuck around ¶ vulg: ¶ fuck about or around opieprzać się vinfml; opierdalać się vulg ¶ fuck [sb] about or around chromolić kogoś vinfml; traktować kogoś jak gówno vulg

    To tez powinno znaleźć się de facto w nowej linijce:

    fuck about, fuck around vulg:

    – fuck about or around opieprzać się vinfml; opierdalać się vulg

    – fuck [sb] about or around chromolić kogoś vinfml; traktować kogoś jak gówno vulg

    (z tym znacznikiem jest trochę więcej pracy, bo w wersji słownika 2005, która posiadam jest kilka błędów)

    3. Mam też Uniwersalny SJP wersja 2005, ale skrypt sobie z nim nie radzi. Jakbyś w wolnej chwili chciał spojrzeć co w nim siedzi, to daj znać jak mogę pomóc.

    PozdrawiAM

  43. RafaÅ writes:

    Już ponad rok… Twój skrypt sprawił, że moja znajomość angielskiego i rosyjskiego w ciągu tego roku bardzo wyraźnie się polepszyła. Dzięki! Podarowałeś nam – linuksowcom naprawdę wspaniałą rzecz. W ogóle to świetna sprawa z tym kolorowaniem. 🙂

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *