使用KenLM训练n-gram语言模型 (中文)

KenLM工具

相比于SRILM训练工具包,KenLM的诞生更later,训练速度更快,支持单机大数据集训练,相关链接如下:
KenLM开源github
KenLM 工具包主页
KenLM各参数命令的含义
工具包下载地址:http://kheafield.com/code/kenlm.tar.gz
下载KenLM

wget -O - https://kheafield.com/code/kenlm.tar.gz |tar xz

使用cmake编译安装,更详细的信息见kenlm/主目录下的BUILDING文件

mkdir -p build
cd build
cmake ..
### N-gram语言模型原理及编码 #### 原理 N-gram 模型是一种统计语言模型,用于根据前面 (N - 1) 个词预测当前词。它通过分析词语的共现频率,来建模一段文本中词语的相互关系,广泛应用于自然语言处理(NLP)领域,如语言建模、机器翻译、拼写纠错、文本生成等任务。不过,N-gram 模型也存在一些局限性,例如缺乏长期依赖,只能建模到前 n - 1 个词;随着 n 的增大,参数空间呈指数增长;数据稀疏,难免会出现 OOV(Out-of-Vocabulary)的问题;单纯基于统计频次,泛化能力差 [^3]。 #### 编码 ```python import nltk from nltk.util import ngrams from collections import Counter # 示例文本 text = "I love natural language processing" tokens = nltk.word_tokenize(text) # 生成3-gram trigrams = ngrams(tokens, 3) trigram_counts = Counter(trigrams) # 输出结果 for trigram, count in trigram_counts.items(): print(f"{trigram}: {count}") ``` ### GPT预训练语言模型原理及编码 #### 原理 GPT 使用更强大的利用自注意力(self - attention)机制的 Transformer 解码器(即 Transformer 的 Decoder 部分)作为特征抽取器。Decoder 使用 Masked Multi Self Attention 屏蔽了单词的后面内容,是现成的语言模型,实现了单向性,这也是 GPT 作为生成式模型的重要原因。它只选用利用上文预测下文进行单向语言训练 [^1]。 #### 编码 ```python from transformers import GPT2LMHeadModel, GPT2Tokenizer # 加载预训练模型和分词器 tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2LMHeadModel.from_pretrained("gpt2") # 输入文本 input_text = "Once upon a time" input_ids = tokenizer.encode(input_text, return_tensors='pt') # 生成文本 output = model.generate(input_ids, max_length=100, num_beams=5, no_repeat_ngram_size=2, early_stopping=True) # 解码输出 generated_text = tokenizer.decode(output[0], skip_special_tokens=True) print(generated_text) ``` ### BERT预训练语言模型原理及编码 #### 原理 BERT 是预训练语言模型,在自然语言处理领域取得了巨大成功。它通过在大规模无监督文本数据上进行预训练,学习到文本的通用语义表示。BERT 使用 Transformer 的编码器架构,能够捕捉文本中的长距离依赖关系 [^1]。 #### 编码 ```python from transformers import BertTokenizer, BertModel import torch # 加载预训练模型和分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') # 输入文本 text = "This is a sample sentence." inputs = tokenizer(text, return_tensors='pt') # 获取模型输出 outputs = model(**inputs) last_hidden_states = outputs.last_hidden_state print(last_hidden_states.shape) ``` ### 基于KenLM生成N-gram的代码 ```python import kenlm # 训练KenLM模型 # 假设已经有一个文本文件'train.txt' import os os.system('lmplz -o 3 < train.txt > train.arpa') os.system('build_binary train.arpa train.klm') # 加载KenLM模型 model = kenlm.Model('train.klm') # 计算句子的概率 sentence = "This is a test." score = model.score(sentence) print(f"Sentence score: {score}") ``` ### 基于BERT的文本分类代码 ```python from transformers import BertTokenizer, BertForSequenceClassification import torch from torch.utils.data import DataLoader, Dataset # 自定义数据集类 class TextClassificationDataset(Dataset): def __init__(self, texts, labels, tokenizer, max_length): self.texts = texts self.labels = labels self.tokenizer = tokenizer self.max_length = max_length def __len__(self): return len(self.texts) def __getitem__(self, idx): text = self.texts[idx] label = self.labels[idx] encoding = self.tokenizer.encode_plus( text, add_special_tokens=True, max_length=self.max_length, padding='max_length', truncation=True, return_tensors='pt' ) return { 'input_ids': encoding['input_ids'].flatten(), 'attention_mask': encoding['attention_mask'].flatten(), 'labels': torch.tensor(label, dtype=torch.long) } # 示例数据 texts = ["This is a positive sentence.", "This is a negative sentence."] labels = [1, 0] # 加载预训练模型和分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2) # 创建数据集和数据加载器 dataset = TextClassificationDataset(texts, labels, tokenizer, max_length=128) dataloader = DataLoader(dataset, batch_size=2, shuffle=True) # 训练模型 optimizer = torch.optim.Adam(model.parameters(), lr=2e-5) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model.to(device) for epoch in range(3): for batch in dataloader: input_ids = batch['input_ids'].to(device) attention_mask = batch['attention_mask'].to(device) labels = batch['labels'].to(device) outputs = model(input_ids, attention_mask=attention_mask, labels=labels) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() print(f'Epoch {epoch + 1} completed') ``` ### 基于GPT的文本生成代码 ```python from transformers import GPT2LMHeadModel, GPT2Tokenizer # 加载预训练模型和分词器 tokenizer = GPT2Tokenizer.from_pretrained("gpt2") model = GPT2LMHeadModel.from_pretrained("gpt2") # 输入提示文本 prompt = "The story begins with" input_ids = tokenizer.encode(prompt, return_tensors='pt') # 生成文本 output = model.generate( input_ids, max_length=150, num_beams=5, no_repeat_ngram_size=2, early_stopping=True ) # 解码输出 generated_text = tokenizer.decode(output[0], skip_special_tokens=True) print(generated_text) ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值