python 处理NLP问题

1.分词:
中文可用jieba库直接分词
英文依靠逗号
2.词形归一化(词干提取)(单词变体还原)
在英文中使用,可将动词一些变化转化为原型。
语言形态学和信息检索里,词干提取是去除词缀得到词根的过程,例如working的词干为work。
3.去除stopwords
将助词等去掉,留下较为纯粹的关键词。
stopwords有对应的成熟的数据库。

同义词问题

方法一
通过神经网络进行训练。要根据上下文,最后训练的出word2vec来表示单词或句子。
网络模型如下:
NLP 人与机器的对话
如上图所示:首先输入的是one-hot向量,第一层是一个全连接层,然后没有**函数,输出层是一个softmax层,输出一个概率分布,表示词典中每个词出现的概率。

1 输入层:上下文单词的onehot.(简单来说oneshot将字符串转化成二进制数字表示) {假设单词向量空间dim为V,上下文单词个数为C},假定要预测的单词是fox,那么输入层为quick、brown、jumps、over,采用one-hot编码,分别为[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]、[0, 0, 1, 0, 0, 0, 0, 0, 0, 0]、[0, 0, 0, 0, 1, 0, 0, 0, 0, 0]、[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]
2 所有onehot分别乘以共享的输入权重矩阵W. {VN矩阵,N为自己设定的数,初始化权重矩阵W}
3 所得的向量 {因为是onehot所以为向量} 相加求平均作为隐层向量, size为1
N.
4 乘以输出权重矩阵W’ {NV}
5 得到向量 {1
V} **函数处理得到V-dim概率分布 {其中的每一维度代表着一个单词}
6 概率最大的index所指示的单词为预测出的中间词(target word)与true label的onehot做比较,误差越小越好(根据误差更新权重矩阵)
所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量,这个矩阵也叫做look up table,也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。

注:详情参见


方法二
通过python的NLTK库(网络结构存储,涉及图论知识):
此库可以存储每一个词的近义词,同义词。然而此库并不包括中文。现阶段的解决方案是将中文调用开放的python翻译库,翻译成英文,再得到关键词再翻译回来。

判断一词多义问题

case 1 有足够的上下文

网络训练方法:
RNN等

详情参见

case2 上下文不足或者只是单纯的一句话

如果一个词对应的word2vec形式具有多个并且向量差比较大,则可认为有多种意思。

去重问题方案(语义相似合并)

关键词转换成对应的word2vec之后计算向量差与与设定的阈值进行比较,筛选出最能代表语义的词。

欧式距离法:

NLP 人与机器的对话
考虑的是点的空间距离,各对应元素做差取平方求和后开方。能体现数值的绝对差异。参见


上述所说可以是以词为一个整体也可以是以句子为一个整体
比如说可以把词转化成词向量,也可以把句子转化成句向量。这些转化有不同的网络模型,仍在不断地研究与更新。

利用神经网络进行语义分类

用途:
例如:在海量的评论中筛选出代表积极和消极的信息等。

关于人机聊天

概括地说,通过深度学习seq2seq模型,在训练大量的人人之间的聊天内容之后,获取针对某一段话,最有可能出现的回答是什么,网络输出概率最高的那个词就是理想的回答。

NLP 人与机器的对话
详情参见:这里

相关文章: