关于 hebrew-nlp-toolkit
hebrew-nlp-toolkit 为处理希伯来语 NLP 的开发者提供实践指南,按任务推荐 Dicta 和 ivrit.ai 模型,并介绍文本预处理、本地模型用法及托管 API。
主要功能
- 01按 NLP 任务推荐模型
- 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 | 包含 13 种实体类型,如 PER、ORG、LOC、GPE、FAC、TIMEX、TTL |
| 情感分析 | DictaBERT Sentiment | dicta-il/dictabert-sentiment | 184M | 开箱即用,返回 Positive / Negative / Neutral 风格的标签 |
| 形态分析 / 分词 | DictaBERT Joint | dicta-il/dictabert-joint | 184M | 前缀分词、词性、词元、依存句法分析 |
| 希伯来语问答 | 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 | 使用约 5,000 小时的音频训练,数据来自 ivrit.ai 语料库(以色列议会全体会议、众包转录、朗诵) |
| 语音转文本(快速) | 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('דוד בן-גוריון נולד בפולין'))
如果没有解码器这一行,返回的分组实体会变成零散的 ## 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:希伯来语文本预处理
将文本输入模型前:
- 规范化: 删除多余空格,规范化 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 范围是一个常见错误:这会删掉 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 的环境。
- 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是基于 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 上的 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/ | 托管的 nikud 还原工具 |
| 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/ | 希伯来语分词、形态分析、句法解析 |
注意事项
- 希伯来语没有大写字母,因此 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 构建版本。