文本预处理
分词时用到了split函数:
split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
str.split(str="", num=string.count(str))
为方便模型处理,我们需要将字符串转换为数字。因此我们需要先构建一个字典,其中的内容将每个词映射到一个唯一的索引编号:
Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值。
dict = {'Name': 'Zara', 'Age': 27}
print "Value : %s" % dict.get('Age')
print "Value : %s" % dict.get('Sex', "Never")
输出:
Value : 27
Value : Never
分词的常用工具:spaCy和NLTK。
语言模型
假设序列
w
1
,
w
2
,
…
,
w
T
w_1, w_2, \ldots, w_T
w1,w2,…,wT中的每个词是依次生成的,我们有
P
(
w
1
,
w
2
,
…
,
w
T
)
=
∏
t
=
1
T
P
(
w
t
∣
w
1
,
…
,
w
t
−
1
)
=
P
(
w
1
)
P
(
w
2
∣
w
1
)
⋯
P
(
w
T
∣
w
1
w
2
⋯
w
T
−
1
)
P(w_1, w_2, \ldots, w_T)= \prod_{t=1}^T P(w_t \mid w_1, \ldots, w_{t-1})\\= P(w_1)P(w_2 \mid w_1) \cdots P(w_T \mid w_1w_2\cdots w_{T-1})
P(w1,w2,…,wT)=t=1∏TP(wt∣w1,…,wt−1)=P(w1)P(w2∣w1)⋯P(wT∣w1w2⋯wT−1)
词的概率可以通过该词在训练数据集中的相对词频来计算:
P
^
(
w
1
)
=
n
(
w
1
)
n
\hat P(w_1) = \frac{n(w_1)}{n}
P^(w1)=nn(w1)
给定 w1 情况下, w2 的条件概率可以计算为:
P
^
(
w
2
∣
w
1
)
=
n
(
w
1
,
w
2
)
n
(
w
1
)
\hat P(w_2 \mid w_1) = \frac{n(w_1, w_2)}{n(w_1)}
P^(w2∣w1)=n(w1)n(w1,w2)
其中 n(w1,w2) 为语料库中以 w1 作为第一个词, w2 作为第二个词的文本的数量。
基于 n−1 阶马尔可夫链,我们可以将语言模型改写为:
P
(
w
1
,
w
2
,
…
,
w
T
)
=
∏
t
=
1
T
P
(
w
t
∣
w
t
−
(
n
−
1
)
,
…
,
w
t
−
1
)
.
P(w_1, w_2, \ldots, w_T) = \prod_{t=1}^T P(w_t \mid w_{t-(n-1)}, \ldots, w_{t-1}) .
P(w1,w2,…,wT)=t=1∏TP(wt∣wt−(n−1),…,wt−1).
时序数据的采样
时序数据的一个样本通常包含连续的字符。假设时间步数为5,样本序列为5个字符,即“想”“要”“有”“直”“升”。该样本的标签序列为这些字符分别在训练集中的下一个字符,即“要”“有”“直”“升”“机”,即 X =“想要有直升”, Y =“要有直升机”。有两种方式对时序数据进行采样,分别是随机采样和相邻采样:
- 在随机采样中,每个样本是原始序列上任意截取的一段序列,相邻的两个随机小批量在原始序列上的位置不一定相毗邻。
- 在相邻采样中,相邻的两个随机小批量在原始序列上的位置相毗邻。
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
循环神经网络基础
scatter_(input, dim, index, src)将src中数据根据index中的索引按照dim的方向填进input中:
>>> z = torch.zeros(2, 4).scatter_(1, torch.LongTensor([[2], [3]]), 1.23)
>>> z
0.0000 0.0000 1.2300 0.0000
0.0000 0.0000 0.0000 1.2300
[torch.FloatTensor of size 2x4]