简单的机器翻译
简单的机器翻译
1 任务描述
通过词向量和向量空间模型,将英文词翻译为法语词。
2 任务的数据
来自维基百科上的英文单词对应的词向量,以及法语单词对应的词向量。
但是全部的词及其词向量太大,所以只选择的部分数据。
2.1 数据的预处理
这部分是要生成单词和其词向量的字典。已经生成好的字典文件在这,直接利用en_embeddings.p和fr_embeddings.p文件即可。
获取数据字典: 1234import pickleen_embeddings_subset = pickle.load(open("en_embeddings.p", "rb"))fr_embeddings_subset = pickle.load(open("fr_embeddings.p", "rb")) ### 2.2 数据的格式
上一步得到的数据为:
en_embeddings_subset:键是英语词汇,值是300维的词向量。
'the': array([ 0.08007812, 0.104980 ...
PCA简介与实战
PCA(主成分分析)简介与使用
1 PCA(Principal Component Analysis)简介
在平常的研究和应用中处理的数据都是多变量的(多维),能够提供丰富的信息,但是很难对多维的数据各维指标进行分析,因为往往孤立地分析每个指标不能完全利用数据中的信息,但盲目减少指标会损失很多有用的信息。
所以我们需要找到一种合理的方法,在减少需要分析的指标的同时尽量减少原指标包含信息的损失。
数据的各变量之间存在一定的相关关系,所以我们可以考虑将关系紧密的变量变成尽可能少的新变量,使得新得到的变量是两两不相关的。这样就可以用较少的综合指标分别代表存在于各个变量中的信息。
主成分分析(PCA)就是利用上述方法对多维数据进行降维,将拥有多个属性的数据转换为少数属性的数据,便于分析数据。PCA的主要思想是将n维特征映射到k维上(k维特征是从n维特征重新构造出来的正交特征,也称为主成分)
PCA的算法流程是利用数据的协方差矩阵计算其特征值和特征向量,然后选出少量(想要最后拥有多少属性就选择多少)的较大特征值的特征向量与原始数据点积得到降维后的数据。下面来看具体的内容。
降维 ...
词向量的操作(运算)
词向量的操作(运算)
利用预训练好的词向量来发现词之间的同义或对等关系。
1 预训练的词向量
首先导入需要的库: 1234567import pandas as pdimport numpy as npimport pickleimport matplotlib.pyplot as plt%matplotlib inline%config InlineBackend.figure_format='png' 加载已经预训练好的词向量: 12word_embeddings = picle.load(open("word_embeddings_subset.p", "rb"))print(len(word_embeddings)) 243
词向量文件指路:here
展示预训练好的词向量word_embeddings,它是字典类型,键是词,值是相应的向量表示。(篇幅问题只展示一个词向量表示) 12345print(word_embeddings.keys())countryVector = word_embeddin ...
Numpy与线性代数
Numpy与线性代数(Linear Algebra)
Numpy是基于python的一个常用库,利用它来方便地操纵数组。
在python中使用numpy这个库需要提前导入,并起个别名为np:
1import numpy as np
1 numpy数组与python列表
定义python列表: 1alist = [1, 2, 3, 4] 利用numpy定义数组: 1narray = np.array([1, 2, 3, 4]) 输出进行观察和对比两者: 12345print('alist:', alist)print('narray:', narray)print('Type of alist:', type(alist))print('Type of narray:', type(narray)) [1, 2, 3, 4]
[1 2 3 4]
<class 'list'>
<class 'numpy.ndarray'>
2 numpy数组与python列表的运算符
...
深度学习推荐系统模型搭建基础
深度学习推荐系统模型搭建基础
编程基础(Keras函数式API编程)
本项目中所有代码都通过Tensorflow2.x实现,所以熟悉Tensorflow的基础操作,以及tf2中keras的使用(与早期的keras的使用基本上是一致的),对于TF及keras的基础这里不做太多的介绍,可以参考相关的资料进行学习。这里主要说一下keras函数式编程的基本用法。
keras搭建模型主要有两种模式,一种是Sequential API,另外一种是Functional API。前者主要是通过层的有序堆叠形成一个模型,在大多数情况下可以快速的搭建一个模型,但是搭建的模型更适合简单的堆叠模型,对于复杂模型(多输入、多输出、共享层)的搭建就比较困难,所以后者函数式API可以更加灵活的搭建复杂网络,函数式API搭建模型是通过创建层的实例并将将层与层之间连接在一起,最后只需要指定模型的输入和输出就可以完成模型的搭建,不同层的实例可以表示不同的操作,搭建模型的时候只需要考虑层与层之间的关系,以及复杂层的搭建就可以很方便的搭建起一个复杂网络。
回顾Sequential API搭建模型:
12345678 ...
朴素贝叶斯分类器实现情感识别
朴素贝叶斯分类器实现情感识别
利用逻辑回归分类器实现的博客在这里
任务描述
识别推文中的情感是积极的还是消极的。
给定一个推文: I am happy because I am learning NLP
现在,任务目标就是判断上面的推文是积极的情感(positive sentiment)还是消极的情感(nagetive sentiment)。
给定一个训练集,训练集中包含推文和其对应的标签(label),标签取值为1(代表positive)和0(代表negative)。
任务数据集
NLTK语料库中的tweet数据集。
目录
一、数据预处理
二、训练朴素贝叶斯训练模型
三、测试朴素贝叶斯模型
一、数据预处理
1.1 预处理文本
1 stop words 和 punctuation(标点)
在提取特征前,需要去除stop words,因为stop words通常是没有意义的词语,例如下图中的stop words表,这只是其中很小的一部分(对当前例子来说完全足够)。有时候文本中的punctuation(标点)对任务没有影响,这时就可以根据punc ...
字典树(Trie)
字典树(Trie)
0 字典树的引入
我们已经知道树和二叉搜索树等数据结构,那么字典树或者前缀树是用来做什么的呢?
假设我们需要创建一个能提供单词拼写检查的程序,它能给出这个单词是否有效(不需要给出建议的单词)。那么我们该如何实现呢?
最简单的方式是利用一个具有所有已知词汇的哈希表,该哈希表能在O(1)的时间内判断单词是否存在,但是它需要的存储将会是O(n*m),n是单词的个数,m是单词的长度。如果利用字典树(前缀树),那么将能够降低空间复杂度只牺牲一点时间性能。
1 基础的字典树
首先来看有着"a","add"和"hi"的基础字典树:
利用字典实现: 123456789101112basic_trie = { # a 和 add 'a':{ 'd':{ 'd':{'word_end': True}, 'word_end': False}, 'word_end': True ...
逻辑回归分类器实现情感识别
逻辑回归分类器实现情感识别
任务描述
识别推文中的情感是积极的还是消极的。
给定一个推文: I am happy because I am learning NLP
现在,任务目标就是判断上面的推文是积极的情感(positive sentiment)还是消极的情感(nagetive sentiment)。
给定一个训练集,训练集中包含推文和其对应的标签(label),标签取值为1(代表positive)和0(代表negative)。
任务数据集
NLTK语料库中的tweet数据集。
目录
一、数据预处理
二、逻辑回归分类器
三、特征提取
四、训练模型
五、测试所写逻辑回归分类器
一、数据预处理
1.1 用向量表示文本(represent a text as a vector)
为了用向量来表示文本,首先需要创建一个词汇表(vocabulary),根据词汇表把文本(text)编码为数组(数组里面是数字)。
在该任务中,遍历数据集所有的推文,将所有的推文用到的全部词汇整理为词汇表(不含重复的词语)。
根据上述词汇表,进行推文的特征提取(f ...
正则化
正则化
为什么需要正则化?
在训练的过程中学习权重的时候存在一个问题就是模型会完美匹配训练数据。如果一个特征十分适合预测结果,它就会被赋上一个很大的权重。特征的权重会努力去完美拟合训练样本的细节,这时的完美其实就是过完美,它会学到偶然发生的噪声。这样的结果就是,模型在训练集上的效果很好,但是在测试集上的效果比较差,也就是 \(\color{purple}{过拟合}\)。一个好的模型应该有能力从训练集到测试集(unseen test set)进行泛化(generalize),也就是对没有见过的样本也能比较好地进行分类。
为了避免过拟合问题,模型可以加入正则化。
什么是正则化?
正则化项(regularization term) \(R(\theta)\) 可以加到目标方程中来防止过拟合。例如如下最大化正确分类的对数概率公式中(假设是mini-batch训练,m个样本一个batch,公式里去掉了1/m这个系数,因为不影响目标):
新的正则化项 \(R(\theta)\) 用于惩罚大的权重。所以对于一个能对训练数据很好分类的权重集合A(但它使用很多值很大的权重做到的)和一个对训 ...
二分查找
二分查找
1 什么是二分查找
首先,我们来看 \(\color{purple}{线性查找(Linear Search)}\) 。对于一组无序的数字,想要从中查找某个数字的话就得从这组数字的头开始,依次往后比较,要么找到了该数字,要么找到了尾部都没有,那就是不存在这个数。上述过程就是线性查找,这组数字越长查找的性能就越差,时间复杂度为 O(n)。
是否有更好的查找方式呢?
二分查找就是。
如果我们拿到的是一组有序的数字,进行二分查找的方式是:首先比较 \(color{green}{中间位置}\) 的数字和目标是否相同,如果相同则结束查找,如果目标值小于中间位置的数字那么从左半边再找(查找步骤和上面一致),如果目标值大于中间位置的数字那么从右半边再找(查找步骤和上面一致)。
这个查找过程每次都直接缩减了一半的查找空间。现在来计算二分查找的时间效率:
\(color{purple}{最好的情况}\): 第一次直接在中间位置找到。
\(color{purple}{最坏的情况}\):找到了最后也没找到。那么查找的次数可以通过下面的方式计算:
长度为n为一组数字,累积的查 ...