{ "cells": [ { "cell_type": "markdown", "source": [ "## Lemmatize glossary\n", "TODO: train test split glossary" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": 2, "outputs": [ { "data": { "text/plain": " source \\\nsource_lem \naaofi aaofi \naca aca \nacca acca \nabacus abacus \nabandonment cost abandonment costs \n... ... \nytd ytd \nyear-end year-end \nyear-to-date year-to-date \nzog zog \nzero overhead growth zero overhead growth \n\n result \\\nsource_lem \naaofi organizacja rachunkowości i audytu dla islamsk... \naca członek stowarzyszenia dyplomowanych biegłych ... \nacca stowarzyszenie dyplomowanych biegłych rewidentów \nabacus liczydło \nabandonment cost koszty zaniechania \n... ... \nytd od początku roku \nyear-end koniec roku \nyear-to-date od początku roku \nzog zero wzrostu kosztów ogólnych \nzero overhead growth zero wzrostu kosztów ogólnych \n\n result_lem \nsource_lem \naaofi organizacja rachunkowość i audyt dla islamski ... \naca członek stowarzyszenie dyplomowany biegły rewi... \nacca stowarzyszenie dyplomowany biegły rewident \nabacus liczydło \nabandonment cost koszt zaniechanie \n... ... \nytd od początek rok \nyear-end koniec rok \nyear-to-date od początek rok \nzog zero wzrost koszt ogólny \nzero overhead growth zero wzrost koszt ogólny \n\n[1197 rows x 3 columns]", "text/html": "
\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
sourceresultresult_lem
source_lem
aaofiaaofiorganizacja rachunkowości i audytu dla islamsk...organizacja rachunkowość i audyt dla islamski ...
acaacaczłonek stowarzyszenia dyplomowanych biegłych ...członek stowarzyszenie dyplomowany biegły rewi...
accaaccastowarzyszenie dyplomowanych biegłych rewidentówstowarzyszenie dyplomowany biegły rewident
abacusabacusliczydłoliczydło
abandonment costabandonment costskoszty zaniechaniakoszt zaniechanie
............
ytdytdod początku rokuod początek rok
year-endyear-endkoniec rokukoniec rok
year-to-dateyear-to-dateod początku rokuod początek rok
zogzogzero wzrostu kosztów ogólnychzero wzrost koszt ogólny
zero overhead growthzero overhead growthzero wzrostu kosztów ogólnychzero wzrost koszt ogólny
\n

1197 rows × 3 columns

\n
" }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import time\n", "\n", "import pandas as pd\n", "import spacy\n", "\n", "\n", "spacy_nlp_en = spacy.load('en_core_web_sm')\n", "spacy_nlp_pl = spacy.load(\"pl_core_news_sm\")\n", "\n", "glossary = pd.read_csv('kompendium.tsv', sep='\\t', header=None, names=['source', 'result'])\n", "\n", "source_lemmatized = []\n", "for word in glossary['source']:\n", " temp = []\n", " for token in spacy_nlp_en(word):\n", " temp.append(token.lemma_)\n", " source_lemmatized.append(' '.join(temp).replace(' - ', '-').replace(' ’', '’').replace(' / ', '/').replace(' ( ', '(').replace(' ) ', ')'))\n", "\n", "result_lemmatized = []\n", "for word in glossary['result']:\n", " temp = []\n", " for token in spacy_nlp_pl(word):\n", " temp.append(token.lemma_)\n", " result_lemmatized.append(' '.join(temp).replace(' - ', '-').replace(' ’', '’').replace(' / ', '/').replace(' ( ', '(').replace(' ) ', ')'))\n", "\n", "glossary['source_lem'] = source_lemmatized\n", "glossary['result_lem'] = result_lemmatized\n", "glossary = glossary[['source', 'source_lem', 'result', 'result_lem']]\n", "glossary.set_index('source_lem')\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 2, "outputs": [], "source": [ "glossary.to_csv('kompendium_lem.tsv', sep='\\t')" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Lemmatize corpus" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 3, "outputs": [], "source": [ "dev_path = 'mt-summit-corpora/dev/dev'\n", "\n", "skip_chars = ''',./!?'''\n", "\n", "with open(dev_path + '.en', 'r') as file:\n", " file_lemmatized = []\n", " for line in file:\n", " temp = []\n", " for token in spacy_nlp_en(line):\n", " temp.append(token.lemma_)\n", " file_lemmatized.append(' '.join([x for x in temp if x not in skip_chars]).replace(' - ', '-').replace(' ’', '’').replace(' / ', '/').replace(' ( ', '(').replace(' ) ', ')'))\n", "\n", "with open(dev_path + '.pl', 'r') as file:\n", " file_pl_lemmatized = []\n", " for line in file:\n", " temp = []\n", " for token in spacy_nlp_pl(line):\n", " temp.append(token.lemma_)\n", " file_pl_lemmatized.append(' '.join([x for x in temp if x not in skip_chars]).replace(' - ', '-').replace(' ’', '’').replace(' / ', '/').replace(' ( ', '(').replace(' ) ', ')'))\n", "\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 4, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in the course of the control the control audit firm shall fulfil the responsibility refer to in article 114 on date and in form specify by the controller \n", "\n", "w czas trwanie kontrola kontrolowany firma audytorski wypełnia obowiązek o których mowa w art 114 w ter-mina i forma wskazany przez osoba kontrolującą \n", "\n" ] } ], "source": [ "print(file_lemmatized[2])\n", "print(file_pl_lemmatized[2])" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Inject glossary\n", "# !!! Obsolete !!!" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "import spacy\n", "from spaczz.matcher import FuzzyMatcher\n", "\n", "\n", "glossary = pd.read_csv('kompendium_lem.tsv', sep='\\t', header=0, index_col=0)\n", "bad_words = ['ocf', 'toc', 'vas', 'vat']\n", "train_glossary = glossary.iloc[[x for x in range(len(glossary)) if x % 6 != 0]]\n", "\n", "nlp = spacy.blank(\"en\")\n", "matcher = FuzzyMatcher(nlp.vocab)\n", "for word in train_glossary['source_lem']:\n", " if word not in bad_words:\n", " matcher.add(word, [nlp(word)])\n", "\n", "\n", "en = []\n", "translation_line_counts = []\n", "for line_id, line in enumerate(file_lemmatized):\n", " doc = nlp(line)\n", " matches = matcher(doc)\n", "\n", " not_injected = 0\n", " for match_id, start, end, ratio in matches:\n", " if ratio > 90:\n", " not_injected += 1\n", " en.append(''.join(doc[:end].text + ' ' + train_glossary.loc[lambda df: df['source_lem'] == match_id]['result'].astype(str).values.flatten() + ' ' + doc[end:].text))\n", "\n", "\n", " if not_injected == 0:\n", " not_injected = 1\n", " en.append(line)\n", " translation_line_counts.append(not_injected)\n", "\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n", "is_executing": true } } }, { "cell_type": "code", "execution_count": 6, "outputs": [], "source": [ "import copy\n", "tlcs = copy.deepcopy(translation_line_counts)\n", "\n", "translations = pd.read_csv(dev_path + '.pl', sep='\\t', header=None, names=['text'])\n", "with open(dev_path + '.injected.pl', 'w') as file_pl:\n", " for trans in translations.iterrows():\n", " try:\n", " for _ in range(tlcs.pop(0)):\n", " file_pl.write(trans[1]['text'] + '\\n')\n", " except:\n", " pass\n", "\n", "\n", "with open(dev_path + '.injected.en', 'w') as file_en:\n", " for line in en:\n", " file_en.write(line)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "## Inject glossary Polish crosscheck" ], "metadata": { "collapsed": false } }, { "cell_type": "code", "execution_count": 7, "outputs": [], "source": [ "import spacy\n", "from spaczz.matcher import FuzzyMatcher\n", "\n", "# glossary\n", "glossary = pd.read_csv('kompendium_lem.tsv', sep='\\t', header=0, index_col=0)\n", "train_glossary = glossary.iloc[[x for x in range(len(glossary)) if x % 6 != 0]]\n", "\n", "# add rules to English matcher\n", "nlp = spacy.blank(\"en\")\n", "matcher = FuzzyMatcher(nlp.vocab)\n", "for word in train_glossary['source_lem']:\n", " matcher.add(word, [nlp(word)])\n", "\n", "# add rules to Polish matcher\n", "nlp_pl = spacy.blank(\"pl\")\n", "matcher_pl = FuzzyMatcher(nlp_pl.vocab)\n", "for word, word_id in zip(train_glossary['result_lem'], train_glossary['source_lem']):\n", " matcher_pl.add(word, [nlp_pl(word)])\n", "\n", "en = []\n", "translation_line_counts = []\n", "for line_id in range(len(file_lemmatized)):\n", "\n", " doc = nlp(file_lemmatized[line_id])\n", " matches = matcher(doc)\n", "\n", " not_injected = 0\n", " for match_id, start, end, ratio in matches:\n", " if ratio > 90:\n", " doc_pl = nlp_pl(file_pl_lemmatized[line_id])\n", " matches_pl = matcher_pl(doc_pl)\n", "\n", " for match_id_pl, start_pl, end_pl, ratio_pl in matches_pl:\n", " if match_id_pl == glossary[glossary['source_lem'] == match_id].values[0][3]:\n", " not_injected += 1\n", " en.append(''.join(doc[:end].text + ' ' + train_glossary.loc[lambda df: df['source_lem'] == match_id]['result'].astype(str).values.flatten() + ' ' + doc[end:].text))\n", "\n", " if not_injected == 0:\n", " not_injected = 1\n", " en.append(file_lemmatized[line_id])\n", " translation_line_counts.append(not_injected)\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 8, "outputs": [], "source": [ "import copy\n", "\n", "\n", "tlcs = copy.deepcopy(translation_line_counts)\n", "\n", "translations = pd.read_csv(dev_path + '.pl', sep='\\t', header=None, names=['text'])\n", "translations['id'] = [x for x in range(len(translations))]\n", "\n", "ctr = 0\n", "sentence = ''\n", "with open(dev_path + '.injected.crossvalidated.en', 'w') as file_en:\n", " with open(dev_path + '.injected.crossvalidated.pl', 'w') as file_pl:\n", " for i in range(len(en)):\n", " if i > 0:\n", " if en[i-1] != en[i]:\n", " if ctr == 0:\n", " sentence = translations.iloc[0]\n", " translations.drop(sentence['id'], inplace=True)\n", " sentence = sentence['text']\n", " try:\n", " ctr = tlcs.pop(0)\n", " except:\n", " pass\n", " file_en.write(en[i])\n", " file_pl.write(sentence + '\\n')\n", " ctr = ctr - 1\n", " else:\n", " try:\n", " ctr = tlcs.pop(0) - 1\n", " except:\n", " pass\n", " sentence = translations.iloc[0]\n", " translations.drop(sentence['id'], inplace=True)\n", " sentence = sentence['text']\n", " file_en.write(en[i])\n", " file_pl.write(sentence + '\\n')" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "# Inject glossary Polish crosscheck fast?" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": 49, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "took 152.213599056 injected 63 words. rate 6.569715230451229 sen/s\n" ] } ], "source": [ "import time\n", "import spacy\n", "from spaczz.matcher import FuzzyMatcher\n", "\n", "\n", "# glossary\n", "glossary = pd.read_csv('kompendium_lem.tsv', sep='\\t', header=0, index_col=0)\n", "train_glossary = glossary.iloc[[x for x in range(len(glossary)) if x % 6 != 0]]\n", "\n", "# add rules to English matcher\n", "nlp = spacy.blank(\"en\")\n", "matcher = FuzzyMatcher(nlp.vocab)\n", "for word in train_glossary['source_lem']:\n", " matcher.add(word, [nlp(word)])\n", "\n", "# add rules to Polish matcher\n", "nlp_pl = spacy.blank(\"pl\")\n", "matcher_pl = FuzzyMatcher(nlp_pl.vocab)\n", "for word, word_id in zip(train_glossary['result_lem'], train_glossary['source_lem']):\n", " matcher_pl.add(word, [nlp_pl(word)])\n", "\n", "start_time = time.time_ns()\n", "en = []\n", "injection_counter = 0\n", "for line_id in range(len(file_lemmatized)):\n", "\n", " doc = nlp(file_lemmatized[line_id])\n", " matches = matcher(nlp(file_lemmatized[line_id]))\n", "\n", " not_injected = True\n", " if len(matches) > 0:\n", " match_id, _, end, ratio = sorted(matches, key=lambda x: len(x[0]), reverse=True)[0]\n", " if ratio > 90:\n", " matches_pl = matcher_pl(nlp_pl(file_pl_lemmatized[line_id]))\n", "\n", " for match_id_pl, _, _, _ in matches_pl:\n", " if match_id_pl == glossary[glossary['source_lem'] == match_id].values[0][3]:\n", " not_injected = False\n", " injection_counter += 1\n", " en.append(''.join(doc[:end].text + ' ' + train_glossary.loc[lambda df: df['source_lem'] == match_id]['result'].astype(str).values.flatten() + ' ' + doc[end:].text))\n", " break\n", "\n", " if not_injected:\n", " en.append(file_lemmatized[line_id])\n", "\n", "stop = time.time_ns()\n", "timex = (stop - start_time) / 1000000000\n", "print(f'took {timex} injected {injection_counter} words. rate {len(file_lemmatized)/timex} sen/s')" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "code", "execution_count": 9, "outputs": [], "source": [ "import copy\n", "\n", "\n", "tlcs = copy.deepcopy(translation_line_counts)\n", "\n", "translations = pd.read_csv(dev_path + '.pl', sep='\\t', header=None, names=['text'])\n", "translations['id'] = [x for x in range(len(translations))]\n", "\n", "ctr = 0\n", "sentence = ''\n", "with open(dev_path + '.injected.crossvalidated.en', 'w') as file_en:\n", " with open(dev_path + '.injected.crossvalidated.pl', 'w') as file_pl:\n", " for i in range(len(en)):\n", " if i > 0:\n", " if en[i-1] != en[i]:\n", " if ctr == 0:\n", " sentence = translations.iloc[0]\n", " translations.drop(sentence['id'], inplace=True)\n", " sentence = sentence['text']\n", " try:\n", " ctr = tlcs.pop(0)\n", " except:\n", " pass\n", " file_en.write(en[i])\n", " file_pl.write(sentence + '\\n')\n", " ctr = ctr - 1\n", " else:\n", " try:\n", " ctr = tlcs.pop(0) - 1\n", " except:\n", " pass\n", " sentence = translations.iloc[0]\n", " translations.drop(sentence['id'], inplace=True)\n", " sentence = sentence['text']\n", " file_en.write(en[i])\n", " file_pl.write(sentence + '\\n')\n" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 }