卿少納言

卿少納言

JavaScript & Japanese, Python & Polyglot, TypeScript & Translate.
zhihu
github
email
x

hunspell_ja_JP プロジェクトファイルを例に、goldendict の構詞法ルールを浅く分析する

概要: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 は以前に言及した日本語の複合動詞の漢字書き問題を簡単に解決できるようになります:
|500

さらに、奇妙なことに、GoldenDict の hunspell 機能は複数の結果を返すことができますが、欧路辞典も類似の hunspell 機能を持っていますが、1 つの結果しか返さないようです。マニュアルによれば、特にモバイルではサポートされない可能性がある特性があるためですBUG: UTF-8 flag type doesn't work on ARM platform.、しかし欧路はこの理由でこの技術を採用しないわけではないでしょう……

とはいえ、複数のスペル結果をサポートするべきだと思います。例えば:

雨が降ります。
バスから降ります。

欧路辞典の類似機能#

FreeMdict Forumのフォーラムの友人と欧路辞典の類似機能について議論しました:

大きな最適化は見つかりませんでしたが、小さな最適化は存在します:

  1. 一部の文型が漏れている例があります。例えば言わざるを得ない言わざる(ただし言わを選択すると結果が出ます)
  2. 口語表現のちゃなど

Hunspell 技術は 2 重の入れ子しか解決できないようなので、食べたければのような複雑な文型は解決できないと思います(つまり、選択する前に考えておく必要があります。どこでも本当に選択できるわけではありません)

また、私の表現が不十分だったかもしれませんが、欧路には「活用の還元」機能がありますが、技術は Hunspell とはあまり似ていません:
|500
(多重入れ子、原プロジェクトはおそらく実現できません)

|500
(単独で末尾を選択、原プロジェクトは可能)

日本語の書き方の習慣を無視しています
|500
形容詞は最も簡単な変形すらサポートしていません
|500
結果から見ると、欧路はおそらく特別にオープンソースでない活用推導ツールを作成したが、ユーザーがカスタマイズすることを許可していないため、欧路の公式にフィードバックを送って、改善を求めてみてください。

参考#

チュートリアル#

オープンソースプロジェクト#

関連#

注:この記事は以下のプラットフォームにバックアップされています:

以 hunspell_ja_JP プロジェクトファイルを例に浅析 goldendict 構詞法ルール - NoHeartPen の文章 - 知乎

以 hunspell_ja_JP プロジェクトファイルを例に浅析 goldendict 構詞法ルール - ソフトウェア経験交流展望 - FreeMdict Forum

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。