英語
Litseaは、ラテン文字の正書法に合わせて調整した文字タイプ集合により、英語の単語分割をサポートしています。大文字と小文字、空白、アポストロフィをそれぞれ独立した種別として区別します。
文字タイプ
| Code | Name | Pattern | Examples |
|---|---|---|---|
| U | 大文字ラテン文字 | [A-ZA-Z] | A, Z, T |
| W | 空白文字 | スペース、タブ、ノーブレークスペース | , \t, U+00A0 |
| Q | アポストロフィ | [\u{27}\u{2019}] | ', ’ |
| P | 句読点 | アポストロフィを除く ASCII 句読点 + 一般句読点のダッシュ/引用符/省略記号(U+2019 を除く)+ CJK/全角 | ., -, ", @, 。 |
| A | 小文字ラテン文字 | [a-za-z] | a, z |
| N | 数字 | [0-90-9] | 0, 5, 5 |
| O | その他 | フォールバック | CJK表意文字、ASCII外のアクセント付きラテン文字 |
独立した種別としての大文字
文頭の大文字、固有名詞、頭字語は英語の語境界と強く相関するため、大文字のラテン文字は小文字(「A」)と同じクラスに統合せず、独自の種別「U」として扱います。これは、他の言語が言語学的に特徴的な部分集合(例えば韓国語の助詞文字)をより広い共通クラスから切り出しているのと同じ考え方です。
独立した種別としての空白
すべての言語が共有するヘルパー関数 punct_latin_digit() は、ASCII句読点や ASCII スペース(U+0020)を分類しません – 日本語・中国語・韓国語ではどちらも "O" にフォールスルーします。これらの言語のコーパスでは、水平方向の空白それ自体が境界シグナルを持つ必要がないためです。英語は異なります: タイプテーブルにはスペース・タブ・ノーブレークスペース用の「W」が追加されています(学習コーパスに実際に出現するのはプレーンなスペースのみですが、残り2つも同じIDを共有させることで、貼り付けられた入力が "O" へフォールバックせず同じ挙動を継承します)。
独立した種別としてのアポストロフィ
アポストロフィは、短縮形や所有格を通常の句読点から区別する文字レベルのシグナルです: do + n't、Google + 's。ASCII アポストロフィ(U+0027)と、学習コーパスの原文によく出現するタイポグラフィ上の右シングルクォーテーションマーク(U+2019)の両方をカバーする独自の種別「Q」を割り当てています。文字レベルの特徴量テンプレートが直接キーにできるよう、Q は意図的に P から除外しています。
句読点は一律
他の3言語では @ のような ASCII 句読点は "O" にフォールスルーし、CJK/全角の句読点だけが "P" にマップされますが、英語ではアポストロフィを除く ASCII 句読点のほぼすべてを "P" として分類します。これに加えて、学習テキストの非 ASCII 版をカバーする同じ一般句読点の範囲(ダッシュ、カーリークォート、省略記号)も含まれます。これは英語固有の意図的な違いです: char_type('@') は日本語/中国語/韓国語では "O" を返しますが、英語では "P" を返します。
ハイフンは独自の種別を与えず "P" に分類しています。UD English-EWT はハイフン付きの複合語を別々のトークンとしてトークナイズするため(例: search-engine)、ゴールドスタンダード上ではハイフンは通常の区切り句読点として振る舞います。生の文字自体は文字レベル(UW*/BW*)テンプレートから引き続き参照できるため、8番目の種別コードを追加しなくてもハイフン固有の挙動は学習可能です。追加すると密な特徴量テーブルがさらに \((8/7)^3 \approx 1.49\times\) 増大してしまいます。
WC特徴量なし
英語は韓国語と同じ理由でWC(単語+文字タイプ)特徴量を使用しません: 支配的な境界シグナル(空白)がすでにほとんどの位置を解決しているため、文字/タイプ混合テンプレートを追加してもほとんど寄与しないからです。これは類推だけでなく実測でも確認されています – held-out の dev split では、38 個の基本テンプレートによる tag-free 分割モデルが Word F1 98.68% であったのに対し、WC(WC1–WC4)を含む全 42 テンプレートでは 98.65% でした。つまり WC 特徴量を追加すると、モデルは改善するどころか悪化しました。
空白保持学習(Space-Preserving Training)
英語は単語の間にスペースを入れて表記され、(短縮形や一部の句読点のケースを除けば)そのスペースがほとんどの語境界を示します。韓国語と同様に、このモデルは空白保持 TSV コーパスで学習しています: トークンをタブで区切り、各スペースを独立したトークンとして保持することで、学習テキストに元の文のスペース文字が含まれ、モデルはそれを境界のコンテキストとして利用できます。コーパスは corpus_udtreebank.sh -s で生成し、特徴量は litsea extract --format tsv で抽出します。推論時に特別な処理は不要です: segment() はスペースを含むテキストをそのまま受け取り、各スペースを独立したトークンとして出力します。
複数語トークン(短縮形)。 UD English-EWT では don't のような短縮形を、間にスペースを持たない2つの単語行(do、n't)をカバーする範囲行(例えば ID 3-4)として表現します。corpus_udtreebank.sh -s は範囲行を特別扱いします: それ自体としてはトークンを出力せず、範囲を構成する単語間へのスペース挿入を抑制し、範囲自身の SpaceAfter アノテーションを最後の構成単語の後にのみ適用します。具体的には、“I don’t know.” という文は I、 、do、n't、 、know、. というトークン列になります – これは english.model の実際の出力と一致します(下記の例を参照)。この不変条件 – 範囲を構成する単語形を連結すると範囲自身の表層形が再現される – は UD English-EWT のすべての複数語トークンで成立します。
各スペースは独立した1文字トークンであるため、文字単位のラベル付けはその前後に2つの別々の境界を付与します。これは韓国語の場合と全く同じです: これがモデルにとってほぼ自明な規則であり、held-out の単語 F1 に影響しない理由(純粋な空白トークンはスコアリングから除外されます)については韓国語の説明を参照してください。
学習済みモデル
english.model
- 学習コーパス: UD English-EWT(空白保持 TSV コーパス)
- 学習オプション:
--format tsv --tag-free、Averaged Perceptron を 20 エポック学習(dev split での {10, 20, 30, 50} のエポックスイープにより 選定 – 品質はエポック20でピークに達し、それ以降はわずかに悪化)、 AdaBoost のスカラー重みへ畳み込み、剪定なし(4,794 特徴量)– 詳しい 手順は学習手順を参照 - 単語 F1(held-out): 98.31%
- 境界 F1(held-out): 99.18%
- ファイルサイズ: 約 125 KB
このモデルは 16 個のタグ依存特徴量テンプレートを使わずに学習しています(--tag-free、issue #183)。dev split での比較により、タグ特徴量が英語にほとんど寄与しないことが確認されています(タグあり 38 テンプレートの最良値: エポック 30 で Word F1 98.71%、タグなし 38 テンプレートの最良値: エポック 20 で 98.68% – 差はわずか 0.03pt)。そのため同梱モデルは tag-free で提供され、segment() は逐次スコアリングパスを丸ごとスキップできます。詳細はタグなし(pointwise)モデルを参照してください。
held-out 指標は、空白トークンをスコアリングから除外した上で、元の空白付きテキストに対して計算しています。
english_pos.model
- アルゴリズム: 二段構成の単語分割+品詞推定(二値境界分類器 + 候補タグ語彙表付き単語単位タガー)
- stage-2 特徴量セット:
full(dev split での fast/balanced/full の スイープにより選定 – full がタグ付き単語の精度で最良だった)、50 エポック - 単語 F1(held-out): 98.30%
- タグ付き単語 F1(held-out): 90.55%
- ファイルサイズ: 約 3.1 MB
- 詳細: 事前学習済みモデルを参照
このモデルは
english.modelと同じ空白保持コーパスで学習しています(issue #198)。そのため単語 F1(98.30%)はenglish.modelの 98.31% とほぼ一致します – 二段構成の stage-1 分類器は、専用の分割モデルと同等に英語の語境界を見つけられるようになりました。ただし最初からそうだったわけではないため、古い数値と比較する場合はこの経緯を知っておくと役立ちます。二段構成パイプラインは当初、
word/POSコーパスを空白なしで連結したもので学習しており、英語のテキストが実際に含んでいるスペースを捨てていました。そのモデルは同じ空白非保持プロトコルで 70.33%、実際のスペース付き入力では 77.55% でした – 例えばa testを1つのトークンに結合してしまう、といった具合です。学習コーパスを切り替えたことで単語 F1 で +20.8 ポイント、タグ付き単語 F1 で +20.7 ポイントを獲得し、タグ付けも約 3.6 倍高速になりました(2.05M → 7.32M chars/s)。空白なしコーパスは、学習と推論の不一致を 2 つ同時に引き起こしていました。まず stage-1 は、英語のほぼすべての語境界を示すスペースを一度も目にしていませんでした。stage-2 のコンテキスト特徴量(
L*/R*/cl*/cr*)も同様です: 推論時には単語の隣は通常スペースですが、空白なし学習では次の単語の文字でした。現在はどちらもsegment --posが計算するものと一致します。スペースは独立したトークンとして再出力され、
Xとしてタグ付けされます – コーパスが空白文字に候補1つだけの語彙表エントリを与えるため、packed モデルは分類器で推測するのではなく固定タグのパスを通ります(#198 以前のモデルは、同じ文の中の異なるスペースに対してPUNCT/PART/AUXを返していました)。litsea/tests/golden.rsの golden テストがこの挙動を固定しています。
使用例
echo "I don't know." | litsea segment -l english ./models/english.model
# I do n't know .