# 如何实现自然语言处理的集束搜索解码器

• 文本生成问题的解码问题。
• 贪婪的搜索解码器算法，以及如何在Python中实现它。
• 集束搜索解码器算法，以及如何在Python中实现它。

## 生成文本的解码器

- 引用出自《自然语言处理和机器翻译手册》第272页。

- 引用出自《自然语言处理中的神经网络方法》页227。

## 贪婪的搜索解码器

```# define a sequence of 10 words over a vocab of 5 words
data = [[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1]]
data = array(data)```

```# greedy decode
def greedy_decoder(data):
# index for largest probability each row
return [argmax(s) for s in data]```

```from numpy import array
from numpy import argmax

# greedy decode
def greedy_decoder(data):
# index for largest probability each row
return [argmax(s) for s in data]

# define a sequence of 10 words over a vocab of 5 words
data = [[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1]]
data = array(data)
# decode sequence
result = greedy_decoder(data)
print(result)```

`[4, 0, 4, 0, 4, 0, 4, 0, 4, 0]`

## 光束搜索解码器

- 第125-126页，人工智能：现代方法（第3版），2009年。

- 2017年神经机器翻译的束搜索策略

```# beam search
def beam_search_decoder(data, k):
sequences = [[list(), 1.0]]
# walk over each step in sequence
for row in data:
all_candidates = list()
# expand each current candidate
for i in range(len(sequences)):
seq, score = sequences[i]
for j in range(len(row)):
candidate = [seq + [j], score * -log(row[j])]
all_candidates.append(candidate)
# order all candidates by score
ordered = sorted(all_candidates, key=lambda tup:tup[1])
# select k best
sequences = ordered[:k]
return sequences```

```from math import log
from numpy import array
from numpy import argmax

# beam search
def beam_search_decoder(data, k):
sequences = [[list(), 1.0]]
# walk over each step in sequence
for row in data:
all_candidates = list()
# expand each current candidate
for i in range(len(sequences)):
seq, score = sequences[i]
for j in range(len(row)):
candidate = [seq + [j], score * -log(row[j])]
all_candidates.append(candidate)
# order all candidates by score
ordered = sorted(all_candidates, key=lambda tup:tup[1])
# select k best
sequences = ordered[:k]
return sequences

# define a sequence of 10 words over a vocab of 5 words
data = [[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1],
[0.1, 0.2, 0.3, 0.4, 0.5],
[0.5, 0.4, 0.3, 0.2, 0.1]]
data = array(data)
# decode sequence
result = beam_search_decoder(data, 3)
# print result
for seq in result:
print(seq)```

```[[4, 0, 4, 0, 4, 0, 4, 0, 4, 0], 0.025600863289563108]
[[4, 0, 4, 0, 4, 0, 4, 0, 4, 1], 0.03384250043584397]
[[4, 0, 4, 0, 4, 0, 4, 0, 3, 0], 0.03384250043584397]```

## 概要

• 文本生成问题的解码问题。
• 贪婪的搜索解码器算法，以及如何在Python中实现它。
• 集束搜索解码器算法，以及如何在Python中实现它。

0 条评论

## 相关文章

2876

37111

### 【NLP】Attention Model（注意力模型）学习总结

最近两年，注意力模型（Attention Model）被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中，是深度学习技术中最值得关注...

5032

### 【干货】一文读懂什么是变分自编码器

【导读】本文是工程师Irhum Shafkat的一篇博文，主要梳理了变分自编码器的相关知识。我们知道，变分自编码器是一种生成模型，在文本生成、图像风格迁移等诸多...

2.3K12

872

7035

### 熵的理解

---- 熵 熵在信息论中代表随机变量不确定度的度量。一个离散型随机变量X的熵H(X)定义为： image.png 明确定义的科学名词且与内容无关，而且不随信息...

3006

932

4886

### RNN与机器翻译

---- CS224d-Day 9: GRUs and LSTMs -- for machine translation 视频链接 课件链接 ---- 本...

3555