mcpField
H
hebrew-nlp-toolkit

hebrew-nlp-toolkit

github.com/skills-il开发2643 次安装2 周前更新
代码仓库

关于 hebrew-nlp-toolkit

hebrew-nlp-toolkit 为处理希伯来语 NLP 的开发者提供实践指南,按任务推荐 Dicta 和 ivrit.ai 模型,并介绍文本预处理、本地模型用法及托管 API。

主要功能

  1. 01按 NLP 任务推荐模型
  2. 02情感分析与实体识别
  3. 03形态分析与文本切分
  4. 04希伯来语语音转写
  5. 05文本规范化与元音符号恢复

适用场景

  1. 01分类希伯来语客户评价
  2. 02从文章中提取人名和组织名
  3. 03转写希伯来语音频

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/skills-il/localization --skill hebrew-nlp-toolkit

安装后在 Claude Code 中输入/hebrew-nlp-toolkit确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

evidence.json
metadata.json
optimization-log.json
SKILL_HE.md
references/
model-comparison.md
scripts/
preprocess_hebrew.py

详细介绍

希伯来语 NLP 工具包

说明

第 1 步:确定 NLP 任务
任务推荐模型HuggingFace ID大小备注
文本生成(大型)DictaLM 3.0 24B Basedicta-il/DictaLM-3.0-24B-Base24B希伯来语生成效果最佳,基于 Mistral-Small-3.1-24B 构建。Apache-2.0
文本生成(小型)DictaLM 3.0 Nemotron Instructdicta-il/DictaLM-3.0-Nemotron-12B-Instruct12B经指令微调。NVIDIA Open Model License,并非 Apache
推理 / 思维链DictaLM 3.0 24B Thinkingdicta-il/DictaLM-3.0-24B-Thinking24B回答前会输出明确的思考块
轻量级 / 边缘设备DictaLM 3.0 1.7B Thinking (GGUF)dicta-il/DictaLM-3.0-1.7B-Thinking-GGUF1.7B可通过 llama.cpp 在笔记本电脑 / CPU 上运行
分类 / 掩码填充DictaBERTdicta-il/dictabert184M基础模型,可针对分类任务微调
命名实体识别(NER)DictaBERT NERdicta-il/dictabert-ner184M包含 13 种实体类型,如 PER、ORG、LOC、GPE、FAC、TIMEX、TTL
情感分析DictaBERT Sentimentdicta-il/dictabert-sentiment184M开箱即用,返回 Positive / Negative / Neutral 风格的标签
形态分析 / 分词DictaBERT Jointdicta-il/dictabert-joint184M前缀分词、词性、词元、依存句法分析
希伯来语问答DictaBERT HeQdicta-il/dictabert-heq184M抽取式问答
嵌入(现代)NeoDictaBERT Bilingual Embeddicta-il/neodictabert-bilingual-embed~363M希伯来语-英语句子嵌入,768 维
嵌入(旧版)AlephBERTonlplab/alephbert-baseBERT-base用于相似度计算的较旧基准模型
语音转文本ivrit.ai Whisper v3ivrit-ai/whisper-large-v31.55B使用约 5,000 小时的音频训练,数据来自 ivrit.ai 语料库(以色列议会全体会议、众包转录、朗诵)
语音转文本(快速)ivrit.ai Whisper v3 Turbo CT2ivrit-ai/whisper-large-v3-turbo-ct2809M面向 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('דוד בן-גוריון נולד בפולין'))

如果没有解码器这一行,返回的分组实体会变成零散的 ## WordPiece 片段。

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 指令模型):

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,请使用 pipeline("automatic-speech-recognition", ...) 加载 ivrit-ai/whisper-large-v3,并设置 generate_kwargs={"language": "he"}。

步骤 3:希伯来语文本预处理

将文本输入模型前:

  1. 规范化: 删除多余空格,规范化 Unicode(NFC)
  2. 处理元音符号: 除非有特定需要,否则移除附加符号
  3. 处理英语: 决定保留、翻译还是标记英语词元
  4. 分词: 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 范围是一个常见错误:这会删掉 maqaf,并将连字符连接的词合并(עולם־גדול 会变成 עולםגדול)。

步骤 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)

注意:

  • 需要设置 trust_remote_code=True,因为该模型附带自定义的 predict 头。启用前请先查看模型卡。
  • 模型卡说明,该模型面向现代希伯来语散文,并非用于圣经、拉比文献、前现代或诗歌文本。
  • 元音标注存在歧义:根据上下文,同一辅音文本可能有多种有效的元音标注。请将输出视为最佳猜测,而非绝对真值。
  • 若要结合形态上下文进行完整的句子级元音标注,Dicta 托管的 Nakdan(见步骤 5)通常优于原始字符模型。
