Skip to content

Commit

Permalink
Merge f49acd8 into 705a2e6
Browse files Browse the repository at this point in the history
  • Loading branch information
sih4sing5hong5 committed Jul 4, 2018
2 parents 705a2e6 + f49acd8 commit 1e9ea88
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 59 deletions.
41 changes: 14 additions & 27 deletions 臺灣言語工具/基本物件/公用變數.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# -*- coding: utf-8 -*-
# 瀏覽器希望無音愛有空白,但是處理標音時希望是佮好認的
from 臺灣言語工具.音標系統.客話.臺灣客家話拼音 import 臺灣客家話拼音調類對照表
import re

from 臺灣言語工具.音標系統.閩南語.臺灣閩南語羅馬字拼音轉方音符號吳守禮改良式模組 import 臺灣閩南語羅馬字拼音對照吳守禮方音聲調表
import unicodedata


無音 = '' # ' '
# sui1 koo1-niu5 => 媠 姑娘
分字符號 = '-'
Expand Down Expand Up @@ -32,41 +33,27 @@
{';', ';', '﹔', }
)

聲調符號 = 臺灣客家話拼音調類對照表 - {''}
聲調符號 = (
臺灣客家話拼音調類對照表 |
set(臺灣閩南語羅馬字拼音對照吳守禮方音聲調表.values())
) - {''}


標點符號 = 句中標點符號 | 斷句標點符號

組字式符號 = '⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻⿿'

# Ll 小寫, Lu 大寫, Md 數字, Mn 有調號英文,Lo 其他, So 組字式符號…
# Lm 注音聲, Sk 輕聲, Sm 數學,
統一碼羅馬字類 = {'Ll', 'Lu', 'Mn'}
統一碼大寫羅馬字類 = {'Lu'}
統一碼數字類 = {'Nd'}
統一碼注音聲調符號 = {'Lm', 'Sk', 'Sm'}
統一碼漢字佮組字式類 = {'Lo', 'So'}
統一碼羅馬字佮數字 = 統一碼羅馬字類 | 統一碼數字類
統一碼聲調符號 = 統一碼數字類 | 統一碼注音聲調符號
統一碼音標類 = 統一碼羅馬字類 | 統一碼聲調符號
_統一碼羅馬字類 = {'Ll', 'Lu', 'Mn'}


def 敢是拼音字元(字元, 種類):
if 字元 is None:
def 敢是拼音字元(字元):
try:
種類 = unicodedata.category(字元)
except TypeError:
return False
return 種類 in 統一碼羅馬字類 or 字元 in ['ⁿ', "'", '_', ]
return 種類 in _統一碼羅馬字類 or 字元 in ['ⁿ', "'", '_', ]


def 敢是注音符號(字元):
return unicodedata.name(字元, '').startswith('BOPOMOFO LETTER')


_hiragana範圍 = re.compile(r'[ぁ-ゟ]\Z')
_katakana範圍 = re.compile(r'[゠-ヿ]\Z')


def 敢是hiragana(字元):
return _hiragana範圍.match(字元)


def 敢是katakana(字元):
return _katakana範圍.match(字元)
30 changes: 13 additions & 17 deletions 臺灣言語工具/解析整理/拆文分析器.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,22 @@
from 臺灣言語工具.基本物件.公用變數 import 標點符號
from itertools import chain
import re
import unicodedata


from 臺灣言語工具.解析整理.文章粗胚 import 文章粗胚
from 臺灣言語工具.基本物件.公用變數 import 分型音符號
from 臺灣言語工具.解析整理.程式掠漏 import 程式掠漏
from 臺灣言語工具.基本物件.公用變數 import 統一碼羅馬字類
from 臺灣言語工具.基本物件.公用變數 import 統一碼聲調符號
from 臺灣言語工具.基本物件.公用變數 import 統一碼注音聲調符號
from 臺灣言語工具.基本物件.公用變數 import 敢是拼音字元
from 臺灣言語工具.基本物件.公用變數 import 敢是注音符號
from 臺灣言語工具.基本物件.公用變數 import 統一碼數字類
from 臺灣言語工具.基本物件.公用變數 import 聲調符號


class 拆文分析器:
_切組物件分詞 = re.compile('(([^ |]*.|.[^ |]*) ?|[^ ]+)')
_切章分詞 = re.compile('(\n|.|.|\n|\n)', re.DOTALL)
_是空白 = re.compile('[^\S\n]+')
_是分字符號 = re.compile('{}+'.format(分字符號))
_是數字 = set('0123456789')

