Skip to content
This repository has been archived by the owner on May 14, 2024. It is now read-only.

Commit

Permalink
Merge pull request #236 from sih4sing5hong5/輸出辭典模組化
Browse files Browse the repository at this point in the history
輸出辭典模組化 fix #157
  • Loading branch information
sih4sing5hong5 committed Apr 3, 2018
2 parents 8fb2539 + 43af55c commit da9a075
Show file tree
Hide file tree
Showing 24 changed files with 409 additions and 244 deletions.
3 changes: 1 addition & 2 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ sudo: true
dist: trusty
language: python
python:
- '3.4'
- '3.5'
env:
- TOX_ENV=tan1uan5
Expand Down Expand Up @@ -60,4 +59,4 @@ deploy:
on:
tags: true
repo: sih4sing5hong5/tai5-uan5_gian5-gi2_hok8-bu7
condition: $TRAVIS_PYTHON_VERSION == '3.4' && $TOX_ENV = 'tan1uan5'
condition: $TRAVIS_PYTHON_VERSION == '3.5' && $TOX_ENV = 'tan1uan5'
2 changes: 1 addition & 1 deletion 加匯入設定.sh
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
#!/bin/bash
echo "INSTALLED_APPS += ('匯入到臺灣言語資料庫',)" >> tai5uan5_gian5gi2_hok8bu7/settings.py
echo "INSTALLED_APPS += ('匯入',)" >> tai5uan5_gian5gi2_hok8bu7/settings.py
125 changes: 62 additions & 63 deletions 臺灣言語服務/Kaldi語料匯出.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,9 @@
from 臺灣言語工具.系統整合.程式腳本 import 程式腳本
from 臺灣言語工具.解析整理.拆文分析器 import 拆文分析器
from 臺灣言語工具.語言模型.KenLM語言模型訓練 import KenLM語言模型訓練
from 臺灣言語服務.漢語語音處理 import 漢語語音處理
from 臺灣言語工具.基本物件.公用變數 import 標點符號
from 臺灣言語工具.基本物件.公用變數 import 無音
from 臺灣言語工具.基本物件.公用變數 import 分詞符號
from 臺灣言語工具.基本物件. import
from 臺灣言語服務.models import 訓練過渡格式


Expand All @@ -31,7 +29,7 @@ def 初使化辭典資料(cls):
}

