変化形をもとに、辞書形としてあり得る形を機械的に導く方法の思案

7

佐藤陽花さん (@Distr_to_Yonder) がまとめて下さった Min.t 版もあります

Xirdim /ひるでぃむ/ @低浮上? @xirdim

写像の考え方を応用して、活用形から辞書形を逆算する体系的な方法をつくろうと試みている

2022-05-25 23:42:57
Xirdim /ひるでぃむ/ @低浮上? @xirdim

活用というか、曲用や単なる接辞付加なども含めた語形変化全般ですかね

2022-05-29 19:58:13

方向性1: 変化規則を単純な写像の合成に落とし込む

Xirdim /ひるでぃむ/ @低浮上? @xirdim

任意の1字以上の文字列 s に対して、語尾 -o をつけた変化形 f(s) があるとする。 このとき、  写像 f: /.+/ → 𝕊  f(s) = s + "o" (s ∈ /.+/) のように表せる(𝕊 は文字列の全体集合、正規表現はそれにちょうど一致する文字列全体の集合を表すものとする) さて、f(s) から s を得るには↓

2022-05-29 20:10:55
Xirdim /ひるでぃむ/ @低浮上? @xirdim

↓f の逆写像 f⁻¹ を考えればいいが、この場合、値域と終域が異なるので逆写像にできない。なので、  f: /.+/ → /.+o/ として定義しなおす。これで逆写像がつくれる。  f⁻¹(s) = s[:len(s)-1] みたいな感じ。(もっと記法は簡素化したい

2022-05-29 20:10:56
Xirdim /ひるでぃむ/ @低浮上? @xirdim

んで問題になるのは、 ・f(s) = s + "o" (s ∈ 𝕊) の値域 ・f(s) = s + "o" の逆関数が f⁻¹(s) = s[:len(s)-1] であること をどうやって機械的に割り出すのかってことかな

2022-05-29 20:15:27
Xirdim /ひるでぃむ/ @低浮上? @xirdim

当たり前だけど f(s) の値域を使って f を定義し直さないと、f⁻¹(s) = s[:len(s)-1] が f の逆写像になってないので、値域を導き出すところが先決。

2022-05-29 20:20:13
Xirdim /ひるでぃむ/ @低浮上? @xirdim

f が単射じゃない場合を含めて考えると複雑になるので、ひとまず f が単射の場合に限って考えます

2022-05-29 20:21:35
Xirdim /ひるでぃむ/ @低浮上? @xirdim

(ちなみに語形変化で単射じゃない例って言ったら、日本語の動詞 -nu, -mu, -bu に対して、「た」が接続した形 -nda とかですね:「富む」も「飛ぶ」も「とんだ」になる)

2022-05-29 20:24:10
Xirdim /ひるでぃむ/ @低浮上? @xirdim

まあ /.+/ の要素(元)に -o をつけた文字列全体の集合が /.+o/ になるのは、自明っちゃ自明なんだけども…

2022-05-29 20:26:46
Xirdim /ひるでぃむ/ @低浮上? @xirdim

でも -us を -e にする関数を考えたときに、  g(s) = s[:len(s)-2] + "e" (s ∈ /.+us/) とかになってくると、その値域が /.+e/ であるのを自明で片付けるのは宜しくないよな。というかそこから発展がない

2022-05-29 20:29:47
Xirdim /ひるでぃむ/ @低浮上? @xirdim

1字1字操作するというのはどうだろう。  g(s) = s[:len(s)-2] + "e" (s ∈ /.+us/) を、  g₁(s) = s[:len(s)-1]  g₂(s) = s[:len(s)-1]  g₃(s) = s = "e"  g = g₃ ∘ g₂ ∘ g₁ という具合に。 これなら語形変化の操作を、「1字削除」と「1字添加」という最小単位に分解できているのでは

2022-05-29 20:37:25
Xirdim /ひるでぃむ/ @低浮上? @xirdim

さてこれで、  g₁: /.+us/ → /.+u/  g₂: /.+u/ → /.+/  g₃: /.+/ → /.+e/ と考えることにより、  g: /.+us/ → /.+e/ と決定づけることができる

2022-05-29 20:41:09
Xirdim /ひるでぃむ/ @低浮上? @xirdim

この方法、レーベンシュタインみを感じるな(言いたいだけ

2022-05-29 20:38:16

車輪の再発明

「文字列全体集合は可算集合だ」などと盛大に再発明しているが、とっ散らかるので略

文字列の集合を一意に表すには…?

〜正規表現をいじくる

Xirdim /ひるでぃむ/ @低浮上? @xirdim

その前に、正規表現の同値性を確かめる方法を考える必要がありそう /.*./ と /.*.*./ と /.+.?/ とか、/(a?b?){3}/ と /a?(b?a?){2}b?/ とか。けっこう難しい

2022-08-10 17:13:43
Xirdim /ひるでぃむ/ @低浮上? @xirdim

文字列集合の全体集合は、可算無限集合の冪集合だから、実数全体集合と同濃度になるか… 番号は振れないな

2022-08-10 17:17:41
Xirdim /ひるでぃむ/ @低浮上? @xirdim

実数の"番号"を振ることはできそう しかし実用的に思えない(扱いやすくはなってない気がする)

2022-08-10 17:19:21
Xirdim /ひるでぃむ/ @低浮上? @xirdim

有限回の繰り返し・選択肢は全て展開し「|」だけで分岐しよう /(li){2}/ → /lili/ /.?/ → /|./ → /|a|i|u|e|o|k|s|t|n|p|m|j|l|w/(文字全体集合がトキポナ仕様の場合) /[sp]?ona/ → /(s|p)?ona/ → /(|s|p)ona/ → /ona|sona|pona/ といったように。有限集合だったらこれで要素の列挙になる

2022-08-10 17:36:38
Xirdim /ひるでぃむ/ @低浮上? @xirdim

2つめは、「.」の展開を先にやって /.?/ → /(a|i|u|e|o|k|s|t|n|p|m|j|l|w)?/ → /|a|i|u|e|o|k|s|t|n|p|m|j|l|w/ としたほうが良いな。 内側から先に計算する感じで

2022-08-10 17:39:04
Xirdim /ひるでぃむ/ @低浮上? @xirdim

無限集合の場合はもっと考えないといけない。 無限集合が生じるのは「?」や「+」や「{\𝓃,}」(\𝓃 は非負整数) が使われるとき。つまり上限のない繰り返し

2022-08-10 17:42:22
Xirdim /ひるでぃむ/ @低浮上? @xirdim

というか、こうは言うものの本当に無秩序な集合({a, kon, soweli, kijetesantakalu, …}(何の規則性もなく無限に続く) のように)は人間の使う言語ではありえないな(記憶のしようがないから)。文法としての記述も不能 加算集合で考えれば十分なのでは? twitter.com/xirdim/status/…

2022-08-10 17:53:34
1 ・・ 4 次へ