hebrew-nlp-toolkit について
hebrew-nlp-toolkitは、ヘブライ語NLPに取り組む開発者向けの実践ガイドです。タスク別にDictaとivrit.aiのモデルを紹介し、前処理、モデルの利用、ホスト型APIを解説します。
主な機能
- 01NLPタスク別のモデル案内
- 02感情分析と固有表現認識
- 03形態素解析とテキスト分割
- 04ヘブライ語音声の文字起こし
- 05テキスト正規化と母音記号の復元
活用シーン
- 01ヘブライ語の顧客レビューの分類
- 02記事から人名や組織名を抽出
- 03ヘブライ語音声の文字起こし
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ skills-il/ localization --skill hebrew-nlp-toolkitインストール後、Claude Code で/hebrew-nlp-toolkitを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
evidence.jsonmetadata.jsonoptimization-log.jsonSKILL_HE.mdreferences/model-comparison.mdscripts/preprocess_hebrew.py詳細
ヘブライ語 NLP ツールキット
手順
ステップ 1:NLP タスクを特定する
| タスク | 推奨モデル | HuggingFace ID | サイズ | 備考 |
|---|---|---|---|---|
| テキスト生成(大規模) | DictaLM 3.0 24B Base | dicta-il/DictaLM-3.0-24B-Base | 24B | ヘブライ語生成に最適です。Mistral-Small-3.1-24B をベースに構築されています。Apache-2.0 |
| テキスト生成(小規模) | DictaLM 3.0 Nemotron Instruct | dicta-il/DictaLM-3.0-Nemotron-12B-Instruct | 12B | 指示チューニング済みです。NVIDIA Open Model License であり、Apache ではありません |
| 推論/思考の連鎖 | DictaLM 3.0 24B Thinking | dicta-il/DictaLM-3.0-24B-Thinking | 24B | 回答の前に、明示的な思考ブロックを出力します |
| 軽量/エッジ | DictaLM 3.0 1.7B Thinking (GGUF) | dicta-il/DictaLM-3.0-1.7B-Thinking-GGUF | 1.7B | llama.cpp を使用して、ノートパソコン/CPU で動作します |
| 分類/マスク埋め | DictaBERT | dicta-il/dictabert | 184M | ベースモデルです。分類用にファインチューニングしてください |
| 固有表現認識(NER) | DictaBERT NER | dicta-il/dictabert-ner | 184M | PER、ORG、LOC、GPE、FAC、TIMEX、TTL を含む 13 種類のエンティティ |
| 感情分析 | DictaBERT Sentiment | dicta-il/dictabert-sentiment | 184M | そのまま使用でき、Positive/Negative/Neutral 形式のラベルを返します |
| 形態論/分割 | DictaBERT Joint | dicta-il/dictabert-joint | 184M | 接頭辞の分割、品詞、見出し語、依存構造解析 |
| ヘブライ語 QA | DictaBERT HeQ | dicta-il/dictabert-heq | 184M | 抽出型の質問応答 |
| 埋め込み(最新) | NeoDictaBERT Bilingual Embed | dicta-il/neodictabert-bilingual-embed | ~363M | ヘブライ語・英語の文埋め込み、768 次元 |
| 埋め込み(旧世代) | AlephBERT | onlplab/alephbert-base | BERT-base | 類似度判定用の旧世代のベースライン |
| 音声テキスト変換 | ivrit.ai Whisper v3 | ivrit-ai/whisper-large-v3 | 1.55B | ivrit.ai コーパス(クネセトの本会議、クラウドソーシングによる文字起こし、朗読)から抽出した約 5,000 時間のデータで学習されています |
| 音声テキスト変換(高速) | ivrit.ai Whisper v3 Turbo CT2 | ivrit-ai/whisper-large-v3-turbo-ct2 | 809M | faster-whisper 向けの CTranslate2 ビルドです |
ivrit.ai のヘブライ語音声コーパス全体は 22,000 時間を超えています。各チェックポイントのモデルカードには、それぞれの学習データが記載されており、数値は異なります。whisper-large-v3 には約 5,000 時間、turbo-ct2 ビルドにはクラウドソーシングによる文字起こし 295 時間と、その他のソースから得た専門家による文字起こし 93 時間が記載されています。
これらのモデルのいくつかはカスタムコードを同梱しており、trust_remote_code=True が必要です(Nemotron、dictabert-joint、dictabert-large-char-menaked、neodictabert-bilingual-embed)。このフラグを指定すると、モデルリポジトリの Python コードがマシン上で実行されるため、モデルカードを読み、本番環境ではリビジョンを固定してください。
ステップ 2:インストール、読み込み、実行
感情分析(ファインチューニング不要ですぐに使用可能):
from transformers import pipeline
oracle = pipeline('sentiment-analysis', model='dicta-il/dictabert-sentiment')
print(oracle(['אני אוהב את השירות']))
NER(エンティティをグループ化):
from transformers import pipeline
from tokenizers.decoders import WordPiece
oracle = pipeline('ner', model='dicta-il/dictabert-ner', aggregation_strategy='simple')
# with aggregation_strategy='simple' the tokenizer needs a decoder, per the model card
oracle.tokenizer.backend_tokenizer.decoder = WordPiece()
print(oracle('דוד בן-גוריון נולד בפולין'))
デコーダーの行がないと、グループ化されたエンティティは分割された ## のワードピース断片として返されます。
DictaBERT(ベースモデル、マスク埋め込み):
from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("dicta-il/dictabert")
model = AutoModelForMaskedLM.from_pretrained("dicta-il/dictabert")
dicta-il/dictabert は分類ヘッドを持たないマスク言語モデルのベースです。AutoModelForSequenceClassification で読み込んで推論を実行しないでください。ランダムに初期化されたヘッドがインスタンス化され、意味のない予測が返されます。分類には、まずラベル付きデータでファインチューニングするか、dicta-il/dictabert-sentiment や dicta-il/dictabert-ner などのタスク特化型モデルを使用してください。
形態論と接頭辞の分割(dictabert-joint):
from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('dicta-il/dictabert-joint')
model = AutoModel.from_pretrained('dicta-il/dictabert-joint', trust_remote_code=True)
model.eval()
print(model.predict(['ובבית הספר למדנו'], tokenizer, output_style='json'))
文埋め込み(NeoDictaBERT):
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("dicta-il/neodictabert-bilingual-embed", trust_remote_code=True)
query_embeddings = model.encode_query(["query: מתכון לעוגת שוקולד"])
document_embeddings = model.encode_document(["עוגת שוקולד פשוטה בעשר דקות"])
モデルカードに記載されているとおり、クエリには query: の接頭辞を付けてください。これを省くと検索性能が低下します。
DictaLM 3.0(生成、12B instruct):
from transformers import pipeline
generator = pipeline('text-generation', model="dicta-il/DictaLM-3.0-Nemotron-12B-Instruct", trust_remote_code=True)
サービングには、モデルカードで vLLM(vllm serve dicta-il/DictaLM-3.0-Nemotron-12B-Instruct --enable-auto-tool-choice --tool-call-parser hermes --trust-remote-code)が推奨されています。最高品質と Apache-2.0 ライセンスを求める場合は、dicta-il/DictaLM-3.0-24B-Base を使用してください。推論タスクには、最終回答の前に明示的な思考ブロック内に思考の連鎖を記述する dicta-il/DictaLM-3.0-24B-Thinking を使用してください。
ivrit.ai Whisper(音声テキスト変換、faster-whisper):
import faster_whisper
model = faster_whisper.WhisperModel('ivrit-ai/whisper-large-v3-turbo-ct2')
segs, _ = model.transcribe('media-file', language='he')
print(' '.join(s.text for s in segs))
segs はジェネレーターなので、反復処理するまで文字起こしは実行されません。CPU では device="cpu", compute_type="int8" を指定してください。vad_filter=True は無音部分をスキップし、word_timestamps=True は字幕用に単語ごとのタイムスタンプを出力します。標準の transformers を使用する場合は、ivrit-ai/whisper-large-v3 を pipeline("automatic-speech-recognition", ...) で読み込み、generate_kwargs={"language": "he"} を指定してください。
ステップ 3:ヘブライ語テキストの前処理
モデルにテキストを入力する前に、次の処理を行います。
- 正規化: 余分な空白を削除し、Unicode を正規化します(NFC)。
- ニクードの処理: 特に必要でない限り、発音区別符号を削除します。
- 英語の処理: 英語のトークンを保持、翻訳、またはマークするかを決めます。
- トークン化: DictaBERT と AlephBERT のトークナイザーは、単語を形態素ではなく WordPiece のサブユニットに分割します。検索インデックス作成、カウント、レンマ化などで実際の接頭辞分割が必要な場合は、ステップ 2 の
dictabert-jointを実行してください。
import re
import unicodedata
def preprocess_hebrew(text):
# Normalize Unicode
text = unicodedata.normalize('NFC', text)
# Remove niqqud and cantillation, but keep maqaf U+05BE and other punctuation in the block
text = re.sub(r'[֑-ׇֽֿׁׂׅׄ]', '', text)
# Normalize whitespace
text = re.sub(r'\s+', ' ', text).strip()
return text
U+0591 から U+05C7 までの範囲全体を削除するのはよくあるバグです。この処理ではマカフも削除され、ハイフンでつながれた単語が結合されます(עולם־גדול が עולםגדול になります)。
ステップ 4:ニクードの復元(ダイアクリティゼーション)
上記の前処理ではニクードを削除します。反対に、母音記号のないテキストにニクードを追加する処理はダイアクリティゼーションと呼ばれ、独立したヘブライ語 NLP の主要な課題です(テキスト読み上げ、語学学習、曖昧性解消に役立ちます)。
Dicta の Nakdan は標準的なツールです。文字レベルのモデルは HuggingFace で公開されています。
from transformers import AutoModel, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained('dicta-il/dictabert-large-char-menaked')
model = AutoModel.from_pretrained('dicta-il/dictabert-large-char-menaked', trust_remote_code=True)
model.eval()
# predict takes a list of sentences and returns a list of vocalized sentences
vocalized = model.predict(['שלום עולם'], tokenizer)
注意事項:
- モデルにはカスタムの
predictヘッドが含まれているため、trust_remote_code=Trueが必要です。有効にする前にモデルカードを確認してください。 - モデルカードには、このモデルは現代ヘブライ語の散文を対象としており、聖書、ラビ文献、近代以前の文献、詩文を対象としていないと記載されています。
- ダイアクリティゼーションには曖昧さがあります。同じ子音テキストでも、文脈によって複数の有効な発音があり得ます。出力は正解ではなく、最善の推定として扱ってください。
- 形態論的な文脈を考慮した文単位の完全な発音記号付与には、Dicta のホスト型 Nakdan(ステップ 5 を参照)が、通常、文字モデル単体より優れています。
ステップ 5:Dicta のホスト型 REST API
モデルをローカルで実行したくない場合、Dicta は Nakdan、形態論ツールなどをホスト型ウェブサービスとして提供しています。低頻度の利用、プロトタイピング、GPU のない環境に適しています。
- Nakdan(ダイアクリティゼーション):https://nakdan.dicta.org.il/
- 開発者向けアクセスと API の詳細:https://dicta.org.il/developers
ホスト型 API の仕様は変更されるため、統合する前に開発者向けページで現在のエンドポイントの形式、リクエスト形式、レート制限、利用規約を確認してください。エンドポイント URL やペイロードのスキーマを推測せず、公式の開発者向けドキュメントを参照してください。
ステップ 6:代替の NLP エントリーポイント
Dicta と ivrit.ai はヘブライ語に特化した主要なスタックですが、汎用 NLP フレームワークにもヘブライ語パイプラインが付属しています。
- HebSpacy(https://github.com/8400TheHealthNetwork/HebSpacy):spaCy パイプラインです。公開されているモデル
he_ner_news_trfは、16 種類のエンティティタイプに対応する AlephBERT ベースの NER モデルです。品詞タグ付けやレンマ化には対応していません。すでに spaCy を使用していて、ヘブライ語の NER が必要な場合に適しています。導入前に、リポジトリの最終コミット日を確認し、spaCy のバージョンを固定してください。 - Stanza(https://stanfordnlp.github.io/stanza/):Stanford の NLP ツールキットには、トークン化、形態論、レンマ化、依存構造解析に対応するヘブライ語モデルが付属しています。学術用途や多言語パイプラインに適しています。
ヘブライ語の精度を最優先する場合は、引き続き Dicta のモデルが優れています。統合のしやすさが生の品質より重要な場合に、これらのフレームワークを使用してください。
ステップ 7:ヘブライ語特有の課題への対処
- 形態論解析: 正確な単語分割には
dictabert-joint(または Dicta のホスト型ツール)を使用します - 大文字・小文字の区別がない: ヘブライ語には大文字と小文字の区別がないため、NER が難しくなります
- コード内での右から左への表示: 文字列操作で適切な双方向テキスト処理を確保します
- ヘブライ語と英語の混在: 技術文書では一般的であり、個別の処理が必要になる場合があります
- モデルごとにライセンスが異なります: DictaBERT モデルは CC-BY-4.0、DictaLM 24B は Apache-2.0、Nemotron 12B バリアントは NVIDIA Open Model License の下で提供されています。商用提供の前に確認してください
例
例 1:ヘブライ語テキストの分類
ユーザーの依頼:「ヘブライ語の顧客レビューを肯定的か否定的かに分類したい」
結果:まず sentiment-analysis パイプラインで dicta-il/dictabert-sentiment を実行します(学習なしで動作します)。データのサンプルに対する精度が十分でない場合に限り、ラベル付きのドメインレビューでファインチューニングします。
例 2:ヘブライ語の固有表現認識
ユーザーの依頼:「ヘブライ語の記事から会社名と人名を抽出したい」
結果:aggregation_strategy='simple' と WordPiece デコーダーを使用して dicta-il/dictabert-ner パイプラインを実行し、ORG と PER のエンティティを保持します。
例 3:ヘブライ語の録音を書き起こす
ユーザーの依頼:「1 時間のヘブライ語ポッドキャストをテキストに書き起こしたい」
結果:ivrit-ai/whisper-large-v3-turbo-ct2 を指定した faster-whisper を language='he' と vad_filter=True で使用します。セグメントのジェネレーターを反復処理し、各セグメントのテキストとタイムスタンプを書き出します。
同梱リソース
スクリプト
scripts/preprocess_hebrew.py:NLP モデル(DictaBERT、DictaLM、AlephBERT)に入力する前にヘブライ語テキストを正規化します。Unicode NFC 正規化、ニクダーの削除(マカーフは保持)、空白の整理、URL の除去、千位区切り記号とシェケル略語の正規化、ヘブライ語と英語が混在するテキストの分割に対応します。実行方法:python scripts/preprocess_hebrew.py --help
リファレンス
references/model-comparison.md:ヘブライ語 NLP モデル(DictaLM 3.0、DictaBERT、AlephBERT、NeoDictaBERT、ivrit.ai Whisper)を、VRAM 要件、HuggingFace ID、ライセンス、タスクとモデルの対応表とともに比較します。特定のヘブライ語 NLP タスクで使用するモデルを選ぶ際に参照してください。
参考リンク
| ソース | URL | 確認する内容 |
|---|---|---|
| DICTAイスラエルテキスト分析センター(HuggingFace) | https://huggingface.co/dicta-il | DictaLMとDictaBERTの最新モデルバリエーション、ID、ライセンス |
| ivrit.ai(HuggingFace) | https://huggingface.co/ivrit-ai | ヘブライ語ASR向けの最新Whisperファインチューニングモデル、データセットのバージョン |
| HuggingFaceのAlephBERT | https://huggingface.co/onlplab/alephbert-base | AlephBERTのモデルカードと使用方法 |
| ivrit.aiプロジェクトサイト | https://www.ivrit.ai/en/ivrit-ai-2/ | コーパスの規模、ライセンス |
| NNLP-IL(イスラエルのNLPコミュニティ) | https://github.com/NNLP-IL | ヘブライ語NLPリソースとベンチマークの厳選リスト |
| DictaLM 3.0技術レポート(Dicta) | https://dicta.org.il/publications/DictaLM_3_0___Techincal_Report.pdf | アーキテクチャ、ベースモデルの系譜、学習データ、評価結果 |
| Dicta Nakdan(ニクダー付与) | https://nakdan.dicta.org.il/ | ホスト型のニクダー復元ツール |
| Dicta開発者向けアクセス | https://dicta.org.il/developers | ホスト型REST APIの詳細と利用規約 |
| faster-whisper | https://github.com/SYSTRAN/faster-whisper | WhisperModel、compute_type、VAD、単語単位のタイムスタンプ |
| Stanza(ヘブライ語モデル) | https://stanfordnlp.github.io/stanza/ | ヘブライ語のトークン化、形態論、構文解析 |
注意点
- ヘブライ語には大文字がないため、エージェントは英語で有効な大文字化に基づくNER(固有表現認識)のヒューリスティクスを使えません。ヘブライ語のNERには形態素解析または学習済みモデルが必要です。
- ヘブライ語の単語には、複数の小辞(前置詞、接続詞、冠詞)が接頭辞として付き、単語の一部として表記される場合があります。文字列「ובבית」(u-va-bayit)は「家の中で、そして」を表す1つのトークンです。エージェントはこれを1語として扱うことがあります。
- ヘブライ語の文字体系には5つの語末形(ソフィート)があります。カフ、メム、ヌン、ペー、ツァディーです。エージェントはこれらを語中形に正規化することがあり、単語の照合や検索に支障をきたします。
- 現代ヘブライ語のテキストには、ニクダー(母音記号)がほとんど付いていません。ニクダー付きテキストで学習したエージェントは、標準的な母音記号なしのヘブライ語でうまく機能しない場合があります。必ずニクダーなしの入力を想定して設計してください。
- エージェントはシェケルの略記を、שとחの単純な部分文字列置換で「正規化」しがちです。この方法ではשחרやמשחקなどの一般的な単語も書き換えてしまいます。単独のトークンとしてのみ照合してください。
トラブルシューティング
エラー:「トークンが ## を含む断片のように見える」
原因:DictaBERTとAlephBERTはWordPieceトークン化を使用しており、まれな単語をサブワード単位に分割します。これらは形態素ではありません。
解決策:NERでは、Step 2で示したWordPieceデコーダーと併せてaggregation_strategy='simple'を設定してください。実際の接頭辞分割には、dictabert-jointを使用してください。
エラー:「GPUのメモリが不足しています」
原因:BF16では重みだけでパラメーターあたり約2バイト必要なため、KVキャッシュとアクティベーションを除いて、DictaLM 3.0 24Bでは約48GB、Nemotron-12Bバリアントでは約24GB必要です。
解決策:dicta-il/DictaLM-3.0-Nemotron-12B-Instruct(12B)、1.7B Thinking GGUFバリアントに切り替えるか、同じ組織が公開しているFP8/W4A16量子化チェックポイント(例:DictaLM-3.0-24B-Base-FP8)を使用してください。ノートPCクラスのハードウェアでは、llama.cpp経由でGGUFビルドを実行してください。