步骤 5:Dicta 托管 REST API

如果不想在本地运行模型,Dicta 会将其工具(Nakdan、形态分析等)作为托管 Web 服务提供。这适用于低频使用、原型开发或没有 GPU 的环境。

集成前,请在开发者页面上核实当前端点格式、请求格式、速率限制和使用条款,因为托管 API 的约定可能会发生变化。不要臆测端点 URL 或负载架构,请查阅官方开发者文档。

第 6 步:其他 NLP 入门选项

Dicta 和 ivrit.ai 是专门针对希伯来语的主要技术栈,但另外两个通用 NLP 框架也提供希伯来语处理管线:

  • HebSpacy(https://github.com/8400TheHealthNetwork/HebSpacy):一个 spaCy 处理管线,其发布的模型 he_ner_news_trf 是基于 AlephBERT 的 NER 模型,包含 16 种实体类型。它不提供 POS 标注或词形还原。适用于已在使用 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:希伯来语命名实体识别

用户说:“从希伯来语文章中提取公司和人名” 结果:使用 dicta-il/dictabert-ner 管线,设置 aggregation_strategy='simple' 并使用 WordPiece 解码器,然后保留 ORG 和 PER 实体。

示例 3:转录希伯来语录音

用户说:“将一小时的希伯来语播客转录为文本” 结果:使用 faster-whisper,设置 ivrit-ai/whisper-large-v3-turbo-ct2、language='he' 和 vad_filter=True;遍历 segments 生成器,并将每个 segment 的文本及其时间戳写入文件。

捆绑资源

脚本
  • scripts/preprocess_hebrew.py:在将希伯来语文本输入 NLP 模型(DictaBERT、DictaLM、AlephBERT)之前进行规范化。处理 Unicode NFC 规范化、去除 niqqud(保留 maqaf)、清理空白、剥离 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 上的 AlephBERThttps://huggingface.co/onlplab/alephbert-baseAlephBERT 模型卡和用法
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/托管的 nikud 还原工具
Dicta 开发者访问https://dicta.org.il/developers托管 REST API 详情和条款
faster-whisperhttps://github.com/SYSTRAN/faster-whisperWhisperModel、compute_type、VAD 和词级时间戳
Stanza(希伯来语模型)https://stanfordnlp.github.io/stanza/希伯来语分词、形态分析、句法解析

注意事项

  • 希伯来语没有大写字母,因此 Agent 无法使用适用于英语的基于大小写的 NER(命名实体识别)启发式方法。希伯来语 NER 需要形态分析或训练好的模型。
  • 希伯来语单词可以带有多个前缀虚词(介词、连词、冠词),并与词干连写。字符串「ובבית」(u-va-bayit)表示「and in the house」,是一个单独的词元。Agent 可能会将其视为一个单词。
  • 希伯来字母系统有五种词尾形式(sofit):kaf、mem、nun、pe、tsadi。Agent 可能会将它们规范化为非词尾形式,从而破坏词语匹配和搜索。
  • 现代希伯来语文本中几乎从不出现 nikud(元音符号)。使用带 nikud 标注的文本训练的 Agent 可能无法处理标准的无元音符号希伯来语。务必针对不带 nikud 的输入进行设计。
  • Agent 常常会用简单的子字符串替换,将谢克尔的缩写规范化为 ש 和 ח,这也会改写 שחר 和 משחק 等普通词语。仅在其作为独立词元时进行匹配。

故障排除

错误:「词元看起来像带有 ## 的片段」

原因:DictaBERT 和 AlephBERT 使用 WordPiece 分词,会将罕见词拆分为子词片段。这些不是语素。 解决方案:对于 NER,请设置 aggregation_strategy='simple',并使用步骤 2 中所示的 WordPiece 解码器。若要对真实前缀进行切分,请使用 dictabert-joint。

错误:「GPU 内存不足」

原因:使用 BF16 时,权重本身每个参数约占 2 字节,因此 DictaLM 3.0 24B 约需 48GB,Nemotron-12B 变体约需 24GB,尚未计入 KV 缓存和激活值。 解决方案:改用 dicta-il/DictaLM-3.0-Nemotron-12B-Instruct(12B)、1.7B Thinking GGUF 变体,或使用同一组织发布的 FP8 / W4A16 量化检查点(例如 DictaLM-3.0-24B-Base-FP8)。对于笔记本级硬件,可通过 llama.cpp 运行 GGUF 构建版本。

评论

支持 Markdown