gliner-ja-pii-v1

日本語の個人情報 (PII) 検出に特化した GLiNER モデルです。urchade/gliner_multi_pii-v1 をベースに、日本語の合成データでファインチューニングしました。

概要

GLiNER は任意のエンティティラベルを自然言語で指定できる柔軟な NER モデルです。本モデルは以下 8 カテゴリの日本語 PII を検出します:

  • person name — 氏名 (漢字・ひらがな・カタカナ)
  • phone number — 電話番号 (090-XXXX-XXXX, +81-X-XXXX-XXXX, ベタ書き 11 桁など)
  • address — 住所 (〒郵便番号、都道府県、丁目番地号、ビル名など)
  • email address — メールアドレス
  • date — 日付 (西暦、令和、平成など)
  • url — URL
  • account number — 口座番号 (銀行口座、顧客番号など)
  • secret — パスワード・API キー・認証コードなど

性能

合成テストデータ 600 サンプル (1318 spans) での評価結果:

Label Precision Recall F1 Support
person name 0.984 0.982 0.983 439
phone number 0.856 0.856 0.856 180
address 0.966 0.825 0.890 103
email address 0.867 0.837 0.852 203
date 0.947 0.962 0.955 131
url 0.942 0.802 0.866 101
account number 1.000 0.948 0.973 77
secret 0.963 0.917 0.939 84
micro avg 0.940 0.908 0.924 1318

(しきい値 0.5 時点)

ベースモデル urchade/gliner_multi_pii-v1 をそのまま日本語に適用した場合の F1 は約 0.10 で、本モデルは約 9 倍の精度改善を達成しています。

使い方

インストール

pip install gliner janome

日本語対応のための重要な前処理

GLiNER の標準 whitespace splitter は日本語の単語境界を識別できません。本モデルでは Janome 形態素解析器を使用し、さらに空白だけのトークンを除外する独自の splitter を使うことを前提に学習されています。この splitter を必ず適用してください

from gliner import GLiNER
from gliner.data_processing import WordsSplitter


class JapaneseSplitterNoWS:
    """Janome ベースの splitter。空白だけのトークンを yield しない。"""

    def __init__(self):
        self._base = WordsSplitter(splitter_type="janome")

    def __call__(self, text):
        for tok, s, e in self._base(text):
            if tok.strip() == "":
                continue
            yield tok, s, e


model = GLiNER.from_pretrained("DataSign/gliner-ja-pii-v1", max_width=25)
model.data_processor.words_splitter = JapaneseSplitterNoWS()

基本的な推論

labels = [
    "person name", "phone number", "address", "email address",
    "date", "url", "account number", "secret",
]

text = (
    "氏名: 山田太郎\n"
    "住所: 〒980-0021 宮城県仙台市青葉区中央1-2-3\n"
    "電話: 022-123-4567\n"
    "メール: yamada@example.co.jp\n"
    "申込日: 令和8年5月15日"
)

entities = model.predict_entities(text, labels, threshold=0.5)
for e in entities:
    print(f"[{e['label']}] {e['text']!r} (score={e['score']:.2f})")

出力例:

[person name] '山田太郎' (score=1.00)
[address] '〒980-0021 宮城県仙台市青葉区中央1-2-3' (score=0.98)
[phone number] '022-123-4567' (score=1.00)
[email address] 'yamada@example.co.jp' (score=1.00)
[date] '令和8年5月15日' (score=1.00)

長文の処理

モデルの最大入力長は 160 トークンです。これより長いテキストは分割が必要です:

def chunk_text(text, splitter, chunk_size=120, overlap=20):
    tokens = list(splitter(text))
    chunks = []
    i = 0
    while i < len(tokens):
        end = min(i + chunk_size, len(tokens))
        chunks.append((tokens[i][1], tokens[end - 1][2],
                       text[tokens[i][1]:tokens[end - 1][2]]))
        if end == len(tokens):
            break
        i = end - overlap
    return chunks


splitter = JapaneseSplitterNoWS()
chunks = chunk_text(long_text, splitter)
all_entities = []
for char_start, _, chunk in chunks:
    preds = model.predict_entities(chunk, labels, threshold=0.5)
    for p in preds:
        p["start"] += char_start
        p["end"] += char_start
        all_entities.append(p)

学習データ

合成データのみで学習しています。Faker (ja_JP ロケール) で氏名・住所・電話・メールを生成し、テンプレートに差し込む方式で 4,000 サンプルを作成しました。テンプレートは以下を含みます:

  • フォーム形式 (氏名: <値>, 住所:\n<値>)
  • ビジネスメール (<氏名>様、ご依頼の件、<日付>までに対応します)
  • HubSpot 風通知 (姓: <姓>\n名: <名>\nメール: <email> 形式)
  • ログメッセージ (User <name> failed to login at <date>)
  • パスワード共有 (パスワードは <secret>、APIキーは <secret> です)

実データは含まれていないため、業務文書の表記揺れには弱い場合があります。

制限事項

  • 最大入力長 160 トークン: 長文は分割推論が必要
  • 会社名・組織名は検出されません: 8 カテゴリに含まれないため
  • 合成データのみ学習: 業務文書特有の表記には実データを追加学習することで精度向上が期待できます
  • 1 文字漢字の名前: などの 1 文字漢字名は学習サンプルが限定的で recall が低い場合があります

ライセンス

Apache License 2.0 (ベースモデル urchade/gliner_multi_pii-v1 と同じ)

引用

ベースモデル GLiNER の論文:

@misc{zaratiana2023gliner,
  title={GLiNER: Generalist Model for Named Entity Recognition using Bidirectional Transformer},
  author={Urchade Zaratiana and Nadi Tomeh and Pierre Holat and Thierry Charnois},
  year={2023},
  eprint={2311.08526},
  archivePrefix={arXiv},
  primaryClass={cs.CL}
}
Downloads last month
14
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for DataSign/gliner-ja-pii-v1

Finetuned
(4)
this model

Paper for DataSign/gliner-ja-pii-v1