词性标注:从基础到高级模型的探索
立即解锁
发布时间: 2025-09-04 00:59:32 阅读量: 8 订阅数: 36 AIGC 

### 词性标注:从基础到高级模型的探索
#### 1. 基于逻辑回归的词性标注分类器应用
在词性标注任务中,当我们获取了训练特征 `X_train` 和对应的词性标签 `y_train_cat` 后,就可以开始训练分类器。这里使用 `scikit-learn` 库中 `linear_model` 模块的逻辑回归算法及其 `fit()` 函数进行训练:
```python
from sklearn import linear_model
classifier = linear_model.LogisticRegression()
model = classifier.fit(X_train, y_train_cat)
```
接着,我们编写 `predict()` 函数对句子进行词性预测。该函数使用 `DictVectorizer` 的 `transform()` 函数对特征进行编码,然后使用 `predict()` 方法应用分类器进行预测。最后,将预测的词性标签存储在数据集字典的 `PPOS` 键中:
```python
def predict_sentence(sentence,
model,
dict_vectorizer,
ppos_key='PPOS'):
sent_words, _ = extract_cols(sentence)
X_cat = create_X_cat(sent_words)
X = dict_vectorizer.transform(X_cat)
y_pred_vec = model.predict(X)
# We add the predictions in the PPOS column
for row, y_pred in zip(sentence, y_pred_vec):
row[ppos_key] = y_pred
return sentence
```
将该函数应用于测试集的所有句子,使用这个简单的程序(大部分代码用于格式化 `X` 矩阵),在英语网络树库(EWT)上可达到 90.24% 的准确率,相比基线提高了 3.8%;在法语 GSD 语料库上准确率为 94.05%。
#### 2. 前馈神经网络进行词性标注
接下来,我们将从逻辑回归转向前馈神经网络,并使用 `PyTorch` 作为编程 API。
##### 2.1 单层网络的词性标注编程
首先,加载数据集并进行预处理以构建 `X` 矩阵,这与之前的步骤基本相同,唯一的区别是要确保 `PyTorch` 张量与 `NumPy` 数组具有相同的数值类型。为此,我们将矩阵向量化为非稀疏的 32 位浮点数类型:
```python
dict_vectorizer = DictVectorizer(sparse=False, dtype=np.float32)
```
向量化后,将得到的数组转换为张量:
```python
X_train = torch.from_numpy(X_train)
X_val = torch.from_numpy(X_val)
X_test = torch.from_numpy(X_test)
```
在 `PyTorch` 中,`yy` 向量是索引向量,而在 `scikit-learn` 中它可以是字符串列表。我们首先创建转换字典:
```python
idx2pos = dict(enumerate(sorted(set(y_train_cat))))
pos2idx = {v: k for k, v in idx2pos.items()}
```
然后将词性字符串进行转换:
```python
y_train = torch.LongTensor(
list(map(lambda x: pos2idx.get(x), y_train_cat)))
y_val = torch.LongTensor(
list(map(lambda x: pos2idx.get(x), y_val_cat)))
y_test = torch.LongTensor(
list(map(lambda x: pos2idx.get(x), y_test_cat)))
```
为三个数据集创建 `TensorDataset` 和 `DataLoader` 对象,训练过程中设置 `batch_size` 为 512,即每次更新使用 512 个样本:
```python
train_dataset = TensorDataset(X_train, y_train)
train_dataloader = DataLoader(
train_dataset, batch_size=512, shuffle=True)
val_dataset = TensorDataset(X_val, y_val)
val_dataloader = DataLoader(
val_dataset, batch_size=2048, shuffle=False)
test_dataset = TensorDataset(X_test, y_test)
test_dataloader = DataLoader(
test_dataset, batch_size=2048, shuffle=False)
```
使用 `Sequential` 模块构建模型,逻辑回归模型只有一个线性层,输入维度是 `X` 矩阵的行长度,输出维度是词性的总数:
```python
model = nn.Sequential(
nn.Linear(X_train.size(dim=1), len(pos2idx))
)
```
使用 `nadam` 优化器,学习率 `LR` 为 0.005:
```python
loss_fn = nn.CrossEntropyLoss()
# cross entropy loss
optimizer = torch.optim.NAdam(model.parameters(), lr=LR)
```
##### 2.2 模型训练
编写训练循环,在训练集上拟合参数并在验证集上评估结果,这有助于监控梯度下降过程,判断模型何时开始过拟合。首先定义一个评估函数,用于计算模型的损失和准确率:
```python
def evaluate(model,
loss_fn,
dataloader) -> tuple[float, float]:
model.eval()
with torch.no_grad():
loss = 0
acc = 0
batch_cnt = 0
for X_batch, y_batch in dataloader:
batch_cnt += 1
y_batch_pred = model(X_batch)
loss += loss_fn(y_batch_pred, y_batch).item()
acc += (sum(torch.argmax(y_batch_pred, dim=-1)
== y_batch)/y_batch.size(dim=0)).item()
return loss/batch_cnt, acc/batch_cnt
```
训练循环如下:
```python
```
0
0
复制全文
相关推荐










