コンテンツにスキップ

言語検出器

文書がどの言語で書かれていたかを名指しする検出器を追加します。

言語検出器は、あるテキストがどの言語で書かれているかを述べます。エンコードごとに、読み取れたページ 1 枚につき一度、すべての読み取りがページを生成した後、埋め込みの前に呼ばれ、渡されるのはバイト列ではなくテキストです。これがソース観測ではない理由です。プリフライトはコンテンツをデコードせず、言語は文字についての事実だからです。indx-language-lingua は、あなたの配布物とまったく同じエントリーポイントグループを通じて届きます。パッケージ化とインストールは概要の手順に従います。

from typing import Any
from indx_interfaces import (
CapabilityDescriptor,
CapabilityId,
LanguageDetector,
LanguageScore,
)
class DeclaredLanguageDetector:
def detect(self, text: str) -> tuple[LanguageScore, ...]:
# 何も返さないことが検出器の「意見なし」です。判定するには短すぎる
# テキスト、あるいはインストール済みだが未設定のエンジン。不在は
# 決してゼロではありません——次の検出器が尋ねられ、ブロックは
# 単に言語を持ちません。
if len(text.strip()) < 20:
return ()
return (LanguageScore(language="ja", confidence=0.9),)
class Provider:
def descriptors(self) -> tuple[CapabilityDescriptor, ...]:
# この配布物は他の機能が読んだものに注釈を付けるだけで、何も読みません。
return ()
def create(self, capability_id: CapabilityId) -> Any:
raise ValueError(f"this provider declares no capabilities, so not {capability_id}")
def language_detectors(self) -> tuple[LanguageDetector, ...]:
return (DeclaredLanguageDetector(),)

LanguageDetectorProviderChunkerProvider と同じく任意です。検出器は ID を名乗らず、記述子にも加わらず、機能スナップショットにまったく公表されません——変えるのは実行出力への注釈であり、どの既存の計画も記録していないものです。意見を持つ最初の検出器がそのページを取り、インストール済みの検出器は indx 同梱のものより前に並びます。

回答は確信度の高い順に並べ、小文字の ISO 639-1 を使います。インデックスが保存するのはコードであり、あなたのエンジンの列挙名はあなたのエンジンの都合だからです。raise は「自分のもので、壊れている」を意味し——ソースではなく検出器についての判定なので——エグゼキューターはログに残して次を尋ね、実行がすでに対価を払ったエンコードを失敗させません。

エグゼキューターは、あなたのページごとの回答を各ページブロックの metadatalanguages として書き込み、文書自身の回答——各スコアが算出されたテキスト量で重み付けしたページの平均——を文書ブロックに書き込みます。このキーは予約されています。EncodeRequestlanguages を渡した呼び出し側は、上書きされるのではなく拒否されます。

  • 推測するくらいなら何も返さない。短い文字列はどの統計的検出器でも自信たっぷりに、そして誤って採点されます。
  • ISO 639-1 を小文字で、降順に並べて報告する。
  • モジュールスコープを安価に保つ。エンジンのインポートは detect() の内側に、モデルの構築は最初の呼び出しの背後に。