NLP学习系列 | 构建词典
- 🍨 本文为🔗365天深度学习训练营中的学习记录博客
- 🍖 原作者:K同学啊
一、知识总结
在 NLP 系统中构建词典,核心是围绕 “适配任务、数据驱动、可控质量”
1. 核心目标
- 按任务定方向:分词词典侧重 “基础词 + 领域词”,词性标注词典需加 “词汇 - 词性映射”,语义理解词典要补 “专业术语 + 语义关联”(如同义词);
- 划范围:确定是通用词典(日常词汇)还是领域词典(如医疗 / 法律术语),以及词汇颗粒度(单字 / 复合词 / 短语)。
2. 数据源
- 优先组合:通用语料(如新闻、维基,覆盖广)+ 领域语料(如医疗文献,精准)+ 权威词典(如《现汉》,校准规范);
- 避坑:少用纯噪声数据(如杂乱社交媒体),小场景可补人工整理的术语表(保证精度)。
3. 预处理
- 清洗:去特殊符号 / 错别字,中文繁简统一、英文大小写归一;
- 提词:中文用 jieba 等工具分词,英文按空格拆分 + 处理缩写;过滤停用词(如 “的 /the”)和低频词(如出现 < 5 次的词,减冗余);
- 规范:词形还原(如 “running”→“run”)、同义词合并(如 “手机 - 移动电话”)。
4. 核心结构设计
- 必选字段:词汇(唯一标识)+ 词性(如 “苹果→名词”)+ 频次(反映重要性);
- 可选字段(按需加):语义关联(同义词 / 上下位词)、领域标签(如 “靶向药→医疗”)、预训练词向量(支撑语义计算);
- 存储:小规模用 TXT/CSV,中大规模用 JSON / 数据库,集成工具(如 jieba)用对应专用格式。
5. 常用构建方法
- 自动法:用 TF-IDF、预训练模型(如 BERT)从语料提词,适合大规模基础词典;
- 半自动法:自动提词后人工过滤错误(如误提的无意义词),平衡效率和精度;
- 手动法:纯人工整理(如小领域术语表),适合高精度小场景。
6. 迭代
- 定期更新:新增新词(如 “AI 生成式”)、淘汰过时词(如旧网络用语);
- 验证优化:用任务效果(如分词准确率)反向调整词典,比如漏分的词补进词典。
二、代码实践
1、导入数据
pip install torch==2.1.2 torchtext==0.16.2
import torchtext
from torchtext.vocab import build_vocab_from_iterator
from collections import Counter
from torchtext.data.utils import get_tokenizer
import jieba,re,torchdata = ["我是技术小黑啊~","我是一个深度学习博主","这是学习NLP的一个训练集","你可以通过CSDN找到我"
]
2、设置分词器
pip install jieba
import jiebaimport os
# 打印当前工作目录(绝对路径)
print("当前 Python 工作目录:", os.getcwd())tokenizer = jieba.lcut
jieba.load_userdict("my_dict.txt")
当前 Python 工作目录: /root/365天训练营/NLP小白入门/day02
3、清除标点符号与停用词
在使用 jieba 进行分词时,可以通过去除标点符号来减少分词结果的噪音
def remove_punctuation(text):return re.sub(r'[^\w\s]', '', text)stop_words = set(["的","这","是"
])# 去除停用词的函数
def remove_stopwords(words):return [word for word in words if word not in stop_words]
4、设置迭代器
def yield_tokens(data_iter):for text in data_iter:text = remove_punctuation(text)text = tokenizer(text)text = remove_stopwords(text)yield text
5、构建词典
# 使用build_vocab_from_iterator来构建词汇表
vocab = build_vocab_from_iterator(yield_tokens(data), specials=["<unk>"])# 将未知的词汇索引为0
vocab.set_default_index(vocab["<unk>"])
6、文本数字化
# 打印词汇表中的内容
print("词典大小:", len(vocab))
print("词典内部映射:", vocab.get_stoi())text = "这是我的365天深度学习训练营教案"
words = remove_stopwords(jieba.lcut(text))
print("\n")
print("jieba分词后的文本:", jieba.lcut(text))
print("去除停用词后的文本:", remove_stopwords(jieba.lcut(text)))
print("数字化后的文本:",[vocab[word] for word in words])
词典大小: 18
词典内部映射: {'集': 17, '通过': 16, '这是': 15, '深度': 13, '<unk>': 0, '可以': 8, '我': 1, '一个': 2, '学习': 3, 'NLP': 5, '啊': 9, '你': 6, 'CSDN': 4, '技术': 12, '博主': 7, '小黑': 10, '训练': 14, '找到': 11}jieba分词后的文本: ['这', '是', '我', '的', '365', '天', '深度', '学习', '训练营', '教案']
去除停用词后的文本: ['我', '365', '天', '深度', '学习', '训练营', '教案']
数字化后的文本: [1, 0, 0, 13, 3, 0, 0]
熟悉了NLP领域中的字典构建 , 后续为继续学习NLP其他知识打下基础.