@classmethod
def 匯出一種語言語料(cls, 語言, 音標系統, 語料資料夾, 資料夾名, 辭典資料, 匯出條件=Q()):
def 匯出一種語言語料(cls, 語言, 辭典輸出物件, 語料資料夾, 資料夾名, 辭典資料, 匯出條件=Q()):
訓練語料資料夾 = join(語料資料夾, 資料夾名, 'train')
if isdir(訓練語料資料夾):
rmtree(訓練語料資料夾)
Expand All @@ -42,15 +40,15 @@ def 匯出一種語言語料(cls, 語言, 音標系統, 語料資料夾, 資料
with cls._寫檔(訓練語料資料夾, 'reco2file_and_channel') as 音檔對應頻道:
with cls._寫檔(訓練語料資料夾, 'utt2spk') as 語句對應語者:
return cls._揣影音輸出(
語言, 音標系統,
辭典輸出物件,
聽拍內容, 音檔目錄, 語句目錄, 音檔對應頻道, 語句對應語者, 辭典資料,
匯出條件,
)

@classmethod
def 辭典資料載入語句文本(cls, 語言文本, 音標系統, 辭典資料):
def 辭典資料載入語句文本(cls, 語言文本, 辭典輸出物件, 辭典資料):
for 一逝 in cls._讀檔案(語言文本):
這擺參數 = {'音標系統': 音標系統, '一逝': 一逝, '加語料': False}
這擺參數 = {'辭典輸出物件': 辭典輸出物件, '一逝': 一逝, '加語料': False}
這擺參數.update(辭典資料)
cls._資料加到辭典(**這擺參數)

Expand Down Expand Up @@ -87,7 +85,7 @@ def 匯出語言模型(cls, 語言文本, 連紲詞長度, 語料資料夾, 資
KenLM語言模型訓練().訓練([語言文本], 訓練語料資料夾, 連紲詞長度=連紲詞長度)

@classmethod
def _資料加到辭典(cls, 聲類, 韻類, 調類, 全部詞, 全部句, 一逝, 音標系統, 加語料):
def _資料加到辭典(cls, 聲類, 韻類, 調類, 全部詞, 全部句, 一逝, 辭典輸出物件, 加語料):
章物件 = 拆文分析器.分詞章物件(一逝)
一句 = []
外來語數量 = 0
Expand All @@ -97,9 +95,12 @@ def _資料加到辭典(cls, 聲類, 韻類, 調類, 全部詞, 全部句, 一
if len(分詞.strip()) == 0:
continue
try:
全部詞.add(
cls.音節轉辭典格式(聲類, 韻類, 調類, 加語料, 詞物件, 音標系統)
)
辭典格式, 新聲類, 新韻類, 新調類 = cls.音節轉辭典格式(詞物件, 辭典輸出物件)
if 加語料:
cls._加新聲學單位(聲類, 韻類, 調類, 新聲類, 新韻類, 新調類)
else:
cls._檢查有新聲學單位無(聲類, 韻類, 調類, 新聲類, 新韻類, 新調類)
全部詞.add(辭典格式)
except (ValueError, RuntimeError):
字物件陣列 = 詞物件.篩出字物件()
if (
Expand All @@ -124,48 +125,29 @@ def _資料加到辭典(cls, 聲類, 韻類, 調類, 全部詞, 全部句, 一
return len(一句), 外來語數量

@classmethod
def 音節轉辭典格式(cls, 聲類, 韻類, 調類, 加語料, 物件, 音標系統, 詞條=None):
def 音節轉辭典格式(cls, 物件, 辭典輸出物件, 詞條=None):
新聲類 = set()
新韻類 = set()
新調類 = set()
聲韻陣列 = []
for 字物件 in 物件.篩出字物件():
if 字物件. != 無音:
檢查字物件 = 字物件
else:
檢查字物件 = (字物件., 字物件.)
if not 檢查字物件.音標敢著(音標系統):
raise ValueError('音標無合法')
原聲, , 調 = 檢查字物件.轉音(音標系統, '音值').
= 原聲 + '-'
聲韻陣列.append()
if 加語料:
聲類.add()
else:
if not in 聲類:
raise RuntimeError('語料無這个音')
for 一个音素 in 漢語語音處理.切漢語韻():
一个音素調 = 一个音素 + 調
聲韻陣列.append(一个音素調)
if 加語料:
try:
韻類[一个音素].add(一个音素調)
except KeyError:
韻類[一个音素] = {一个音素調}
try:
調類[調].add(一个音素調)
except KeyError:
調類[調] = {一个音素調}
else:
try:
if 一个音素調 not in 韻類[一个音素] or 一个音素調 not in 調類[調]:
raise RuntimeError('語料無這个韻抑是調')
except KeyError:
raise RuntimeError('語料無這个韻抑是調')
聲類, 韻類, 調類 = 辭典輸出物件.輸出函式(字物件)
for in 聲類:
聲韻陣列.append()
新聲類.add()
for in 韻類:
聲韻陣列.append([1])
新韻類.add()
新調類 |= 調類
if 詞條:
return '{}\t{}'.format(''.join(詞條.split()), ' '.join(聲韻陣列))
分詞 = 物件.看分詞()
return '{}\t{}'.format(分詞, ' '.join(聲韻陣列))
分詞 = ''.join(詞條.split())
else:
分詞 = 物件.看分詞()
辭典格式 = '{}\t{}'.format(分詞, ' '.join(聲韻陣列))
return 辭典格式, 新聲類, 新韻類, 新調類

@classmethod
def _揣影音輸出(cls, 語言, 音標系統,
def _揣影音輸出(cls, 辭典輸出物件,
聽拍內容, 音檔目錄, 語句目錄, 音檔對應頻道, 語句對應語者, 辭典資料,
匯出條件):
第幾个人 = 0
Expand All @@ -184,7 +166,7 @@ def _揣影音輸出(cls, 語言, 音標系統,
音檔長度 = 一筆.聲音檔().時間長度()
for 第幾句, 一句聽拍 in enumerate(一筆.聽拍):
第幾个人 = cls._語句資訊(
辭典資料, 音標系統, 語者名對應輸出名,
辭典資料, 辭典輸出物件, 語者名對應輸出名,
音檔名, 音檔長度, 第幾句, 第幾个人,
一句聽拍['開始時間'], 一句聽拍['結束時間'], 一句聽拍['語者'], 一句聽拍['內容'],
聽拍內容, 語句目錄, 語句對應語者
Expand All @@ -203,7 +185,7 @@ def _揣影音輸出(cls, 語言, 音標系統,
cls._音檔資訊(一筆.影音所在, 音檔名, 音檔目錄, 音檔對應頻道)
音檔長度 = 一筆.聲音檔().時間長度()
第幾个人 = cls._語句資訊(
辭典資料, 音標系統, 語者名對應輸出名,
辭典資料, 辭典輸出物件, 語者名對應輸出名,
音檔名, 音檔長度, 0, 第幾个人,
0, 音檔長度, 一筆.影音語者, 一筆.文本,
聽拍內容, 語句目錄, 語句對應語者
Expand All @@ -222,7 +204,7 @@ def _音檔資訊(cls, 影音所在, 音檔名, 音檔目錄, 音檔對應頻道
print(音檔名, 音檔名, 'A', file=音檔對應頻道)

@classmethod
def _語句資訊(cls, 辭典資料, 音標系統, 語者名對應輸出名,
def _語句資訊(cls, 辭典資料, 辭典輸出物件, 語者名對應輸出名,
音檔名, 音檔長度, 第幾句, 第幾个人,
開始時間, 結束時間, 原本語者, 內容,
聽拍內容, 語句目錄, 語句對應語者):
Expand All @@ -241,7 +223,7 @@ def _語句資訊(cls, 辭典資料, 音標系統, 語者名對應輸出名,
語者名對應輸出名[語者名] = 語者
第幾个人 += 1
語句名 = '{0}-{1}-ku{2:07}'.format(語者, 音檔名, 第幾句)
這擺參數 = {'音標系統': 音標系統, '一逝': 內容, '加語料': True}
這擺參數 = {'辭典輸出物件': 辭典輸出物件, '一逝': 內容, '加語料': True}
這擺參數.update(辭典資料)
_詞數量, _外來語數量 = cls._資料加到辭典(**這擺參數)
print(語句名, 內容.replace('\n', 分詞符號).strip(), file=聽拍內容)
Expand All @@ -251,20 +233,37 @@ def _語句資訊(cls, 辭典資料, 音標系統, 語者名對應輸出名,
return 第幾个人

@classmethod
def _揣上尾的聽拍(cls, 聽拍):
try:
while True:
聽拍 = 聽拍.聽拍校對.first().新聽拍
except AttributeError:
return 聽拍
def _加新聲學單位(cls, 聲類, 韻類, 調類, 新聲類, 新韻類, 新調類):
for 新聲 in 新聲類:
聲類.add(新聲)
for 一个音素, 一个音素調 in 新韻類:
try:
韻類[一个音素].add(一个音素調)
except KeyError:
韻類[一个音素] = {一个音素調}
for 調, 一个音素調 in 新調類:
try:
調類[調].add(一个音素調)
except KeyError:
調類[調] = {一个音素調}

@classmethod
def _揣上尾的文本(cls, 文本):
try:
while True:
文本 = 文本.文本校對.first().新文本
except AttributeError:
return 文本
def _檢查有新聲學單位無(cls, 聲類, 韻類, 調類, 新聲類, 新韻類, 新調類):
for 新聲 in 新聲類:
if 新聲 not in 聲類:
raise RuntimeError('語料無這个音')
for 一个音素, 一个音素調 in 新韻類:
try:
if 一个音素調 not in 韻類[一个音素]:
raise RuntimeError('語料無這个韻抑是調')
except KeyError:
raise RuntimeError('語料無這个韻抑是調')
for 調, 一个音素調 in 新調類:
try:
if 一个音素調 not in 調類[調]:
raise RuntimeError('語料無這个調')
except KeyError:
raise RuntimeError('語料無這个調')

@classmethod
def _寫檔(cls, 資料夾, 檔名):
Expand Down
40 changes: 15 additions & 25 deletions 臺灣言語服務/Kaldi語料處理.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from 臺灣言語服務.Kaldi語料匯出 import Kaldi語料匯出
from 臺灣言語工具.基本物件.公用變數 import 分型音符號
import re
from 臺灣言語工具.音標系統.閩南語.臺灣閩南語羅馬字拼音 import 臺灣閩南語羅馬字拼音
from 臺灣言語工具.解析整理.解析錯誤 import 解析錯誤
from 臺灣言語服務.models import 訓練過渡格式
from 臺灣言語工具.基本物件.公用變數 import 無音
Expand All @@ -13,46 +12,44 @@
class Kaldi語料處理():

@classmethod
def 揣出漢語音節種類(cls, 音標系統, 語句陣列):
def 揣出漢語音節種類(cls, 辭典輸出物件, 語句陣列):
= set()
for in 語句陣列:
for 分詞 in .split():
try:
for 字物件 in 拆文分析器.分詞詞物件(分詞).篩出字物件():
if 字物件. != 無音:
if 音標系統(字物件.看音()).音標:
if 辭典輸出物件.羅馬字系統(字物件.看音()).音標:
.add(字物件.看音())
else:
if 音標系統(字物件.看型()).音標:
if 辭典輸出物件.羅馬字系統(字物件.看型()).音標:
.add(字物件.看型())
except 解析錯誤: # 語句名「tong0000000-0000000無註明-ku0000000」超過一e5詞
pass
return

@classmethod
def 轉fst格式(cls, 音標系統, 音陣列):
def 轉fst格式(cls, 辭典輸出物件, 音陣列):
= set()
for 音節 in 音陣列:
.add(
'0\t0\t{2}{1}{2}\t{2}{1}{2}'.format(
音節, 分型音符號, cls._漢字聲韻(音標系統, 音節)
音節, 分型音符號, 辭典輸出物件.漢字聲韻(音節)
)
)
資料 = sorted()
資料.append('0\t1')
return 資料

@classmethod
def 轉辭典檔(cls, 音標系統, 音陣列):
def 轉辭典檔(cls, 辭典輸出物件, 音陣列):
資料 = set()
for 音節 in sorted(音陣列):
資料.add(
Kaldi語料匯出.音節轉辭典格式(
set(), {}, {}, True,
拆文分析器.對齊字物件(音節, 音節), 音標系統,
'{1}{0}{1}'.format(分型音符號, cls._漢字聲韻(音標系統, 音節))
)
辭典格式, *_新聲學類 = Kaldi語料匯出.音節轉辭典格式(
拆文分析器.對齊字物件(音節, 音節), 辭典輸出物件,
'{1}{0}{1}'.format(分型音符號, 辭典輸出物件.漢字聲韻(音節))
)
資料.add(辭典格式)
return sorted(資料)

@classmethod
Expand All @@ -77,25 +74,18 @@ def 轉音節text格式(cls, 音標系統, 語句陣列):
return 結果

@classmethod
def 資料庫匯出外語辭典檔(cls, 輸出):
def 資料庫匯出外語辭典檔(cls, 辭典輸出物件, 輸出):
# 匯出華字台音的lexicon
# 母親 ʔ- a1 b- o2
for 一筆 in 訓練過渡格式.objects.filter(外文__isnull=False, 文本__isnull=False):
try:
輸出.add(
Kaldi語料匯出.音節轉辭典格式(
set(), {}, {}, True,
拆文分析器.分詞句物件(一筆.文本),
臺灣閩南語羅馬字拼音, 一筆.外文
)
辭典格式, *_新聲學類 = Kaldi語料匯出.音節轉辭典格式(
拆文分析器.分詞句物件(一筆.文本),
辭典輸出物件, 一筆.外文
)
輸出.add(辭典格式)
except ValueError:
pass
except 解析錯誤:
pass
return sorted(輸出)

@classmethod
def _漢字聲韻(cls, 音標系統, 音節):
音標物件 = 音標系統(音節)
return 音標物件. + 音標物件.
1 change: 1 addition & 0 deletions 臺灣言語服務/kaldi/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
default_app_config = '臺灣言語服務.初使設定.初使設定'
44 changes: 44 additions & 0 deletions 臺灣言語服務/kaldi/lexicon.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from 臺灣言語工具.基本物件.公用變數 import 無音
from 臺灣言語工具.基本物件. import
from 臺灣言語服務.漢語語音處理 import 漢語語音處理


class 辭典輸出:
def __init__(self, 羅馬字, 選擇函式):
self.羅馬字系統 = 羅馬字
self.輸出函式 = getattr(self, 選擇函式)

def 拆做音素(self, 字物件):
原聲, , 調 = self._提出音值(字物件).
= 原聲 + '-'
新韻類 = []
新調類 = set()
for 一个音素 in 漢語語音處理.切漢語韻():
一个音素調 = 一个音素 + 調
新韻類.append((一个音素, 一个音素調))
新調類.add((調, 一个音素調))
return [], 新韻類, 新調類

def 拆做聲韻(self, 字物件):
原聲, , 調 = self._提出音值(字物件).
= 原聲 + '-'
一个音素調 = + 調
return [], [(, 一个音素調)], {(調, 一个音素調)}

def 拆做音節(self, 字物件):
原聲, , 調 = self._提出音值(字物件).
一个音素調 = 原聲 + + 調
return [], [(原聲 + , 一个音素調)], {(調, 一个音素調)}

def _提出音值(self, 字物件):
if 字物件. != 無音:
檢查字物件 = 字物件
else:
檢查字物件 = (字物件., 字物件.)
if not 檢查字物件.音標敢著(self.羅馬字系統):
raise ValueError('音標無合法')
return 檢查字物件.轉音(self.羅馬字系統, '音值')

def 漢字聲韻(self, 音節):
音標物件 = self.羅馬字系統(音節)
return 音標物件. + 音標物件.

0 comments on commit da9a075

Please sign in to comment.