@classmethod
def 建立字物件(cls, 語句, 別種書寫=無音):
Expand Down Expand Up @@ -241,15 +238,13 @@ def _句分析(cls, 語句):
if 語句 == 分詞符號 or cls._是空白.fullmatch(語句):
return 狀態.分析結果()
頂一个字 = None
頂一个字種類 = None
頂一个是連字符 = False
頂一个是空白 = False
頂一个是輕聲符號 = False
頂一个是注音符號 = False
位置 = 0
while 位置 < len(語句):
= 語句[位置]
字種類 = unicodedata.category()
是連字符 = False
是空白 = False
是輕聲符號 = False
Expand Down Expand Up @@ -307,39 +302,41 @@ def _句分析(cls, 語句):
狀態.頂一字佮這馬的字無仝詞()
是空白 = True
# 羅馬字接做伙
elif 敢是拼音字元(, 字種類):
elif 敢是拼音字元():
# 頭前是羅馬字抑是輕聲、外來語的數字
# 「N1N1」、「g0v」濫做伙名詞,「sui2sui2」愛變做兩个字,予粗胚處理。
if not 敢是拼音字元(頂一个字, 頂一个字種類)\
and 頂一个字種類 not in 統一碼數字類:
if (
not 敢是拼音字元(頂一个字) and
頂一个字 not in cls._是數字
):
# 頭前愛清掉
狀態.這馬字好矣清掉囥入去字陣列()
if 頂一个是輕聲符號:
狀態.這馬是輕聲字()
狀態.這馬字加一个字元()
# 數字
elif 字種類 in 統一碼數字類:
elif in cls._是數字:
if (
頂一个字種類 not in 統一碼數字類 and
not 敢是拼音字元(頂一个字, 頂一个字種類) and
頂一个字 not in cls._是數字 and
not 敢是拼音字元(頂一个字) and
not 頂一个是注音符號
):
狀態.這馬字好矣清掉囥入去字陣列()
狀態.頂一字佮這馬的字無仝詞()
狀態.這馬字加一个字元()
# 音標後壁可能有聲調符號
elif 字種類 in 統一碼聲調符號 and 頂一个字種類 in 統一碼羅馬字類:
elif in 聲調符號 and 敢是拼音字元(頂一个字):
狀態.這馬字加一个字元()
# 處理注音,輕聲、注音、空三个後壁會當接注音
elif 是注音符號:
if (
頂一个字種類 not in 統一碼注音聲調符號 and
頂一个字 not in 聲調符號 and
not 頂一个是注音符號
):
狀態.這馬字好矣清掉囥入去字陣列()
狀態.這馬字加一个字元()
# 注音後壁會當接聲調
elif 字種類 in 統一碼注音聲調符號 and 頂一个是注音符號:
elif in 聲調符號 and 頂一个是注音符號:
狀態.這馬字加一个字元()

elif in 標點符號:
Expand Down Expand Up @@ -368,7 +365,6 @@ def _句分析(cls, 語句):
頂一个是連字符 = 是連字符
頂一个是空白 = 是空白
頂一个是輕聲符號 = 是輕聲符號
頂一个字種類 = 字種類
頂一个是注音符號 = 是注音符號
if 狀態.這馬字敢閣有物件():
if 狀態.是一般模式():
Expand Down
47 changes: 32 additions & 15 deletions 臺灣言語工具/解析整理/文章粗胚.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
# -*- coding: utf-8 -*-
import re

import unicodedata


Expand All @@ -9,13 +8,29 @@
from 臺灣言語工具.解析整理.型態錯誤 import 型態錯誤
from 臺灣言語工具.解析整理.解析錯誤 import 解析錯誤
from 臺灣言語工具.基本物件.公用變數 import 組字式符號
from 臺灣言語工具.基本物件.公用變數 import 統一碼漢字佮組字式類
from 臺灣言語工具.基本物件.公用變數 import 統一碼羅馬字類
from 臺灣言語工具.基本物件.公用變數 import 聲調符號
from 臺灣言語工具.基本物件.公用變數 import 敢是注音符號
from 臺灣言語工具.基本物件.公用變數 import 敢是katakana
from 臺灣言語工具.基本物件.公用變數 import 敢是hiragana
from 臺灣言語工具.基本物件.公用變數 import 標點符號
from 臺灣言語工具.基本物件.公用變數 import 敢是拼音字元


class _文字判斷:
# Ll 小寫, Lu 大寫, Md 數字, Mn 有調號英文,Lo 其他, So 組字式符號
_統一碼漢字佮組字式類 = {'Lo', 'So'}
_hiragana範圍 = re.compile(r'[ぁ-ゟ]\Z')
_katakana範圍 = re.compile(r'[゠-ヿ]\Z')

@classmethod
def 敢是漢字iahsi組字式(cls, 字元):
return unicodedata.category(字元) in cls._統一碼漢字佮組字式類

@classmethod
def 敢是hiragana(cls, 字元):
return cls._hiragana範圍.match(字元)

@classmethod
def 敢是katakana(cls, 字元):
return cls._katakana範圍.match(字元)


