概要:hunspell_ja_JP プロジェクトファイルを例に、goldendict の構詞法ルールを浅く分析します。(まあ、この文章はちょっと硬いので、どうやって要約すればいいのかわからない 2333
前言#
この記事では、MrCorn0-0/hunspell_ja_JP: Hunspell morphology dictionary for Japanese used in GoldenDict. (github.com)プロジェクト(以下「原プロジェクト」)の構詞法ファイルを例に、Linux hunspell 公式サイトが提供する man 4 hunspell PDF ファイル(以下「マニュアル」)を参考にして、基本的な構詞法ルールを説明します。
あらかじめ声明しておきますが、私の知識は乏しく、原プロジェクトの構詞法ファイルの一部ルールを大まかに理解しただけで、誤りがあるかもしれませんので、皆さんは冷静に読んで、友好的に交流してください。また、原プロジェクトは日本語のみを対象としており、他の言語の構詞法に関する問題についてはお答えできないかもしれませんので、マニュアルを参照してください。
GoldenDict の構詞法機能で使用される技術は主に Hunspell で、これはもともと Linux 端のスペルチェックツールです。そのため、GoldenDict とドイツ語系学生に hunspell を紹介するで言及されているものとは若干異なります。GoldenDict の構詞法は、以下で説明する.dic
と.aff
という 2 つのファイルのみで、.morph
、.good
、.wrong
、.sug
という拡張子のファイルはありませんが、.dic
と.aff
ファイルのルールは Hunspell のマニュアルと完全に一致しています。
これら 2 つのファイルの役割について、ドイツ語系学生に hunspell を紹介するの言葉を引用します:
- .dic 辞書ファイルで、内容は紙の辞書の見出し語(lexem)に似ています。
- .aff 復元ルールセットで、接頭辞や接尾辞が付加されたり、他の単語と複合された複雑な形を、辞書に存在する見出し語に変換するための多くのルールが記載されています。
dic ファイル基本形式#
dic ファイルは比較的シンプルで、以下のような形式です(最初の数字は dic ファイルに収録されている語彙の数を示します)
450851
あ
亜
亞
吾
我
高い/XA
一部の単語には/
があり、その後に見た目が乱雑なものが続いていますが、この書き方は単語の品詞をソフトウェアに伝えるためのもので、XA
という変形ルールがあることを示しています。後で詳しく説明しますが、ここでは dic ファイル内で単語の品詞を指定できることだけを知っておけば大丈夫です。
また、GoldenDict の dic ファイルに収録されている単語は、構詞法機能を有効にした際に最終的な検索結果に影響を与えるため、このファイル内の単語には慎重に対処し、安易に変更しないことをお勧めします。
aff ファイル#
aff ファイルのルールは非常に複雑で、以下では原プロジェクトで使用されているルールのみを説明します。他の言語や異なるニーズのある方は、Linux プロジェクトの man 4 Hunspell マニュアルを参照してください。(重要なことを繰り返しますが、私の英語は四級レベルで、マニュアルを読むのは非常に苦労しました。完全に推測と検証によって結論を導き出したもので、マニュアルを読んで理解したわけではありません。皆さんは、日語専門の英語学習者に期待するよりも、自分で試してみる方が良いでしょう:)
MAP#
まず、最も理解しやすい MAP ルールの例を紹介します:
#スペルのバリエーション
MAP 89
MAP あア
MAP かカ
MAP さサ
MAP たタ
MAP 89
は、これから 89 の MAP ルールがあることを示しています。
MAP ルールは、指定された文字の違いを無視するという簡単な理解ができます。例えば、MAP あア
は、入力ア
があ
として処理されることを示しています。このルールは原プロジェクトで日本語の擬声語や擬態語の書き方の習慣を処理するために使用されています。例えば、チョコチョコ
はほとんどの権威ある辞書にはありませんが、ルールによって置き換えられたちょこちょこ
は多くの辞書にあります。
ただし、原プロジェクトの最後の部分には、私がまだ完全に理解していない式があります:
MAP (ゃ)(ャ)
マニュアルによれば、Use parenthesized groups for character sequences (eg. for composed Unicode characters):
(複数の文字からなる特殊文字を処理するために括弧でグループ化することを使用します)ということなので、これらのルールは拗音に関連していると思われます。チョロチョロ
の場合、コンピュータはチ
、ョ
、ロ
の 3 つの文字を使用して表現しますので、置き換えの際には一緒に置き換える必要があるのでしょうか?しかし、私はまだ理解できていません。
また、以下のようなルールはあまり意味がないように思えます。なぜなら、多くの辞書には腕きゞ
のような語彙が収録されていないからです。置き換えがあってもなくても実際には問題ありません。踊り字の問題を解決したいのであれば、正規表現を使う必要があるかもしれません(ふふ、私は自慢しているだけです〜《日本語非辞書形辞典 v3》は前のバージョンで完璧にサポートしています)
MAP (ゝ)(ヽ)
MAP (ゞ)(ヾ)
(こうするとわかりにくいかもしれませんが、画像を見ればもっとはっきりします。最初の列の記号には小さな勾がついています)
REP#
次に、MAP ルールに非常に似た REP ルールを紹介します:
REP 12
REP かけ 掛け
REP かか 掛か
(原プロジェクトではREP かけ 掛け かけ
と書かれていますが、間違っている可能性があります……)
MAP と同様に、REP 12
は次に 12 の REP ルールがあることを示していますが、MAP とは異なり、REP かけ 掛け
のかけ
は入力で、掛け
が置き換えの結果です(MAP の順序とは逆です)。さらに、REP ルールは複数の文字の置き換えを実現できます。(タブでパラメータを区切ることができ、MAP は()
を使用する制限があります)
aff 基本形式#
次に、aff ファイルの基本形式を紹介します。すべての aff ファイルは以下のように始まるべきです:
SET UTF-8
LANG ja
FLAG long
# https://github.com/MrCorn0-0/hunspell_ja_JP/
SET
はファイルのエンコーディングを設定します;
LANG
はルールが適用される言語を指定します。他の言語についてはマニュアルを参照してください;
FLAG long
は、ルールに名前を付ける際に 2 つの ASCII コードの文字を使用する必要があることを示します。例えば、後で例として使用するルールでは、XA がルール名です。:
SFX XA Y 1
SFX XA い く い
数字を使ってルールに直接番号を付けたい場合は、マニュアルに従って、FLAG num
と書いてから、以下のようなスタイルで名前を付けることができます:
# 形容詞く
SFX 001 Y 1
SFX 001 い く い
将来の修正を容易にするために、数字で命名する際は、コメントを通じて説明を加えることをお勧めします。注意:#
は各行の先頭に置く必要があり、その行が説明として扱われます。
ただし、数字で命名すると、1 つの単語に複数のルールを同時に適用する方法に問題が生じます。(言の活用は同じではないですよね?)
long
を使用する場合は、ルールをそのまま書くだけで済みます(長さは固定の 2 文字で、プログラムが認識できます):
高い/XAXB
数字を使用する場合は、英語の半角カンマで区切る必要があります:
高い/001,002
SFX#
aff ファイルの最初の部分の書き方を再度紹介する理由は、dic ファイルが複数のルールを指定できることを強調したいからです。ここでの複数のルールは MAP や REP を指すのではなく、次に紹介するカスタム命名をサポートする SFX ルールを指します。
ここで特に「カスタム命名をサポートする」と強調するのは、命名が aff ファイルだけでなく、dic ファイルにも影響を与えるからです。
最初に dic ファイルに以下のような書き方があることを示しました:
高い/XA
ある意味で、SFX ルールが本当の意味での構詞法です。この機能を使って接辞を構成し、語形還元を実現し、日本語の活用の推導と辞書形の還元を実現します。(次の内容は主にマニュアルのAFFIX FILE OPTIONS FOR AFFIX CREATION
の章を参考にしています。)
まず、簡単な例を使って説明します:
SFX XA Y 1
SFX XA い く い
1 行目:XA
は私たちがカスタムした接辞の名前で、Y は固定のパラメータです(マニュアルに記載されているように、1 はこのXA
という接辞が含む接辞の数です)。
2 行目の最初のい
は、このルールが dic ファイルのい
で終わる単語にのみ適用されることを示しています(マニュアルの言葉はstripping characters from beginning (at prefix rules) or end (at suffix rules) of the word
、私の理解では、XA
という接辞を定義し、その実際の内容はい
です。この接辞はプログラムが処理する部分です)、く
はこのルールが入力された単語がく
で終わるときに機能することを示しています。末尾のい
は、構詞法が実際に機能する前に満たすべき条件を示しています:「構詞法推導の単語の末尾はい
である必要がある」、満たされない場合は推導結果が表示されません。
具体的な例を挙げると、高く
と入力すると、プログラムはく
をい
に置き換え(ここでのい
は 2 行目の最初のい
)、その後 dic ファイルの中でい
で終わる単語に高い
があるかどうかを確認します(ここでのい
で終わるのは 2 行目の 2 番目のい
によるものです)。もしあれば、GoldenDict は直接該当する画面にジャンプします。
簡単だと言えるのは、原プロジェクトのこのルールは実際には以下のようになっています:
#形容詞文く
SFX XA Y 2
SFX XA し く/BaTe し
SFX XA い く/BaTe い
これは、日本語の高く
がさらに活用できるため、ユーザーが選択する部分が高くば
や高くて
である可能性を考慮して、原プロジェクトの作者がこのルールを使用して連続変形を処理するために/
を使用しています(ちょっと見覚えがあるかもしれません。dic ファイル内でこの記号は単語がどのルールに使用できるかを示すために使われ、品詞として理解できます)。
注意が必要なのは、BaTe
は 2 つの独立したルールで、原作者がカスタムしたものであり、原プロジェクトの aff ファイルを参照すれば見つけることができます:
SFX Ba Y 1
SFX Ba 0 ば .
(高くば
のような文法が本当に存在するかどうかは確信が持てませんが、このルールを分離してテストしたところ、確かにこのルールは高くば
を入力した際に高い
の説明を表示させることがわかりました)
SFX Te Y 3
SFX Te 0 て [っいしく]
SFX Te 0 で ん
SFX Te 0 て .
(重要なのはSFX Te 0 て .
という行で、他の部分は日本語の文法の観点からはSFX XA し く/BaTe し
、SFX XA い く/BaTe い
とは関係がありません。原プロジェクトの作者は個人的な習慣からそれらを一つのカテゴリにまとめた可能性があります)
ここで.
という非常に特殊な文字が登場します。以前に述べたように、これらの位置は置き換え後の結果に単語の末尾に含まれるべき文字を示すものであり、この位置のパラメータにはZero condition is indicated by dot.
というルールがあります。したがって、SFX Te 0 て .
の意味は、単語の末尾にあるて
を直接削除することです。
このルールの作用を理解するのは難しいかもしれませんが、SFX XA い く/BaTe い
というルールをSFX Te 0 て .
と一緒に考えると理解しやすくなります。原プロジェクトの作者は高くて
という入力を処理するためにこのルールを設計しました。(/BaTe
を取り除くと、日本語非辞書形辞典
と同じように、選択するための要求が高くなりますので、原プロジェクトは本当に良く設計されています)
上記の例は二重の入れ子に関わっているため、理解が難しいかもしれません。疑問がある場合は、マニュアルのTwofold suffix stripping
章やAFFIX FILE OPTIONS FOR AFFIX CREATION
部分を参考にしてください。実際、私もあまり理解していません
次に、別の例を挙げます:
SFX To Y 1
SFX To 0 とも .
To
はルール名で、0
はこのルールが定義された接辞とも
を削除することを示しています。とも
は実際に入力された単語の接辞を示し、.
は置き換え後の結果に対する要求がないことを示します。したがって、このTo
という名のルールの作用は、入力ボックスに入力された末尾のとも
を削除することです。(このルールはとも
という日本語のルールを学ぶ思考に非常に合致しているので、理解しやすいかもしれません。)
また、SFX Te 0 て [っいしく]
では[っいしく]
が登場します。マニュアルによれば、これは置き換え前の入力文字の中にっ
、い
、し
、く
のいずれかが含まれていることを示します。
以下には、比較的難しいカスタムルールがいくつかありますが、簡単に紹介します:
[^行]く
は正規表現と同じ意味で、ルールは行く
を含まないが、い
で終わる単語にのみ適用されます。
SFX 5T く い/TeTaTrTm [^行]く
SFX 5T く っ/TeTaTrTm 行く
このルールは少し長いですが、特に特殊なものではありません。
SFX KN く け/RUTeTaTrTmf1f2f3f4f5f6m0m1m2m3m4m5m6m7TiTItiSuNgQq1Eba1M1myo く
このルールは実際には 2 つに分けることができますが、原作者は[]
の構文を柔軟に使用しています。
SFX xU い かる/bs [しじ]い
余談#
私が構詞法に興味を持ったのは、完全に《日本語非辞書形辞典》プロジェクトで難しい問題に直面し、他の解決策がないかを探るために、約 1 週間をかけて難解なマニュアルを読み込んだからです。大まかにしか理解していませんが、GoldenDict の構詞法 Hunspell 機能の強力さを感じました言語学は永遠に素晴らしい!、人に魚を与えるよりも釣り方を教える方が良いという考えで、自分のまとめを共有し、皆さんがこの機能について少しでも理解できることを期待しています。また、皆さんが GoldenDict の構詞法 Hunspell 機能を一緒に改善できることを期待しています。さあ、- hunspell_ja_JPに issue や PR を提出しましょう
しかし、もう一つ重要な理由があります:FreeMdict に新たに参加した @epistularumが《日本語非辞書形辞典》のアイデアを用いて GoldenDict の構詞法のデモを作成しました(GitHubで確認できます)。彼とコミュニケーションを取るために、数ヶ月間先延ばしにしていたことを正式に進める決心をしました(英語が苦手で本当に大変です……)
また、事前にお知らせしておくと、GoldenDict は以前に言及した日本語の複合動詞の漢字書き問題を簡単に解決できるようになります:
さらに、奇妙なことに、GoldenDict の hunspell 機能は複数の結果を返すことができますが、欧路辞典も類似の hunspell 機能を持っていますが、1 つの結果しか返さないようです。マニュアルによれば、特にモバイルではサポートされない可能性がある特性があるためですBUG: UTF-8 flag type doesn't work on ARM platform.
、しかし欧路はこの理由でこの技術を採用しないわけではないでしょう……
とはいえ、複数のスペル結果をサポートするべきだと思います。例えば:
雨が降ります。
バスから降ります。
欧路辞典の類似機能#
FreeMdict Forumのフォーラムの友人と欧路辞典の類似機能について議論しました:
大きな最適化は見つかりませんでしたが、小さな最適化は存在します:
- 一部の文型が漏れている例があります。例えば
言わざるを得ない
の言わざる
(ただし言わ
を選択すると結果が出ます) - 口語表現の
ん
、と
、ちゃ
など
Hunspell 技術は 2 重の入れ子しか解決できないようなので、食べたければ
のような複雑な文型は解決できないと思います(つまり、選択する前に考えておく必要があります。どこでも本当に選択できるわけではありません)
また、私の表現が不十分だったかもしれませんが、欧路には「活用の還元」機能がありますが、技術は Hunspell とはあまり似ていません:
(多重入れ子、原プロジェクトはおそらく実現できません)
(単独で末尾を選択、原プロジェクトは可能)
日本語の書き方の習慣を無視しています
形容詞は最も簡単な変形すらサポートしていません
結果から見ると、欧路はおそらく特別にオープンソースでない活用推導ツールを作成したが、ユーザーがカスタマイズすることを許可していないため、欧路の公式にフィードバックを送って、改善を求めてみてください。
参考#
チュートリアル#
-
- 最も重要なのは man 4 hunspell というファイルで、他のファイルは Linux 端の技術的詳細を紹介しています
- 私の注釈版を提供します:
-
ドイツ語系学生に hunspell を紹介する - 许一诺の文章 - 知乎
- 上記で使用されている man 4 hunspell PDF 資料を整理し、いくつかの簡単な概念を説明しています
オープンソースプロジェクト#
- MrCorn0-0/hunspell_ja_JP: Hunspell morphology dictionary for Japanese used in GoldenDict. (github.com):日本語の文法に基づいて約 400 の構詞法ルールを書いた中国人の作者
- epistularum/hunspell-ja-deinflection: Hunspell dictionary to deinflect all Japanese conjugated verbs to the dictionary form and suggest correct spelling. (github.com):語尾を置き換えるアイデアに基づいてルールを書いたが、あまり完成していない外国人の作者
- https://github.com/wooorm/dictionaries:JavaScript で書かれた構詞法を収録しているが、日本語は含まれていない
関連#
注:この記事は以下のプラットフォームにバックアップされています:
以 hunspell_ja_JP プロジェクトファイルを例に浅析 goldendict 構詞法ルール - NoHeartPen の文章 - 知乎
以 hunspell_ja_JP プロジェクトファイルを例に浅析 goldendict 構詞法ルール - ソフトウェア経験交流展望 - FreeMdict Forum