From 8089ae5286b7f923c5ea367511d8eb3b773c8437 Mon Sep 17 00:00:00 2001 From: marekyggdrasil Date: Sun, 7 Aug 2022 17:39:31 +0200 Subject: [PATCH] woohooooo --- README.md | 52 +++++++++++++++++++++- polishify/__init__.py | 1 + polishify/extract.py | 48 ++++++++++++++++++++ polishify/polishify.py | 82 +++++++++++++++++++++++++++++++++++ polishify/static/__init__.py | 0 polishify/static/dataset.json | 1 + setup.py | 34 +++++++++++++++ 7 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 polishify/__init__.py create mode 100644 polishify/extract.py create mode 100644 polishify/polishify.py create mode 100644 polishify/static/__init__.py create mode 100644 polishify/static/dataset.json create mode 100644 setup.py diff --git a/README.md b/README.md index 7a1332f..9a0ff16 100644 --- a/README.md +++ b/README.md @@ -1 +1,51 @@ -# polishify \ No newline at end of file +# polishify + +## Setup + +Simply + +```sh +pip install polishify +``` + +## Usage + +If you have some text that is in Polish but characters look weird it might not be encoded with `windows-1250` or `iso-8859-2` encoding. If your file is `sometext.txt` you may + +```sh +polishify sometext.txt +``` + +and it will show you something like + +``` +detected encoding is: windows-1250 +``` + +If you wish to get this file converted to `utf-8` just do + +```sh +polishify sometext.txt properly-encoded.txt +``` + +If you do it in bash script you might not want to see any outputs, the script supports silent mode as follows + +```sh +polishify sometext.txt properly-encoded.txt --silent +``` + +This package contains words with polish letters, you might want to use your own dataset `dataset.json` file. + +```sh +polishify sometext.txt properly-encoded.txt --silent --dataset dataset.json +``` + +We also provide a tool that generates it from a text + +```sh +polishify-extract sometext.txt dataset.json --encoding windows-1250 +``` + +## Author + +Made by [Marek Narożniak](https://mareknarozniak.com/), for the world and especially people who have people in the family who needs subtitles in Polish and want to bulk convert their encodings. No warranty provided. Licensed under GPL-3. diff --git a/polishify/__init__.py b/polishify/__init__.py new file mode 100644 index 0000000..b794fd4 --- /dev/null +++ b/polishify/__init__.py @@ -0,0 +1 @@ +__version__ = '0.1.0' diff --git a/polishify/extract.py b/polishify/extract.py new file mode 100644 index 0000000..6c9cb96 --- /dev/null +++ b/polishify/extract.py @@ -0,0 +1,48 @@ +# import string +# print(string.printable) + +import argparse +import re +import json + +parser = argparse.ArgumentParser(description='Polishify by Marek Narozniak, a tool that helps you get rid of old encodings in Polish text.') +parser.add_argument('input', + help='Input file that contains polish text to generate the dataset') +parser.add_argument('output', + help='Output file that will store the dataset') +parser.add_argument('--encoding', + default='utf-8', + help='Encoding of the file.') +args = parser.parse_args() + +def main(): + data = None + with open(args.input, 'rb+') as f: + data = f.read() + + decoded = data.decode(args.encoding).lower() + + keep = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' + remove = '0123456789!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~\r\n' + + for r in remove: + decoded = decoded.replace(r, ' ') + + decoded = re.sub(' +', ' ', decoded) + + words = decoded.split(' ') + words = list(set(words)) + + polish = 'łąęźćżńó' + dataset = {} + + for p in polish: + selected = [] + for word in words: + if p in word: + selected.append(word) + print(p, len(selected)) + dataset[p] = selected + + with open(args.output, 'w') as f: + json.dump(dataset, f, ensure_ascii=False) diff --git a/polishify/polishify.py b/polishify/polishify.py new file mode 100644 index 0000000..f845772 --- /dev/null +++ b/polishify/polishify.py @@ -0,0 +1,82 @@ +import argparse +import sys +import re +import json + +from polishify import static + +try: + import importlib.resources as pkg_resources +except ImportError: + # Try backported to PY<37 `importlib_resources`. + import importlib_resources as pkg_resources + +parser = argparse.ArgumentParser(description='Polishify by Marek Narozniak, a tool that helps you get rid of old encodings in Polish text.') +parser.add_argument('--silent', + required=False, + action='store_true', + help='Silent mode makes it not show any output.') +parser.add_argument('input', + help='Input file that contains polish text with unknown encoding.') +parser.add_argument('--out', + help='If present, writes the utf-8 encoded text there') +parser.add_argument('--dataset', + help='You may use your own words reference dataset json file.') +args = parser.parse_args() + + +def getLowercaseWords(text): + remove = '0123456789!"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~\r\n' + lowered = text.lower() + for r in remove: + lowered = lowered.replace(r, ' ') + lowered = re.sub(' +', ' ', lowered) + words = lowered.split(' ') + words = list(set(words)) + return words + + +def isPolish(text, dataset): + polish = 'łąęźćżńó' + words = getLowercaseWords(text) + for j, p in enumerate(polish): + required_words = dataset[p] + common = [value for value in words if value in required_words] + if len(common) == 0: + return False + return True + + +def main(): + dataset = None + if args.dataset: + with open(args.dataset, 'r') as f: + dataset = json.load(f) + else: + with pkg_resources.open_binary(static, 'dataset.json') as f: + dataset = json.load(f) + + encodings = ['utf-8', 'iso-8859-2', 'windows-1250'] + + data = None + with open(args.input, 'rb+') as f: + data = f.read() + + target_encoding = None + for encoding in encodings: + try: + decoded = data.decode(encoding) + except: + continue + if isPolish(decoded, dataset): + target_encoding = encoding + if not args.silent: + print('detected encoding is: ', encoding) + break + + if args.out: + if not args.silent: + print('Writing to', args.out) + decoded = data.decode(target_encoding) + with open(args.out, 'w') as f: + f.write(decoded) diff --git a/polishify/static/__init__.py b/polishify/static/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/polishify/static/dataset.json b/polishify/static/dataset.json new file mode 100644 index 0000000..ea277e1 --- /dev/null +++ b/polishify/static/dataset.json @@ -0,0 +1 @@ +{"ł": ["dotykał", "właśnie", "pamiętał", "generał", "byłam", "długa", "była", "słonecznym", "zgłodniałeś", "współrzędne", "znalazł", "wysiłku", "krzesło", "małej", "dotykałem", "popełniamy", "całkowita", "przybyły", "pełni", "około", "człowieku", "istniała", "światło", "współczuję", "powiedziałbym", "miałbym", "właściwą", "układzie", "miałeś", "powiedział", "pokonał", "niezwykłą", "powiedziałam", "chciałem", "żałuje", "głodny", "zasłużyliście", "słyszeć", "położenie", "białek", "połączeniem", "zawiodła", "obsługi", "miało", "moduł", "zmarnowałeś", "widziałem", "ustaliłem", "chciał", "wokół", "błędny", "siły", "powstrzymywało", "malowidła", "włączymy", "włączam", "wyraził", "połączenie", "siłowe", "działać", "łatwym", "odkrył", "tłumaczyć", "dłużej", "północ", "przepełniło", "chciała", "sprowadził", "przydział", "osłonę", "wiedział", "mówiła", "przesyła", "przesłać", "włącznie", "wyłączaj", "usłyszeć", "strzelałeś", "dołączycie", "mały", "kłopoty", "mówiłem", "przyjaciół", "zastanawiałem", "łańcucha", "cały", "spisałeś", "wykrywał", "członkowie", "włączaj", "mogłeś", "usiadłem", "cała", "zostało", "poczułem", "źródło", "dorównywałaby", "wzrastało", "zauważyłem", "chłopiec", "chłopaki", "przyszłość", "zapadło", "pomysł", "myślałem", "bawiłam", "został", "załapałem", "kałużowy”", "skupiłem", "udało", "żołnierzy", "widział", "zgubiłam", "przesłona", "właściwy", "wiedziałem", "odległej", "tyłu", "przeszłość", "sygnał", "tańczyła", "całe", "miała", "posłuchaj", "pułkowniku", "poszedł", "zmieniło", "śniło", "mogło", "diabła", "sprawdziłem", "wyłączenia", "należało", "pułkownika", "stało", "dół", "był", "pomyślałam", "przyprowadziłem", "główną", "powiedziałeś", "rozległe", "wyłącz", "odbijało", "działa", "słyszałem", "zapamiętał", "zatonęło", "pułkownik", "podobało", "smakowałam", "całego", "bały", "posłuchać", "spał", "nazywało", "wyłączyła", "leżało", "całkowicie", "zaskoczył", "mogły", "próżnował", "włączają", "opadły", "przeczytałam", "przesyłaj", "wyłączcie", "szukały", "znalazłeś", "przełamać", "byłem", "zrobiłeś", "słuchajcie", "źródła", "powracał", "pełno", "przetrwało", "zabrałaś", "zrobiłem", "piekło", "głowę", "niewłaściwym", "zdołasz", "głównego", "hałasu", "miła", "najechał", "obsługiwać", "miło", "członków", "próbowałem", "zobaczył", "nastąpiło", "włączyć", "było", "wybierałam", "zostałeś", "doskonałe", "miły", "błagał", "strzał", "dotknęła", "sprowadziłeś", "głód", "została", "pozostałe", "zgadzało", "pułkownikiem", "wysłać", "połączenia", "zgłosiliście", "trwałoby", "zebrałam", "były", "załamuje", "udział", "chciałaś", "głodowi", "podjęłaś", "słucham", "całym", "mogła", "umysłu", "udzielił", "generała", "załóż", "powiedziałem", "dowiedziałem", "mało", "osłony", "przyjaciółmi", "właściwie", "miałem", "światła", "musiał", "zagłada", "wyczułeś", "karłowata", "przeładować", "błędy", "łącznie", "zupełnie", "zespół", "kałużowy", "wydawało", "tłumaczenie", "wyłączeniu"], "ą": ["powstrzymują", "mijają", "wodą", "najmądrzejsi", "wymagają", "ściągnie", "mogą", "wygląda", "pomogą", "przelatujący", "mówią", "ziemią", "skąd", "zbliżających", "właściwą", "dotąd", "wyczuwają", "zacząć", "niezwykłą", "jedną", "dyplomatyczną", "stwierdzą", "zaczną", "spędzą", "znaną", "połączeniem", "sądzę", "latające", "zbuntowaną", "wystarczająco", "dokądś", "potrafią", "mówiąc", "osiąga", "potężną", "idą", "włączymy", "misją", "włączam", "naszą", "interesującego", "połączenie", "ją", "pańską", "niewyobrażalną", "wracają", "szczątkowymi", "mną", "bądź", "odciągnąć", "włącznie", "wyłączaj", "dołączycie", "pomocą", "urządzeniu", "lądowania", "dokąd", "mają", "waszą", "oglądam", "zabierając", "bądźcie", "włączaj", "tą", "wyglądają", "moją", "twoją", "otwartą", "galaktyką", "śpią", "imponujące", "wziąć", "bawią", "związek", "są", "usiąść", "przywódcą", "porządku", "wylądujemy", "muszą", "pozwalają", "początku", "zjawią", "rozwalą", "nieosiągalny", "wykonując", "wyłączenia", "reprezentujących", "ekspedycyjną", "główną", "wyłącz", "określających", "którą", "lecą", "tysiące", "potrzebują", "niesamowitą", "wyrządzona", "zbliżają", "sobą", "ojczyzną", "bronią", "wyłączyła", "nawiązaliśmy", "zamknąć", "najpotężniejszą", "chwilą", "włączają", "wiedzą", "wyłączcie", "przebudzą", "wykrywają", "aktywują", "oglądasz", "nadlatują", "pewnością", "powstrzymujące", "stąd", "powierzchnią", "ciągle", "inną", "przybędą", "niebezpieczną", "nastąpiło", "wątpię", "włączyć", "rozwiązanie", "chcą", "ostatnią", "rangą", "obudzą", "dobrą", "wyjątkowemu", "żyją", "otrząśnij", "połączenia", "lądujcie", "gorące", "nawiązywać", "postąpić", "ściągnij", "będą", "biorąc", "nawiązaliście", "wyruszą", "technologią", "podjąć", "łącznie", "zasilają", "latającym", "zewnątrz", "zająć", "widzą", "wyłączeniu"], "ę": ["przegapię", "pamiętał", "imię", "galaktykę", "miesięcy", "wędrowców", "naprawdę", "współrzędne", "pragnę", "konsolę", "będzie", "zabiorę", "rację", "cię", "noktowizję", "współczuję", "antarktydę", "okazję", "szurnięci", "grupę", "spędzą", "sondę", "wodę", "ochronę", "sądzę", "błędny", "mogę", "potężną", "parę", "wrócę", "nadaję", "sprzętu", "myślę", "potęga", "dostęp", "stronę", "szczęście", "boję", "uwięziliście", "osłonę", "idę", "atlantydę", "obronę", "zapętlone", "nazwę", "klęknij", "rozmowę", "między", "potędze", "nowinę", "wiarę", "ciężko", "będziesz", "umrę", "placówkę", "uwagę", "znajdę", "cieszę", "planetę", "względu", "pojęcia", "chwilę", "poślę", "będę", "przemyślę", "najwięcej", "zgadnę", "maskę", "celę", "uszkodzę", "chcę", "stuknięci", "radę", "daję", "energię", "większym", "zasięg", "ziemię", "szansę", "będziecie", "dziękuję", "zapamiętał", "zatonęło", "następnym", "herbatę", "trochę", "tę", "najpotężniejszą", "muszę", "mówię", "przybędzie", "zaakceptuję", "części", "strefę", "decyzję", "zapamiętaj", "się", "potrzebuję", "dźwięk", "czuję", "dziurę", "proszę", "lubię", "kamerę", "zdecyduję", "głowę", "zwięźle", "przybędą", "więcej", "więc", "wątpię", "wszędzie", "wyrażę", "dotknęła", "funkcję", "dzięki", "pamiętam", "próbuję", "zasięgiem", "nadzieję", "garstkę", "część", "zdobędziecie", "ramię", "kartotekę", "oblężeni", "pozycję", "podjęłaś", "widzę", "uwzględniono", "rękach", "będziemy", "technologię", "będą", "poświęca", "ręka", "błędy", "językiem", "dziwię", "zaczęliśmy"], "ź": ["sprawdź", "przyprowadź", "chodźmy", "wejdźcie", "później", "znaleźliśmy", "chodźcie", "bądź", "idźcie", "najwyraźniej", "przyjaźń", "bądźcie", "idź", "weź", "źródło", "późno", "odpowiedź", "znaleźć", "przejdź", "znajdźcie", "źli", "źródła", "nieźle", "dźwięk", "zwięźle", "źle"], "ć": ["pośpieszyć", "przedrzeć", "spodziewać", "zobaczyć", "odejść", "zostać", "darować", "porozmawiać", "ruszać", "ilość", "reaktywować", "zadbać", "użyć", "zaoferować", "przeszukać", "potraktować", "wracać", "sprawdzić", "wstawać", "zatrzymać", "stać", "zacząć", "słyszeć", "jeść", "zapalać", "być", "podtrzymać", "opuszczać", "zareagować", "lecieć", "przerwać", "wychodzić", "wymieniać", "iść", "wybierać", "działać", "tłumaczyć", "szukać", "negocjować", "zapewnić", "martwić", "widzieć", "ustanowić", "wpakować", "przesłać", "odciągnąć", "usłyszeć", "sieć", "spróbować", "startować", "obecność", "zabezpieczyć", "kryć", "wyrazić", "zdolność", "przyszłość", "ćwiczeniom", "wziąć", "wylecieć", "handlować", "używać", "poznać", "uczyć", "utworzyć", "brakować", "usiąść", "bać", "pozwolić", "ocalić", "ćwiczenia", "podnieść", "przeszłość", "robić", "znaleźć", "widać", "ustalić", "spowodować", "potrzebować", "wrócić", "zapalić", "bawić", "ewakuować", "zatrzymywać", "dopuścić", "atakować", "dzwonić", "posłuchać", "powiedzieć", "opuścić", "siedzieć", "porzucić", "zamknąć", "gadać", "śmierć", "strzelać", "żyć", "dość", "przełamać", "rozwalić", "wiadomość", "dostać", "pokazać", "latać", "cześć", "obstawiać", "przygotować", "niewidzialność", "przekonywać", "wypatrywać", "uratować", "ludzkość", "umrzeć", "obsługiwać", "wpuść", "czekać", "zasilić", "włączyć", "wyruszać", "zostawić", "zbadać", "spytać", "pohandlować", "udać", "otworzyć", "zrobić", "wysłać", "wiedzieć", "przypominać", "część", "zabić", "ciemność", "zebrać", "zejść", "myśleć", "nawiązywać", "wyobrazić", "zastanowić", "postąpić", "mnożyć", "zawrócić", "przemieszczać", "obróć", "walić", "sprawić", "zabrać", "przeładować", "przejść", "podjąć", "pójść", "mieć", "zająć"], "ż": ["próżniowej", "niż", "użyć", "bliżej", "zbliżających", "żniwo", "także", "przecież", "żebyś", "chociaż", "żałuje", "życie", "zasłużyliście", "położenie", "sierżancie", "żywe", "wyjeżdżam", "przekaż", "tuż", "potężną", "przeżyli", "uważajcie", "żartujesz", "niewyobrażalną", "dłużej", "boże", "żadnego", "każdy", "drużyna", "drużyny", "ciężko", "starożytni", "należy", "ważniejszego", "pilotażowi", "że", "zużywa", "zauważyłem", "używać", "ponieważ", "podróż", "kałużowy”", "żołnierzy", "pokaż", "możliwości", "żerowiska", "możesz", "żartuj", "zbliża", "najodważniejsi", "należało", "zużycie", "podróży", "też", "żywot", "zbliżają", "leżało", "poważny", "nieważne", "próżnował", "najpotężniejszą", "żyć", "życia", "poważne", "może", "możemy", "niezależne", "żyje", "ostrożniejszy", "żeby", "życiu", "wyrażę", "możecie", "zbliżonych", "pomoże", "aż", "żyją", "uważam", "upoważnienia", "już", "oblężeni", "każdym", "duże", "najwyższy", "żerowisko", "mnożyć", "odżywiane", "załóż", "ostrożni", "duża", "pomóż", "przeróżne", "kałużowy", "możliwe", "dużo"], "ń": ["pański", "zadzwońcie", "zostań", "pańską", "badań", "przyjaźń", "łańcucha", "ogień", "końcu", "zakończenie", "dzień", "tańczyła", "skończyliśmy", "broń", "dzwońcie", "niebezpieczeństwie", "odsuńcie", "pokoleń", "mieszkańcy", "przestrzeń"], "ó": ["próżniowej", "pozwól", "wędrowców", "współrzędne", "bandytów", "mówią", "siódmy", "córka", "stóp", "współczuję", "krajów", "pomóc", "móc", "spróbujcie", "przywódca", "którzy", "genów", "spróbuj", "zrób", "naróbcie", "potrójnie", "którymi", "później", "wokół", "zetów", "nieporównywalna", "sposób", "mówiąc", "wrócę", "ogóle", "dopóki", "północ", "dwóch", "światów", "mówiła", "wrócili", "równie", "pokój", "mówiłem", "spokój", "przyjaciół", "spróbować", "spójrzcie", "placówkę", "którego", "spójrz", "które", "źródło", "dorównywałaby", "komórkach", "róbcie", "późno", "mówi", "wróg", "podróż", "krótkie", "przywódcą", "środków", "przycisków", "przodków", "podwójnie", "próbowaliśmy", "wrócimy", "której", "dół", "milionów", "wrócić", "stój", "placówce", "podróży", "główną", "odwróci", "którą", "gotów", "próżnował", "mnóstwo", "mówię", "ósmy", "źródła", "powrócimy", "spróbujemy", "wśród", "placówki", "których", "głównego", "twój", "który", "którym", "członków", "próbowałem", "mój", "która", "wrót", "głód", "powróci", "komórki", "próbuję", "odbiór", "niektórzy", "swój", "niektórych", "wkrótce", "zawrócić", "załóż", "wrócisz", "obróć", "przyjaciółmi", "adresów", "pomóż", "przeróżne", "zespół", "pójdziemy", "pójść"]} \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..35a0897 --- /dev/null +++ b/setup.py @@ -0,0 +1,34 @@ +import setuptools +import polishify + + +setuptools.setup( + name='polishify', + version=polishify.__version__, + packages=['polishify', 'polishify.static'], + license='MIT', + description = 'Helps you convert Polish text of unknown encoding into UTF-8', + long_description=open('README.md').read(), + long_description_content_type="text/markdown", + author = 'Marek Narozniak', + author_email = 'marek.yggdrasil@gmail.com', + install_requires=['argparse'], + url = 'https://github.com/marekyggdrasil/polishify', + classifiers=[ + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 2", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + ], + include_package_data=True, + package_data = { + # If any package contains *.txt or *.rst files, include them: + '': ['dataset.json'], + }, + entry_points={ + 'console_scripts': [ + 'polishify=polishify.polishify:main', + 'polishify-extract=polishify.extract:main' + ], + }, +)