diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..4ad01297 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,70 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +/.settings + +/venv +MANIFEST +/node_modules/ +/.project +/.pydevproject +/.git +/Dockerfile +/docker-compose.yml +/外部程式 + diff --git a/.travis.yml b/.travis.yml index 64838155..8d6ae533 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,49 +6,26 @@ python: env: - TOX_ENV=tan1uan5 - TOX_ENV=hap8sing5-tsi3giam7 -- TOX_ENV=hap8sing5-hun3lian7 +# - TOX_ENV=hap8sing5-hun3lian7 - TOX_ENV=huan1ik8 +# - TOX_ENV=huan1ik8-gua7bun5 +- TOX_ENV=huan1ik8-tsing3kui1 - TOX_ENV=flake8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - gcc-4.9 - - g++-4.9 - - python3-dev - - libc6-dev-i386 - - linux-libc-dev - - gcc-multilib - - git - - subversion - - automake - - libtool - - zlib1g-dev - - libbz2-dev - - liblzma-dev - - libboost-all-dev - - libgoogle-perftools-dev - - libxmlrpc-c++.*-dev - - cmake - - csh - - libyaml-dev - - libxslt1-dev - - libav-tools - - libmp3lame0 services: +- docker - rabbitmq -install: -- sudo apt-get install -y libavcodec-extra-54 libx11-dev libx11-dev:i386 -- pip install tox -- pip install python-coveralls branches: only: - master - "/\\d+\\.\\d+\\.\\d+/" +before_script: +- sudo rabbitmqctl add_user ti1a2 gau5tsa2 +- sudo rabbitmqctl add_vhost hok8_bu7 +- sudo rabbitmqctl set_permissions -p hok8_bu7 ti1a2 '.*' '.*' '.*' script: -- tox -e $TOX_ENV +- docker build -t tai5-uan5_gian5-gi2_hok8-bu7_travis --build-arg TOX_ENV=$TOX_ENV . after_success: +- docker run --rm tai5-uan5_gian5-gi2_hok8-bu7_travis cat .coverage > .coverage - coverage report - coveralls deploy: diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..1980b7dc --- /dev/null +++ b/Dockerfile @@ -0,0 +1,11 @@ +FROM i3thuan5/tai5-uan5_gian5-gi2_kang1-ku7:0.6.40 +MAINTAINER i3thuan5 + +ARG TOX_ENV + +RUN mkdir -p /usr/local/tai5-uan5_gian5-gi2_hok8-bu7 +WORKDIR /usr/local/tai5-uan5_gian5-gi2_hok8-bu7 +RUN pip3 install tox +COPY . . +RUN echo RABBIT_MQ_TSU2_KI1 = \'`/sbin/ip route|awk '/default/ { print $3 }'`\' >> tai5uan5_gian5gi2_hok8bu7/settings.py +RUN LANG=zh_TW.utf8 tox --sitepackages -e ${TOX_ENV} diff --git a/tai5uan5_gian5gi2_hok8bu7/celery.py b/tai5uan5_gian5gi2_hok8bu7/celery.py index 491bc2a6..7d05b6e8 100644 --- a/tai5uan5_gian5gi2_hok8bu7/celery.py +++ b/tai5uan5_gian5gi2_hok8bu7/celery.py @@ -1,12 +1,23 @@ from __future__ import absolute_import, unicode_literals + import os + from celery import Celery +from django.conf import settings + # set the default Django settings module for the 'celery' program. os.environ.setdefault( 'DJANGO_SETTINGS_MODULE', 'tai5uan5_gian5gi2_hok8bu7.settings') -app = Celery('tai5uan5_gian5gi2_hok8bu7') +try: + rabbitmq = 'amqp://ti1a2:gau5tsa2@{}:5672/hok8_bu7'.format( + settings.RABBIT_MQ_TSU2_KI1 + ) +except AttributeError: + rabbitmq = None + +app = Celery('tai5uan5_gian5gi2_hok8bu7', broker=rabbitmq) # Using a string here means the worker don't have to serialize # the configuration object to child processes. diff --git a/tox.ini b/tox.ini index 76cad282..531ed93d 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,8 @@ commands= coverage run --source=臺灣言語服務 manage.py test -p test*合成整合試驗.py [testenv:hap8sing5-hun3lian7] -whitelist_externals=bash +whitelist_externals = + bash deps = hue7jip8 coverage @@ -25,12 +26,43 @@ commands= [testenv:huan1ik8] passenv = * +whitelist_externals = + bash deps = + hue7jip8 + coverage +commands= + bash 加匯入設定.sh + python manage.py migrate + python manage.py 教典例句 + coverage run --source=臺灣言語服務 manage.py 訓練Moses 台語 + +[testenv:huan1ik8-gua7bun5] +passenv = * +whitelist_externals = + bash +deps = + hue7jip8 coverage commands= + bash 加匯入設定.sh + python manage.py migrate + python manage.py 教典例句 + coverage run --source=臺灣言語服務 manage.py 訓練Moses翻譯做外文 台語 + +[testenv:huan1ik8-tsing3kui1] +passenv = * +whitelist_externals = + bash +deps = + hue7jip8 + coverage +commands= + bash 加匯入設定.sh python manage.py migrate - coverage run --source=臺灣言語服務 manage.py 訓練Moses 詔安腔 - coverage run --source=臺灣言語服務 -a manage.py test 試驗.翻譯.test詔安腔翻譯整合試驗.詔安腔翻譯整合試驗 + python manage.py 教典例句 + coverage run --source=臺灣言語服務 manage.py 訓練Moses正規化 台語 + coverage run --source=臺灣言語服務 -a manage.py test 試驗.翻譯.test台語正規化整合試驗.台語正規化整合試驗 [testenv:flake8] deps = diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\344\273\213\351\235\242.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\344\273\213\351\235\242.py" index 1ea1555e..3da2edcf 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\344\273\213\351\235\242.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\344\273\213\351\235\242.py" @@ -27,7 +27,7 @@ def 正規化翻譯(self, request): if 查詢腔口 not in self.服務.支援腔口(): raise RuntimeError() except (KeyError, RuntimeError): - 查詢腔口 = '閩南語' + 查詢腔口 = '台語' try: 查詢語句 = 連線參數['查詢語句'] except KeyError: @@ -50,7 +50,7 @@ def 標漢字音標(self, request): if 查詢腔口 not in self.服務.支援腔口(): raise RuntimeError() except (KeyError, RuntimeError): - 查詢腔口 = '閩南語' + 查詢腔口 = '台語' try: 查詢語句 = 連線參數['查詢語句'] except KeyError: diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\346\250\241\345\236\213\350\250\223\347\267\264.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\346\250\241\345\236\213\350\250\223\347\267\264.py" index cc07ab39..9e1145c4 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\346\250\241\345\236\213\350\250\223\347\267\264.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\346\250\241\345\236\213\350\250\223\347\267\264.py" @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- +import gzip from os import makedirs from os.path import join, basename +from sys import stderr +from tempfile import TemporaryDirectory -from 臺灣言語服務.輸出 import 資料輸出工具 from 臺灣言語工具.翻譯.摩西工具.摩西翻譯模型訓練 import 摩西翻譯模型訓練 from 臺灣言語工具.翻譯.摩西工具.語句編碼器 import 語句編碼器 from 臺灣言語工具.系統整合.程式腳本 import 程式腳本 @@ -15,28 +17,87 @@ from 臺灣言語工具.語言模型.KenLM語言模型訓練 import KenLM語言模型訓練 from 臺灣言語工具.斷詞.拄好長度辭典揣詞 import 拄好長度辭典揣詞 from 臺灣言語工具.斷詞.語言模型揀集內組 import 語言模型揀集內組 -from 臺灣言語服務.資料模型路徑 import 翻譯語料資料夾 -from 臺灣言語服務.資料模型路徑 import 翻譯模型資料夾 from 臺灣言語工具.解析整理.解析錯誤 import 解析錯誤 +from 臺灣言語服務.models import 訓練過渡格式 +from 臺灣言語工具.斷詞.國教院斷詞用戶端 import 國教院斷詞用戶端 class Moses模型訓練(程式腳本): @classmethod - def 輸出全部語料(cls): - 資料輸出工具().輸出翻譯語料() + def 輸出全部語料(cls, 資料夾): + makedirs(資料夾, exist_ok=True) + + 對齊語句數量 = 0 + with cls._照資料夾開壓縮檔(資料夾, '對齊母語語句.txt.gz') as 對齊母語語句: + with cls._照資料夾開壓縮檔(資料夾, '對齊外語語句.txt.gz') as 對齊外語語句: + for 一筆 in 訓練過渡格式.objects.filter( + 文本__isnull=False, 外文__isnull=False, + 種類='語句' + ): + print(一筆.文本, file=對齊母語語句) + print(一筆.外文, file=對齊外語語句) + 對齊語句數量 += 1 + + 對齊字詞數量 = 0 + with cls._照資料夾開壓縮檔(資料夾, '對齊母語字詞.txt.gz') as 對齊母語字詞: + with cls._照資料夾開壓縮檔(資料夾, '對齊外語字詞.txt.gz') as 對齊外語字詞: + for 一筆 in 訓練過渡格式.objects.filter( + 文本__isnull=False, 外文__isnull=False, + 種類='字詞' + ): + print(一筆.文本, file=對齊母語字詞) + print(一筆.外文, file=對齊外語字詞) + 對齊字詞數量 += 1 + + 語句數 = 0 + with cls._照資料夾開壓縮檔(資料夾, '語句文本.txt.gz') as 語句文本: + for 一筆 in 訓練過渡格式.objects.filter(文本__isnull=False, 種類='語句'): + print(一筆.文本, file=語句文本) + 語句數 += 1 + 字詞數 = 0 + with cls._照資料夾開壓縮檔(資料夾, '字詞文本.txt.gz') as 字詞文本: + for 一筆 in 訓練過渡格式.objects.filter(文本__isnull=False, 種類='字詞'): + print(一筆.文本, file=字詞文本) + 字詞數 += 1 + return 對齊語句數量, 對齊字詞數量, 語句數, 字詞數 @classmethod - def 訓練一个摩西翻譯模型(cls, 語言, 語族): - 語料資料夾 = 翻譯語料資料夾(語言) - 模型資料夾 = 翻譯模型資料夾(語言) + def _照資料夾開壓縮檔(cls, 資料夾, 檔名): + return gzip.open(join(資料夾, 檔名), 'wt') + + @classmethod + def 訓練翻譯做母語模型(cls, 語料資料夾, 模型資料夾): + 平行華語, 平行母語, 母語文本 = cls._原始語料(語料資料夾) + 模型訓練 = 摩西翻譯模型訓練() + 模型訓練.訓練( + 平行華語, 平行母語, 母語文本, + 模型資料夾, + 連紲詞長度=3, + 編碼器=語句編碼器(), # 若用著Unicdoe擴充就需要, + 使用記憶體量='80%', + 刣掉暫存檔=False, + ) + + @classmethod + def 訓練翻譯做外文模型(cls, 語料資料夾, 模型資料夾): + 平行華語, 平行母語, _母語文本 = cls._原始語料(語料資料夾) + with TemporaryDirectory() as 暫存資料夾: + 平行斷詞華語 = cls._外文斷詞(平行華語, 暫存資料夾) + 模型訓練 = 摩西翻譯模型訓練() + 模型訓練.訓練( + 平行母語, 平行斷詞華語, 平行斷詞華語, + 模型資料夾, + 連紲詞長度=3, + 編碼器=語句編碼器(), # 若用著Unicdoe擴充就需要, + 使用記憶體量='80%', + 刣掉暫存檔=False, + ) + + @classmethod + def 訓練正規化模型(cls, 語料資料夾, 模型資料夾): makedirs(模型資料夾, exist_ok=True) - if 語族 == '漢語': - 平行華語, 平行母語, 母語文本 = cls._漢語語料訓練(語料資料夾, 模型資料夾) - elif 語族 == '南島語': - 平行華語, 平行母語, 母語文本 = cls._南島語語料訓練(語料資料夾, 模型資料夾) - else: - raise RuntimeError('{}的語族無設定!!'.format(語族)) + 平行華語, 平行母語, 母語文本 = cls._漢語語料訓練(語料資料夾, 模型資料夾) 模型訓練 = 摩西翻譯模型訓練() 模型訓練.訓練( @@ -44,6 +105,7 @@ def 訓練一个摩西翻譯模型(cls, 語言, 語族): 模型資料夾, 連紲詞長度=3, 編碼器=語句編碼器(), # 若用著Unicdoe擴充就需要, + 使用記憶體量='80%', 刣掉暫存檔=False, ) @@ -117,7 +179,7 @@ def _文本檔轉模型物件(cls, 語言資料夾, 母語辭典檔名): 母語辭典檔名, join(語言資料夾, '語言模型資料夾'), 連紲詞長度=3, - 使用記憶體量='20%', + 使用記憶體量='80%', ) return KenLM語言模型(模型檔) @@ -139,5 +201,18 @@ def _原始語料(cls, 語言資料夾): return 平行華語, 平行母語, 母語文本 @classmethod - def _南島語語料訓練(cls, 語言資料夾, 翻譯模型資料夾): - return cls._漢語語料訓練(語言資料夾, 翻譯模型資料夾) + def _外文斷詞(cls, 語料陣列, 暫存資料夾): + 斷詞檔名 = join(暫存資料夾, '外文斷詞.txt.gz') + 幾逝 = 0 + with gzip.open(斷詞檔名, 'wt') as 寫檔: + for 原本檔案 in 語料陣列: + for 一逝 in cls._讀檔案(原本檔案): + 斷詞結果 = [] + 句物件 = 拆文分析器.分詞句物件(一逝) + for 詞條, 詞性 in 國教院斷詞用戶端.語句斷詞做陣列(句物件.看型(' ', ' ')): + 斷詞結果.append("{}-(-{}-)".format(詞條, 詞性)) + print(' '.join(斷詞結果), file=寫檔) + 幾逝 += 1 + if 幾逝 % 100 == 0: + print('外文斷 {} 句矣'.format(幾逝), file=stderr) + return [斷詞檔名] diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\350\274\211\345\205\245.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\350\274\211\345\205\245.py" index bb8f8e3a..f8ab97ac 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\350\274\211\345\205\245.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/Moses\350\274\211\345\205\245.py" @@ -9,7 +9,7 @@ from 臺灣言語工具.語言模型.KenLM語言模型 import KenLM語言模型 from 臺灣言語工具.翻譯.摩西工具.摩西用戶端 import 摩西用戶端 from 臺灣言語工具.翻譯.摩西工具.語句編碼器 import 語句編碼器 -from 臺灣言語服務.資料模型路徑 import 翻譯模型資料夾 +from 臺灣言語服務.資料模型路徑 import 翻譯正規化模型資料夾 class Moses載入: @@ -30,7 +30,7 @@ def 摩西模型(cls): @classmethod def 摩西翻譯模型(cls, 母語腔口, 摩西埠): - 母語翻譯模型資料夾 = 翻譯模型資料夾(母語腔口) + 母語翻譯模型資料夾 = 翻譯正規化模型資料夾(母語腔口) 服務 = 摩西服務端(母語翻譯模型資料夾, 埠=摩西埠) 服務.走() diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses.py" index 9f82ecb1..00607b8d 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses.py" @@ -1,33 +1,29 @@ -from sys import stderr -import traceback - -from django.conf import settings from django.core.management.base import BaseCommand from 臺灣言語服務.Moses模型訓練 import Moses模型訓練 +from 臺灣言語服務.資料模型路徑 import 翻譯語料資料夾 +from 臺灣言語服務.資料模型路徑 import 翻譯做母語模型資料夾 from 臺灣言語工具.翻譯.摩西工具.安裝摩西翻譯佮相關程式 import 安裝摩西翻譯佮相關程式 class Command(BaseCommand): help = ( - '訓練Moses模型,會當選愛訓練啥物語言抑是全部語言的。\n' + '訓練Moses模型,會用資料庫全部ê語料來訓練。\n' '裝Moses程式,掠而且編譯,可能愛半點鐘以上' ) + def 翻譯做資料夾(self): + return 翻譯做母語模型資料夾 + + def 訓練做(self): + return Moses模型訓練.訓練翻譯做母語模型 + def add_arguments(self, parser): parser.add_argument( '語言', type=str, - nargs='*', - help='愛訓練的語言' - ) - parser.add_argument( - '--全部語言攏訓練', - dest='全部語言', - default=False, - action='store_const', - const=True, + help='輸出的語言資料夾名' ) parser.add_argument( '--編譯核心數', @@ -37,24 +33,10 @@ def add_arguments(self, parser): ) def handle(self, *args, **參數): - if not 參數['全部語言'] and len(參數['語言']) == 0: - self.stdout.write('請指明愛訓練啥物語言的Moses模型!!') - return - if 參數['全部語言'] and len(參數['語言']) > 0: - self.stdout.write('愛訓練全部語言的Moses模型無?!') - return - if 參數['全部語言']: - 語言陣列 = sorted(settings.HOK8_BU7_SIAT4_TING7.keys()) - else: - 語言陣列 = 參數['語言'] 安裝摩西翻譯佮相關程式.安裝gizapp() 安裝摩西翻譯佮相關程式.安裝moses(編譯CPU數=參數['核心數']) - Moses模型訓練.輸出全部語料() - for 一个語言 in 語言陣列: - try: - 服務設定 = settings.HOK8_BU7_SIAT4_TING7[一个語言] - Moses模型訓練.訓練一个摩西翻譯模型(一个語言, 服務設定['語族']) - except FileNotFoundError: - print('訓練「{}」時發生問題!!'.format(一个語言), file=stderr) - traceback.print_exc() - print(file=stderr) + 語言 = 參數['語言'] + 語料資料夾 = 翻譯語料資料夾(語言) + 模型資料夾 = self.翻譯做資料夾()(語言) + Moses模型訓練.輸出全部語料(語料資料夾) + self.訓練做()(語料資料夾, 模型資料夾) diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\346\255\243\350\246\217\345\214\226.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\346\255\243\350\246\217\345\214\226.py" new file mode 100644 index 00000000..4b696830 --- /dev/null +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\346\255\243\350\246\217\345\214\226.py" @@ -0,0 +1,13 @@ + + +from 臺灣言語服務.Moses模型訓練 import Moses模型訓練 +from 臺灣言語服務.management.commands.訓練Moses import Command as 訓練Moses +from 臺灣言語服務.資料模型路徑 import 翻譯正規化模型資料夾 + + +class Command(訓練Moses): + def 翻譯做資料夾(self): + return 翻譯正規化模型資料夾 + + def 訓練做(self): + return Moses模型訓練.訓練正規化模型 diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\347\277\273\350\255\257\345\201\232\345\244\226\346\226\207.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\347\277\273\350\255\257\345\201\232\345\244\226\346\226\207.py" new file mode 100644 index 00000000..cc7e789a --- /dev/null +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/management/commands/\350\250\223\347\267\264Moses\347\277\273\350\255\257\345\201\232\345\244\226\346\226\207.py" @@ -0,0 +1,12 @@ + +from 臺灣言語服務.Moses模型訓練 import Moses模型訓練 +from 臺灣言語服務.資料模型路徑 import 翻譯做外文模型資料夾 +from 臺灣言語服務.management.commands.訓練Moses import Command as 訓練Moses + + +class Command(訓練Moses): + def 翻譯做資料夾(self): + return 翻譯做外文模型資料夾 + + def 訓練做(self): + return Moses模型訓練.訓練翻譯做外文模型 diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\263\207\346\226\231\346\250\241\345\236\213\350\267\257\345\276\221.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\263\207\346\226\231\346\250\241\345\236\213\350\267\257\345\276\221.py" index 542db443..dcbce55e 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\263\207\346\226\231\346\250\241\345\236\213\350\267\257\345\276\221.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\263\207\346\226\231\346\250\241\345\236\213\350\267\257\345\276\221.py" @@ -12,8 +12,16 @@ def 翻譯語料資料夾(語言): return join(資料路徑, 語言, '翻譯語料') -def 翻譯模型資料夾(語言): - return join(資料路徑, 語言, '翻譯模型') +def 翻譯做母語模型資料夾(語言): + return join(資料路徑, 語言, '翻譯做母語模型') + + +def 翻譯做外文模型資料夾(語言): + return join(資料路徑, 語言, '翻譯做外文模型') + + +def 翻譯正規化模型資料夾(語言): + return join(資料路徑, 語言, '翻譯正規化模型') def 合成模型資料夾(語言): diff --git "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\274\270\345\207\272.py" "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\274\270\345\207\272.py" index 476edf5d..623016e6 100644 --- "a/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\274\270\345\207\272.py" +++ "b/\350\207\272\347\201\243\350\250\200\350\252\236\346\234\215\345\213\231/\350\274\270\345\207\272.py" @@ -5,24 +5,14 @@ from django.db.models.query_utils import Q -from 臺灣言語資料庫.資料模型 import 外語表 from 臺灣言語資料庫.欄位資訊 import 語句 from 臺灣言語資料庫.欄位資訊 import 字詞 from 臺灣言語資料庫.資料模型 import 語言腔口表 -from 臺灣言語資料庫.資料模型 import 影音表 from 臺灣言語資料庫.資料模型 import 文本表 from 臺灣言語服務.資料模型路徑 import 翻譯語料資料夾 class 資料輸出工具: - 翻譯語料檔名 = [ - '對齊外語語句', - '對齊母語語句', - '語句文本', - '對齊外語字詞', - '對齊母語字詞', - '字詞文本', - ] 文本語料檔名 = [ '語句文本', '字詞文本', @@ -36,51 +26,6 @@ def __init__(self, 要求語言=None): self.條件 = Q(語言腔口__語言腔口=要求語言) self.腔口條件 = Q(語言腔口=要求語言) - def 輸出翻譯語料(self): - 檔案表 = self._建立檔案表( - 語言腔口表.揣出有語句文本的語言腔口().filter(self.腔口條件), self.翻譯語料檔名 - ) - for 外語 in 外語表.全部外語資料().filter(self.條件): - try: - 檔案表欄位 = 檔案表[外語.語言腔口.語言腔口][外語.種類.種類] - except KeyError: - pass - else: - self._加文本翻譯語料( - 檔案表欄位, [外語.分詞資料()], 外語.翻譯文本, '文本' - ) - for 影音關係 in 外語.翻譯影音.all(): - 影音 = 影音關係.影音 - self._加文本翻譯語料( - 檔案表欄位, [外語.分詞資料()], 影音.影音文本, '文本' - ) - - for 影音 in 影音表.源頭的影音資料().filter(self.條件): - try: - 檔案表欄位 = 檔案表[影音.語言腔口.語言腔口][影音.種類.種類] - except KeyError: - pass - else: - self._加文本翻譯語料( - 檔案表欄位, [], 影音.影音文本, '文本' - ) - for 文本 in 文本表.源頭的文本資料().filter(self.條件): - try: - 檔案表欄位 = 檔案表[文本.語言腔口.語言腔口][文本.種類.種類] - except KeyError: - pass - else: - 分詞資料 = 文本.分詞資料() - if 文本.文本校對.exists(): - self._加文本翻譯語料( - 檔案表欄位, [分詞資料], 文本.文本校對, '新文本' - ) - else: - print(分詞資料, file=檔案表欄位['對齊外語']) - print(分詞資料, file=檔案表欄位['對齊母語']) - print(分詞資料, file=檔案表欄位['文本']) - self._關檔案表的檔案(檔案表) - def 輸出文本語料(self): 檔案表 = self._建立檔案表( 語言腔口表.揣出有文本的語言腔口().filter(self.腔口條件), self.文本語料檔名 @@ -109,17 +54,3 @@ def _關檔案表的檔案(self, 檔案表): for 種類內檔案 in 腔檔案.values(): for 一个檔案 in 種類內檔案.values(): 一个檔案.close() - - def _加文本翻譯語料(self, 檔案表, 目前資料, 關係表, 文本物件名): - for 文本關係 in 關係表.all(): - 文本 = getattr(文本關係, 文本物件名) - 分詞資料 = 文本.分詞資料() - 目前資料.append(分詞資料) - if 文本.文本校對.exists(): - self._加文本翻譯語料(檔案表, 目前資料, 文本.文本校對, '新文本') - else: - print('\n'.join(目前資料), file=檔案表['對齊外語']) - for _ in 目前資料: - print(分詞資料, file=檔案表['對齊母語']) - print(分詞資料, file=檔案表['文本']) - 目前資料.pop() diff --git "a/\350\251\246\351\251\227/\347\277\273\350\255\257/test\351\226\251\345\215\227\350\252\236\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\345\217\260\350\252\236\346\255\243\350\246\217\345\214\226\346\225\264\345\220\210\350\251\246\351\251\227.py" similarity index 76% rename from "\350\251\246\351\251\227/\347\277\273\350\255\257/test\351\226\251\345\215\227\350\252\236\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" rename to "\350\251\246\351\251\227/\347\277\273\350\255\257/test\345\217\260\350\252\236\346\255\243\350\246\217\345\214\226\346\225\264\345\220\210\350\251\246\351\251\227.py" index e4771b52..c5c17420 100644 --- "a/\350\251\246\351\251\227/\347\277\273\350\255\257/test\351\226\251\345\215\227\350\252\236\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" +++ "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\345\217\260\350\252\236\346\255\243\350\246\217\345\214\226\346\225\264\345\220\210\350\251\246\351\251\227.py" @@ -6,31 +6,29 @@ from django.test.testcases import TestCase -from 臺灣言語服務.Moses模型訓練 import Moses模型訓練 from 臺灣言語服務.Moses載入 import Moses載入 from 臺灣言語服務.Moses服務 import Moses服務 from 臺灣言語服務.Moses介面 import Moses介面 -class 閩南語翻譯整合試驗(TestCase): +class 台語正規化整合試驗(TestCase): @classmethod def setUpClass(cls): super(cls, cls).setUpClass() - try: - cls.服務 = Moses服務({'閩南語': Moses載入.摩西翻譯模型('閩南語', 8500)}) - except OSError: - Moses模型訓練.訓練一个摩西翻譯模型('閩南語', '漢語') - cls.服務 = Moses服務({'閩南語': Moses載入.摩西翻譯模型('閩南語', 8500)}) + cls.服務 = Moses服務({'台語': Moses載入.摩西翻譯模型('台語', 8500)}) + cls.locatePatch = patch('Pyro4.locateNS') cls.ProxyPatch = patch('Pyro4.Proxy') + cls.locatePatch.start() ProxyMock = cls.ProxyPatch.start() ProxyMock.return_value = cls.服務 - sleep(60) + sleep(30) @classmethod def tearDownClass(cls): - cls.服務.停() + cls.locatePatch.stop() cls.ProxyPatch.stop() + cls.服務.停() def setUp(self): self.服務功能 = Moses介面() @@ -38,7 +36,7 @@ def setUp(self): def test_短詞翻譯(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': '你好' } 連線回應 = self.服務功能.正規化翻譯(連線要求) @@ -50,7 +48,7 @@ def test_短詞翻譯(self): def test_有多元書寫(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': '你好' } 連線回應 = self.服務功能.正規化翻譯(連線要求) @@ -61,7 +59,7 @@ def test_有多元書寫(self): def test_兩句翻譯(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': '你好嗎?我很好!' } 連線回應 = self.服務功能.正規化翻譯(連線要求) @@ -70,15 +68,15 @@ def test_兩句翻譯(self): self.assertIn('分詞', 回應物件) self.assertIn('綜合標音', 回應物件) - def test_無腔口預設閩南語(self): + def test_無腔口預設台語(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': '你好嗎?我很好!' } 連線回應 = self.服務功能.正規化翻譯(連線要求) self.assertEqual(連線回應.status_code, 200) - 閩南語回應物件 = json.loads(連線回應.content.decode("utf-8")) + 台語回應物件 = json.loads(連線回應.content.decode("utf-8")) 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { @@ -88,33 +86,32 @@ def test_無腔口預設閩南語(self): 連線回應 = self.服務功能.正規化翻譯(連線要求) self.assertEqual(連線回應.status_code, 200) 回應物件 = json.loads(連線回應.content.decode("utf-8")) - self.assertEqual(回應物件, 閩南語回應物件) + self.assertEqual(回應物件, 台語回應物件) - def test_無參數預設閩南語(self): + def test_無參數預設台語(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': '你好嗎?我很好!' } 連線回應 = self.服務功能.正規化翻譯(連線要求) self.assertEqual(連線回應.status_code, 200) - 閩南語回應物件 = json.loads(連線回應.content.decode("utf-8")) + 台語回應物件 = json.loads(連線回應.content.decode("utf-8")) 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = {} 連線回應 = self.服務功能.正規化翻譯(連線要求) self.assertEqual(連線回應.status_code, 200) 回應物件 = json.loads(連線回應.content.decode("utf-8")) - self.assertEqual(回應物件, 閩南語回應物件) + self.assertEqual(回應物件, 台語回應物件) def test_一个空白(self): 連線要求 = RequestFactory().get('/正規化翻譯') 連線要求.GET = { - '查詢腔口': '閩南語', + '查詢腔口': '台語', '查詢語句': ' ' } 連線回應 = self.服務功能.正規化翻譯(連線要求) self.assertEqual(連線回應.status_code, 200) 回應物件 = json.loads(連線回應.content.decode("utf-8")) self.assertIn('分詞', 回應物件) - self.assertIn('綜合標音', 回應物件) diff --git "a/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\251\224\345\256\211\350\205\224\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\251\224\345\256\211\350\205\224\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" index 11f7bb4c..5faa2221 100644 --- "a/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\251\224\345\256\211\350\205\224\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" +++ "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\251\224\345\256\211\350\205\224\347\277\273\350\255\257\346\225\264\345\220\210\350\251\246\351\251\227.py" @@ -10,6 +10,7 @@ from 臺灣言語服務.Moses載入 import Moses載入 from 臺灣言語服務.Moses服務 import Moses服務 from 臺灣言語服務.Moses介面 import Moses介面 +from 臺灣言語工具.翻譯.摩西工具.安裝摩西翻譯佮相關程式 import 安裝摩西翻譯佮相關程式 class 詔安腔翻譯整合試驗(TestCase): @@ -17,11 +18,10 @@ class 詔安腔翻譯整合試驗(TestCase): @classmethod def setUpClass(cls): super(cls, cls).setUpClass() - try: - cls.服務 = Moses服務({'詔安腔': Moses載入.摩西翻譯模型('詔安腔', 8501)}) - except Exception: - Moses模型訓練.訓練一个摩西翻譯模型('詔安腔', '漢語') - cls.服務 = Moses服務({'詔安腔': Moses載入.摩西翻譯模型('詔安腔', 8501)}) + 安裝摩西翻譯佮相關程式.安裝gizapp() + 安裝摩西翻譯佮相關程式.安裝moses(編譯CPU數=4) + Moses模型訓練.訓練正規化模型('詔安腔', '漢語') + cls.服務 = Moses服務({'詔安腔': Moses載入.摩西翻譯模型('詔安腔', 8501)}) cls.locatePatch = patch('Pyro4.locateNS') cls.ProxyPatch = patch('Pyro4.Proxy') cls.locatePatch.start() diff --git "a/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" new file mode 100644 index 00000000..d41bf7bf --- /dev/null +++ "b/\350\251\246\351\251\227/\347\277\273\350\255\257/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" @@ -0,0 +1,143 @@ +import gzip +from os.path import join, isfile, isdir +from shutil import rmtree + +from django.test.testcases import TestCase + + +from 臺灣言語服務.資料模型路徑 import 翻譯語料資料夾 +from 臺灣言語服務.Moses模型訓練 import Moses模型訓練 +from 臺灣言語服務.models import 訓練過渡格式 + + +class 翻譯試驗(TestCase): + 公家內容 = {'來源': 'Dr. Pigu', '年代': '2017', } + + def setUp(self): + self.目錄 = 翻譯語料資料夾('臺灣話') + + def tearDown(self): + if isdir(翻譯語料資料夾('臺灣話')): + rmtree(翻譯語料資料夾('臺灣話')) + if isdir(翻譯語料資料夾('臺語')): + rmtree(翻譯語料資料夾('臺語')) + + def test_有語句檔案(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz'))) + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz'))) + + def test_有字詞檔案(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='字詞', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊外語字詞.txt.gz'))) + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊母語字詞.txt.gz'))) + + def test_有做語言模型的文本(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz'))) + self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '字詞文本.txt.gz'))) + + def test_外語母語語句對應檢查對齊語句(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), + sorted(['你好嗎?']) + ) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), + sorted(['食飽未?']) + ) + + def test_外語母語語句對應檢查對齊字詞(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語字詞.txt.gz')), + [] + ) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語字詞.txt.gz')), + [] + ) + + def test_外語母語語句對應檢查文本(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), + ['食飽未?'] + ) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '字詞文本.txt.gz')), + [] + ) + + def test_一個文本(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', + 種類='語句', **self.公家內容 + ) + Moses模型訓練.輸出全部語料(self.目錄) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), + [] + ) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), + [] + ) + self.assertEqual( + self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), + ['食飽未?'] + ) + + def test_檢查翻譯數量(self): + 訓練過渡格式.objects.create( + 文本='食飽未?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + 訓練過渡格式.objects.create( + 文本='食飽未 ?', 外文='你好嗎?', + 種類='語句', **self.公家內容 + ) + 訓練過渡格式.objects.create( + 文本='未', 外文='嗎', + 種類='字詞', **self.公家內容 + ) + 訓練過渡格式.objects.create( + 文本='食飽啦!', + 種類='語句', **self.公家內容 + ) + 訓練過渡格式.objects.create( + 文本='食', + 種類='字詞', **self.公家內容 + ) + 輸出數量 = Moses模型訓練.輸出全部語料(self.目錄) + self.assertEqual(輸出數量, (2, 1, 3, 2)) + + def 得著檔案資料(self, 檔名): + with gzip.open(檔名, 'rt') as 檔案: + return sorted([逝.strip() for 逝 in 檔案.readlines()]) diff --git "a/\350\251\246\351\251\227/\350\274\270\345\207\272/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" "b/\350\251\246\351\251\227/\350\274\270\345\207\272/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" deleted file mode 100644 index 4eddcb88..00000000 --- "a/\350\251\246\351\251\227/\350\274\270\345\207\272/test\350\274\270\345\207\272\347\277\273\350\255\257\345\226\256\345\205\203\350\251\246\351\251\227.py" +++ /dev/null @@ -1,309 +0,0 @@ -import gzip -import io -from os.path import join, isfile, isdir, exists -from shutil import rmtree -from unittest.mock import patch -import wave - -from django.test.testcases import TestCase - - -from 臺灣言語資料庫.資料模型 import 版權表 -from 臺灣言語資料庫.欄位資訊 import 會使公開 -from 臺灣言語資料庫.欄位資訊 import 字詞 -from 臺灣言語資料庫.資料模型 import 來源表 -from 臺灣言語資料庫.資料模型 import 外語表 -from 臺灣言語資料庫.資料模型 import 文本表 -from 臺灣言語資料庫.資料模型 import 影音表 -from 臺灣言語服務.輸出 import 資料輸出工具 -from 臺灣言語服務.資料模型路徑 import 翻譯語料資料夾 - - -class 翻譯試驗(TestCase): - - def setUp(self): - 版權表.objects.create(版權=會使公開) - Pigu = 來源表.objects.create(名='Dr. Pigu') - self.資料內容 = { - '收錄者': Pigu.編號(), - '來源': Pigu.編號(), - '版權': '會使公開', - '種類': '語句', - '語言腔口': '臺灣話', - '著作所在地': '花蓮', - '著作年': '2015', - } - - self.語料 = 資料輸出工具() - self.目錄 = 翻譯語料資料夾('臺灣話') - - def tearDown(self): - if isdir(翻譯語料資料夾('臺灣話')): - rmtree(翻譯語料資料夾('臺灣話')) - if isdir(翻譯語料資料夾('臺語')): - rmtree(翻譯語料資料夾('臺語')) - - def test_無語料就啥物攏無(self): - self.語料.輸出翻譯語料() - self.assertFalse(exists(self.目錄)) - - def test_愛有一筆無語料就啥物攏無(self): - self.加一筆外語你好嗎() - self.語料.輸出翻譯語料() - self.assertFalse(exists(self.目錄)) - - def test_有語句檔案(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz'))) - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz'))) - - def test_有字詞檔案(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊外語字詞.txt.gz'))) - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '對齊母語字詞.txt.gz'))) - - def test_有做語言模型的文本(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz'))) - self.assertTrue(isfile(join(翻譯語料資料夾('臺灣話'), '字詞文本.txt.gz'))) - - def test_外語母語語句對應檢查對齊語句(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - sorted(['你-好-嗎 ?', '食-飽-未 ?']) - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - sorted(['食-飽-未 ?', '食-飽-未 ?']) - ) - - def test_外語母語語句對應檢查對齊字詞(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語字詞.txt.gz')), - [] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語字詞.txt.gz')), - [] - ) - - def test_外語母語語句對應檢查文本(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), - ['食-飽-未 ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '字詞文本.txt.gz')), - [] - ) - - def test_愛有語句才有輸出(self): - self.資料內容['種類'] = 字詞 - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - self.assertFalse(exists(self.目錄)) - - def test_外語雙母語對應(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - sorted(['你-好-嗎 ?', '你-好-嗎 ?', '食-飽-未 ?', '食-飽-未 ?']) - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - sorted(['食-飽-未 ?', '食-飽-未 ?', '食-飽-未 ?', '食-飽-未 ?']) - ) - - def test_外語影音母語對應(self): - 外語 = self.加一筆外語你好嗎() - 影音 = self.外語加一筆母語影音(外語) - self.母語影音加一筆食飽未(影音) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - sorted(['你-好-嗎 ?', '食-飽-未 ?']) - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - sorted(['食-飽-未 ?', '食-飽-未 ?']) - ) - - def test_外語母語文本兩層對應檢查對齊語句(self): - 外語 = self.加一筆外語你好嗎() - 第一層文本 = self.外語加一筆母語食飽未(外語) - self.母語文本加一筆食飽未矣(第一層文本) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - sorted(['你-好-嗎 ?', '食-飽-未 ?', '食-飽-未-矣 ! ?']) - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - sorted(['食-飽-未-矣 ! ?', '食-飽-未-矣 ! ?', '食-飽-未-矣 ! ?']) - ) - - def test_外語母語文本兩層對應檢查文本(self): - 外語 = self.加一筆外語你好嗎() - 第一層文本 = self.外語加一筆母語食飽未(外語) - self.母語文本加一筆食飽未矣(第一層文本) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), - ['食-飽-未-矣 ! ?'] - ) - - def test_影音母語對應(self): - 影音 = self.加一筆影音食飽未() - self.母語影音加一筆食飽未(影音) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - ['食-飽-未 ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - ['食-飽-未 ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), - ['食-飽-未 ?'] - ) - - def test_一个影音無對應(self): - self.加一筆影音食飽未() - self.語料.輸出翻譯語料() - self.assertFalse(exists(self.目錄)) - - def test_一個文本(self): - self.加一筆母語食飽未() - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - ['食-飽-未 ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - ['食-飽-未 ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), - ['食-飽-未 ?'] - ) - - def test_一個文本愛有語句才有輸出(self): - self.資料內容['種類'] = 字詞 - self.加一筆母語食飽未() - self.語料.輸出翻譯語料() - self.assertFalse(exists(self.目錄)) - - def test_兩層文本(self): - 第一層文本 = self.加一筆母語食飽未() - self.母語文本加一筆食飽未矣(第一層文本) - self.語料.輸出翻譯語料() - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊外語語句.txt.gz')), - sorted(['食-飽-未 ?', '食-飽-未-矣 ! ?']) - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '對齊母語語句.txt.gz')), - ['食-飽-未-矣 ! ?', '食-飽-未-矣 ! ?'] - ) - self.assertEqual( - self.得著檔案資料(join(翻譯語料資料夾('臺灣話'), '語句文本.txt.gz')), - ['食-飽-未-矣 ! ?'] - ) - - @patch('臺灣言語資料庫.資料模型.文本表.分詞資料') - def test_外語文本用格式化輸出(self, 分詞資料mocka): - 分詞資料mocka.return_value = '' - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料.輸出翻譯語料() - 分詞資料mocka.assert_called_once_with() - - @patch('臺灣言語資料庫.資料模型.文本表.分詞資料') - def test_文本用格式化輸出(self, 分詞資料mocka): - 分詞資料mocka.return_value = '' - self.加一筆母語食飽未() - self.語料.輸出翻譯語料() - 分詞資料mocka.assert_called_once_with() - - def test_無仝語言袂使出現(self): - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.資料內容['語言腔口'] = '臺語' - 外語 = self.加一筆外語你好嗎() - self.外語加一筆母語食飽未(外語) - self.語料 = 資料輸出工具('臺語').輸出翻譯語料() - self.assertFalse(exists(翻譯語料資料夾('臺灣話'))) - - def 加一筆外語你好嗎(self): - 外語內容 = {'外語語言': '華語', '外語資料': '你好嗎?'} - 外語內容.update(self.資料內容) - return 外語表.加資料(外語內容) - - def 外語加一筆母語食飽未(self, 外語): - 文本內容 = {'文本資料': '食飽未?'} - 文本內容.update(self.資料內容) - return 外語.翻母語(文本內容) - - def 外語加一筆母語影音(self, 外語): - 影音資料 = io.BytesIO() - with wave.open(影音資料, 'wb') as 音檔: - 音檔.setnchannels(1) - 音檔.setframerate(16000) - 音檔.setsampwidth(2) - 音檔.writeframesraw(b'0' * 100) - 影音內容 = {'影音資料': 影音資料} - 影音內容.update(self.資料內容) - return 外語.錄母語(影音內容) - - def 加一筆影音食飽未(self): - 影音資料 = io.BytesIO() - with wave.open(影音資料, 'wb') as 音檔: - 音檔.setnchannels(1) - 音檔.setframerate(16000) - 音檔.setsampwidth(2) - 音檔.writeframesraw(b'0' * 100) - 影音內容 = {'影音資料': 影音資料} - 影音內容.update(self.資料內容) - return 影音表.加資料(影音內容) - - def 母語影音加一筆食飽未(self, 影音): - 文本內容 = {'文本資料': '食飽未?'} - 文本內容.update(self.資料內容) - return 影音.寫文本(文本內容) - - def 加一筆母語食飽未(self): - 文本內容 = {'文本資料': '食飽未?'} - 文本內容.update(self.資料內容) - return 文本表.加資料(文本內容) - - def 母語文本加一筆食飽未矣(self, 文本): - 文本內容 = {'文本資料': '食飽未矣 ! ?'} - 文本內容.update(self.資料內容) - return 文本.校對做(文本內容) - - def 得著檔案資料(self, 檔名): - with gzip.open(檔名, 'rt') as 檔案: - return sorted([逝.strip() for 逝 in 檔案.readlines()])