NLP的核心是了解文本的语义
one-hot (以下几种方式都属于one-hot的范畴)
通过构建词典的顺序,找出对应单词的位置,
词典:中文有20万-30万个常用词, rnn和lstm中,也有使用字符集的,常用字符大概5000个
例子:
词典(只有7个单词,即7个维度):[今天, 天气, 不错, 挺,风和日丽,的, 明天]
每个单词的表示:
今天:[1, 0, 0, 0, 0, 0, 0]
不错:[0, 0, 1, 0, 0, 0, 0]
的: [0, 0, 0, 0, 0, 1, 0]
句子的表示:两种方式:
1、boolean, 不管出现多少次,在相应位置都为1
2、count, 记录单词出现的频率
而一句话:今天 的 天气 不错 挺 风和日丽 的。用ont-hot表示的话就是:
1、boolean [1, 1, 1, 1, 1, 1, 0] 2、count [1, 1, 1, 1, 1, 2, 0]
文本相似度:
优缺点:多数使用count方法,但是count方法中,无关的词出现的频次会比较多,比如的,他,他们等。而比较重点的词可能为动词。 也就是说出现次数少的,并不代表它的贡献值就越小。
1、欧式距离: d = |s1 - s2| d:距离 s1 s2 句子
通过boolean法或者count法获得句子向量后(s1和 s2的长度为词典的长度)
例:
s1 = [x1, x2, x3] s2 = [y1, y2, y3]
d = |s1 - s2| = √(x1-y1)^2 + (x2-y2)^2 + (x3-y3)^2......
缺点:只有向量大小,没有方向。 值越小,相似度越大
2、余弦相似度: 即考虑向量的方向,又考虑向量的大小, 值越大,相似度越大,
方向和大小折中的一种方法, 值越大,相似度越大,
d = (s1 · s2) / ( |s1| * |s2|) # (s1 · s2) 内积,考虑方向 ( |s1| * |s2|) 考虑向量大小
例:
s1 = [x1, x2, x3] s2 = [y1, y2, y3]
d = x1y1 + x2yx + x3y3 / (√x1^2 + x2^2 + x3^2 * √y1^2 + y2^2 + y3^2)
问题: 并不是出现的越多,就越重要; 并不是出现的越少,就越不重要
于是就引出来-- tf-idf
TF-IDF 逆文本序
公式: tf-idf(w) = tf(d, w) * idf(w)
tf(d, w) : 文档d中w的词频
idf(w) : log(N / N(w)) 考虑单词的重要性 N:语料库中文档的总数, N(w) : 词语w出现在多少个文档中
1、构建词典, 即所有文档中的分词后的总量total_words
2、通过 计算每篇文章的向量: 向量总长度为total_words, 每个位置的向量是tf-idf值, 即当前文章中该词出现的频率 * log(总文档数/ 有多少篇文章出现过该词语) 如:[1*log(100/5),1*log(100/3),2*log(100/50),1*log(100/100), 0, .....]
ont-hot的缺点:
1、one-hot 无法确定两个单词的语义相似度
2、ont-hot的稀疏性 由于中文词典过于庞大,可能有10^5 至10^6个,而一个文本只有寡寡几个单词的时候,矩阵就会变得非常的稀疏
如何评价两个单词之间的语义相似性?
1、欧式距离 都一致, 为根号2
2、余弦相似度, 都一直, 为0
怎么解决?
请见下篇文章,词向量~