DL学习笔记——NLP

0.python基础

https://www.codecademy.com/catalog

1.github

下载

2.AI

https://www.codecademy.com/catalog/subject/artificial-intelligence
————————————————

11.1 自然语言处理

一般来说,NLP任务希望能够做到以下三件事之一:

标记文本区域:例如,词性标注、情感分类或命名实体识别

链接两个以上的文本区域:例如共指,指的是识别表示同一个实体的名词短语或代词,并将其进行归类。

试着填补基于上下文的信息空缺:例如,用完形填空的方式补齐单词缺失的部分。

11.2 监督NLP学习

输入句子,输出结果

难点一:输入数据不仅从数字变成了文本,而且还是可变长度的文本。

难点二:  输入数据与输出有什么关系?具有相关性的关系是什么?

词袋模型:给定电影评论中的词汇,预测其情绪

创建一个矩阵,其中每一行(向量)对应于每个电影评论,每一列表示评论中是否包含词汇表中的特定单词。这种存储形式称为one-hot编码。

下载数据集

# Download reviews.txt and labels.txt from here: https://github.com/udacity/deep-learning/tree/master/sentiment-network

def pretty_print_review_and_label(i):
   print(labels[i] + "\t:\t" + reviews[i][:80] + "...")

g = open('reviews.txt','r') # What we know!
reviews = list(map(lambda x:x[:-1],g.readlines()))
g.close()

g = open('labels.txt','r') # What we WANT to know!
labels = list(map(lambda x:x[:-1].upper(),g.readlines()))
g.close()

Capturing Word Correlation in Input Data

import numpy as np

onehots = {}
onehots['cat'] = np.array([1,0,0,0])
onehots['the'] = np.array([0,1,0,0])
onehots['dog'] = np.array([0,0,1,0])
onehots['sat'] = np.array([0,0,0,1])

sentence = ['the','cat','sat']
x = onehots[sentence[0]] + \
    onehots[sentence[1]] + \
    onehots[sentence[2]]

print("Sent Encoding:" + str(x))

11.3 对影评进行预测

 基于编码策略和已掌握的神经网络,可以预测电影评论的情绪色彩。

预处理:

import sys

f = open('reviews.txt')
raw_reviews = f.readlines()
f.close()

f = open('labels.txt')
raw_labels = f.readlines()
f.close()

tokens = list(map(lambda x:set(x.split(" ")),raw_reviews))

vocab = set()
for sent in tokens:
    for word in sent:
        if(len(word)>0):
            vocab.add(word)
vocab = list(vocab)

word2index = {}
for i,word in enumerate(vocab):
    word2index[word]=i

input_dataset = list()
for sent in tokens:
    sent_indices = list()
    for word in sent:
        try:
            sent_indices.append(word2index[word])
        except:
            ""
    input_dataset.append(list(set(sent_indices)))

target_dataset = list()
for label in raw_labels:
    if label == 'positive\n':
        target_dataset.append(1)
    else:
        target_dataset.append(0)

权重的相似度表示单词的相似度。

用欧式距离来可视化权重的相似度。

from collections import Counter
import math 

def similar(target='beautiful'):
    target_index = word2index[target]
    scores = Counter()
    for word,index in word2index.items():
        raw_difference = weights_0_1[index] - (weights_0_1[target_index])
        squared_difference = raw_difference * raw_difference
        scores[word] = -math.sqrt(sum(squared_difference))

    return scores.most_common(10)

神经元在网络中的含义来自于预测目标的标签。神经网络对除了手头的任务之外的所有信息一无所知。

我们要找到一项能够让神经网络学到更有价值的权重的任务。

11.4 完形填空

通过更丰富的信号来学习单词更丰富的含义。

任务设置:我们将不再尝试为一整条电影评论预测出一个标签,而是将文本划分成5个单词一组的短语,删除一个单词(一个重点词汇),尝试训练一个网络,利用去掉单词剩余部分来预测去掉的那个词汇。此外,使用一项名为负抽样的技巧来让网络训练的更快一些。

负抽样:在每次正向传播中,随机忽略其中大多数标签(假设它们不存在)

