### 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)
```