class 文章粗胚:
Expand Down Expand Up @@ -45,7 +60,7 @@ def 建立物件語句前處理減號(cls, 音標工具, 語句, 別的符號邊
if 語句.startswith(分字符號 + 分字符號):
if cls._頭前有音標無(音標工具, 語句[2:]):
語句 = '0' + 語句[2:]
elif(2 < len(語句) and unicodedata.category(語句[2]) in 統一碼漢字佮組字式類):
elif 2 < len(語句) and _文字判斷.敢是漢字iahsi組字式(語句[2]):
語句 = 語句[2:]
位置 = 0
狀態 = cls._一般
Expand Down Expand Up @@ -79,10 +94,10 @@ def 建立物件語句前處理減號(cls, 音標工具, 語句, 別的符號邊
字元陣列.append(' 0')
else:
字元陣列.append('0')
elif (位置 + 2 < len(語句) and unicodedata.category(語句[位置 + 2]) in 統一碼漢字佮組字式類):
elif 位置 + 2 < len(語句) and _文字判斷.敢是漢字iahsi組字式(語句[位置 + 2]):
if (
前回一開始狀態 == cls._組字 or
len(字元陣列) > 0 and unicodedata.category(字元陣列[-1][-1]) in 統一碼漢字佮組字式類 or
len(字元陣列) > 0 and _文字判斷.敢是漢字iahsi組字式(字元陣列[-1][-1]) or
cls._後壁有音標無(音標工具, 語句[:位置])
):
字元陣列.append(分詞符號)
Expand All @@ -94,9 +109,11 @@ def 建立物件語句前處理減號(cls, 音標工具, 語句, 別的符號邊
頭節 = cls._後壁有音標無(音標工具, 語句[:位置])
後節 = cls._頭前有音標無(音標工具, 語句[位置 + 1:])
頭前漢字抑是組字式 = (
位置 - 1 >= 0 and unicodedata.category(語句[位置 - 1]) in 統一碼漢字佮組字式類)
位置 - 1 >= 0 and _文字判斷.敢是漢字iahsi組字式(語句[位置 - 1])
)
後壁漢字抑是組字式 = (
位置 + 1 < len(語句) and unicodedata.category(語句[位置 + 1]) in 統一碼漢字佮組字式類)
位置 + 1 < len(語句) and _文字判斷.敢是漢字iahsi組字式(語句[位置 + 1])
)
頭前閣是組字式 = (前回一開始狀態 == cls._組字)
# print(頭節 , 頭前漢字抑是組字式 , 頭前閣是組字式,後節 , 後壁漢字抑是組字式)
if (頭節 or 頭前漢字抑是組字式 or 頭前閣是組字式) and (後節 or 後壁漢字抑是組字式):
Expand Down Expand Up @@ -140,7 +157,7 @@ def 符號邊仔加空白(cls, 語句):
組字式長度 += 1
if 狀態 == cls._一般 and 組字式長度 == 1:
if 語句[位置] in 聲調符號 \
and 位置 - 1 >= 0 and unicodedata.category(語句[位置 - 1]) in 統一碼羅馬字類:
and 位置 - 1 >= 0 and 敢是拼音字元(語句[位置 - 1]):
pass
elif 語句[位置] == '•' and cls._o結尾(語句[:位置]):
pass
Expand Down Expand Up @@ -246,12 +263,12 @@ def 漢字中央加分字符號(cls, 語句):
try:
if (
(
unicodedata.category() in 統一碼漢字佮組字式類 and
unicodedata.category(結果[-1]) in 統一碼漢字佮組字式類 and
_文字判斷.敢是漢字iahsi組字式() and
_文字判斷.敢是漢字iahsi組字式(結果[-1]) and
(not 敢是注音符號(結果[-1]) or not 敢是注音符號())
) or
(敢是hiragana(結果[-1]) and 敢是hiragana()) or
(敢是katakana(結果[-1]) and 敢是katakana())
(_文字判斷.敢是hiragana(結果[-1]) and _文字判斷.敢是hiragana()) or
(_文字判斷.敢是katakana(結果[-1]) and _文字判斷.敢是katakana())
):
結果.append(分字符號)
except IndexError:
Expand Down
27 changes: 27 additions & 0 deletions 試驗/基本物件/Test敢是拼音字元單元試驗.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
from unittest.case import TestCase
from 臺灣言語工具.基本物件.公用變數 import 敢是拼音字元


class 敢是拼音字元單元試驗(TestCase):

def test_大寫(self):
self.assertTrue(敢是拼音字元('A'))

def test_調符(self):
self.assertTrue(敢是拼音字元('ē'))

def test_漢(self):
self.assertFalse(敢是拼音字元('漢'))

def test_漢羅(self):
self.assertFalse(敢是拼音字元('媠sui2'))

def test_羅漢(self):
self.assertFalse(敢是拼音字元('sui媠'))

def test_None(self):
self.assertFalse(敢是拼音字元(None))

def test_khang(self):
self.assertFalse(敢是拼音字元(''))
6 changes: 6 additions & 0 deletions 試驗/解析整理/Test拆文分析器對齊單元試驗.py
Original file line number Diff line number Diff line change
Expand Up @@ -747,3 +747,9 @@ def test_對齊攏是漢羅(self):
self.assertEqual(len(組物件.篩出字物件()), 3)
self.assertEqual(組物件.篩出字物件()[0].看分詞(), '0mh4|0mh4')
self.assertEqual(組物件.篩出字物件()[-1].看分詞(), '怎|怎')

def test_標點連做伙(self):
= '「Haih!喔~」'
= '“Haih! Ooh~”'
組物件 = 拆文分析器.對齊組物件(, )
self.assertEqual(len(組物件.篩出字物件()), 6)

0 comments on commit 1e9ea88

Please sign in to comment.