import sys,random,math
from collections import Counter
import numpy as np

np.random.seed(1)
random.seed(1)
f = open('reviews.txt')
raw_reviews = f.readlines()
f.close()

tokens = list(map(lambda x:(x.split(" ")),raw_reviews))
wordcnt = Counter()
for sent in tokens:
    for word in sent:
        wordcnt[word] -= 1
vocab = list(set(map(lambda x:x[0],wordcnt.most_common())))

word2index = {}
for i,word in enumerate(vocab):
    word2index[word]=i

concatenated = list()
input_dataset = list()
for sent in tokens:
    sent_indices = list()
    for word in sent:
        try:
            sent_indices.append(word2index[word])
            concatenated.append(word2index[word])
        except:
            ""
    input_dataset.append(sent_indices)
concatenated = np.array(concatenated)
random.shuffle(input_dataset)

alpha, iterations = (0.05, 2)
hidden_size,window,negative = (50,2,5)

weights_0_1 = (np.random.rand(len(vocab),hidden_size) - 0.5) * 0.2
weights_1_2 = np.random.rand(len(vocab),hidden_size)*0

layer_2_target = np.zeros(negative+1)
layer_2_target[0] = 1

def similar(target='beautiful'):
  target_index = word2index[target]

  scores = Counter()
  for word,index in word2index.items():
    raw_difference = weights_0_1[index] - (weights_0_1[target_index])
    squared_difference = raw_difference * raw_difference
    scores[word] = -math.sqrt(sum(squared_difference))
  return scores.most_common(10)

def sigmoid(x):
    return 1/(1 + np.exp(-x))

for rev_i,review in enumerate(input_dataset * iterations):
  for target_i in range(len(review)):
        
    # since it's really expensive to predict every vocabulary
    # we're only going to predict a random subset
    target_samples = [review[target_i]]+list(concatenated\
    [(np.random.rand(negative)*len(concatenated)).astype('int').tolist()]) #每次只预测一个随机子集,因为对每个词汇都进行预测的代价过于高昂。

    left_context = review[max(0,target_i-window):target_i]
    right_context = review[target_i+1:min(len(review),target_i+window)]

    layer_1 = np.mean(weights_0_1[left_context+right_context],axis=0)
    layer_2 = sigmoid(layer_1.dot(weights_1_2[target_samples].T))
    layer_2_delta = layer_2 - layer_2_target
    layer_1_delta = layer_2_delta.dot(weights_1_2[target_samples])

    weights_0_1[left_context+right_context] -= layer_1_delta * alpha
    weights_1_2[target_samples] -= np.outer(layer_2_delta,layer_1)*alpha

  if(rev_i % 250 == 0):
    sys.stdout.write('\rProgress:'+str(rev_i/float(len(input_dataset)
        *iterations)) + "   " + str(similar('terrible')))
  sys.stdout.write('\rProgress:'+str(rev_i/float(len(input_dataset)
        *iterations)))
print(similar('terrible'))

11.5 损失函数的意义

即使神经网络基于相同的统计信息进行训练,你也可以根据对输入和预测目标的选择,对神经网络所学习的内容进行定位。这个过程是“智能定位”。

控制输入和预测目标的值并不是进行“智能定位”的唯一方法。你还可以通过调整网络测量误差的方式、网络层的参数数量和类型,以及应用的正则化类型来改变网络的学习过程。在深度学习中,所有这些技术都属于构建所谓损失函数的范畴。

神经网络并不能真正从数据中学习,它们只是使损失函数最小化。

损失函数的选择决定了神经网络学到的知识。

不同种类的网络架构、算子设计、正则化技巧、数据集合非线性数据,这些都是我们可以用来构造损失函数的“一揽子”方法。

例如,如果网络过拟合、可以通过选择更简单的非线性关系、更少的网络层参数、更浅的网络架构、更大的数据集或者更激进的正则化技术,来增强损失函数。

如果测试结果出了问题,不妨去损失函数中找寻改进的方法。

11.6 单词类比(完形填空)

如果将词向量看成一个二维向量,可能有助于我们理解单词类比是如何逐步发挥作用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值