nlp基础之-词汇表构建的具体做法
词汇表构建(Vocabulary Building)是文本数据预处理中的关键步骤,涉及从训练语料中生成一个包含所有可识别单词、子词或字符的集合。具体做法如下:
1. 数据收集与清洗
- 数据收集: 收集所有待处理的文本数据,包括训练集、验证集和测试集。
- 数据清洗: 在构建词汇表之前,清洗数据以去除噪声和不必要的字符(如特殊符号、HTML标签等)。这一步确保词汇表包含的都是有用的词汇。
2. 确定词汇表的大小
- 设定最大词汇表大小: 根据任务需求和计算资源,设定一个合理的词汇表大小限制。过大的词汇表可能导致计算开销过高,而过小的词汇表则可能无法覆盖所有有用的词汇。
- 选择策略: 可以选择固定大小(如前10,000个最频繁的词)或根据具体任务需求动态调整词汇表大小。
3. 统计词频
- 词频统计: 统计每个词(或子词)的出现频率。对于所有训练数据,计算每个词的出现次数,以决定其是否纳入词汇表。
- 常见工具: 使用工具或库(如 Python 的
collections.Counter
或NLTK
)来统计词频。
4. 选择词汇表
- 频率排序: 按照词频从高到低对词汇进行排序。
- 选择词汇: 根据设定的最大词汇表大小,选择前 N 个最频繁的词(或子词)作为词汇表的内容。对于频率较低的词,通常用特殊的
<UNK>
标记(未登录词标记)代替。
5. 构建词汇表
- 词到索引的映射: 为词汇表中的每个词分配一个唯一的整数索引。通常,特殊标记(如
<PAD>
、<UNK>
、<SOS>
、<EOS>
)会被分配给特定的索引。 - 索引到词的映射: 创建一个反向映射,用于将索引转换回词。
6. 处理未登录词(OOV)
- 未登录词标记: 对于训练数据中未出现的词或词汇表外的词,使用
<UNK>
标记进行替代。这确保了模型在遇到未知词时不会出错。 - 预处理阶段: 在将文本转换为模型输入时,将所有未登录词映射到
<UNK>
。
7. 存储和加载词汇表
- 保存词汇表: 将词汇表(词到索引的映射)保存到文件中,以便在模型训练和推理阶段使用。通常保存为 JSON、CSV 或二进制格式。
- 加载词汇表: 在模型训练和推理时,从文件中加载词汇表,并使用它将文本数据转换为模型输入格式。
示例代码
以下是 Python 中使用 collections.Counter
构建词汇表的示例代码:
from collections import Counter
import json
# 示例文本数据
texts = ["I love machine learning.", "Deep learning is fascinating.", "I love programming."]
# 数据清洗和分词(这里简化处理)
def tokenize(text):
return text.lower().split()
# 统计词频
word_freq = Counter()
for text in texts:
words = tokenize(text)
word_freq.update(words)
# 选择前 N 个最频繁的词作为词汇表
vocab_size = 10
vocab = [word for word, freq in word_freq.most_common(vocab_size)]
# 添加特殊标记
vocab = ["<PAD>", "<UNK>"] + vocab
# 词到索引映射
word_to_index = {word: idx for idx, word in enumerate(vocab)}
# 保存词汇表
with open('vocab.json', 'w') as f:
json.dump(word_to_index, f)
# 加载词汇表
with open('vocab.json', 'r') as f:
word_to_index = json.load(f)
print(word_to_index)
总结
词汇表构建的关键在于从训练数据中提取并保存最常见的词汇,处理未登录词,并将词汇表映射到索引。在实际应用中,选择合适的词汇表大小和处理策略对于模型的性能至关重要。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18350353,如有侵权联系删除