离散表示 (Word Embedding)
1. OneHot
例如:[1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 这个 one-dimension vector 就代表这是整个句子里的第一个词
- 如果句子很长,那么 one-dimension vector 也会很长,对资源消耗很大
- OneHot 方式并不能记录word 和 word 之间的关系
2. Bags-Of-Words Model 词袋模型
记录的是每个单词在一句话中出现的频率 frequency
例如:John likes to watch movies. Mary likes too; “likes” 在这句话中出现两次,vector是 [1,2,1,1,1,0,0,0,1,1]
- 并不是一个word 的 frequency 越高,这个word的weight 就应该越大
- Bags-Of-Words 也不能记录 word 和 word 之间的关系
3. TF-IDF (term frequency–inverse document frequency) 词频-逆文本频率指数
如果某个单词在一篇文章的出现的频率很高,同时在其他文章中很少出现,则认为该单词大概率是一个关键词
下图 是词频term frequency,代表 单词 w 在 文档 d 中出现的频率
下图是逆文档频率 inverse document frequency, 代表 单词w 在 文档数 N 中出现的比例,比例越小代表单词w越重要
N 表示文档总数,N(w) 代表含有单词w的文档个数
为了防止 IDF 分母不为0,对 IDF 进行了平滑处理
TF-IDF 完整的计算公式:
4. N-gram
基于假设(来自Markov Assumption):第n个词的出现只和前n-1个词相关,和之后的词无关;整个句子出现概率=每组词出现概率相乘
- N=1,又称 Unigram,将句子以每个单词划分 ["I","want","to","eat","chinese", "food"]
- N=2,又称 Bigram,将句子以两个单词一组划分 ["I want", "want to", "to eat", "eat chinese", "chinese food"]
- N=3,又称 Trigram,将句子以三个单词一组划分 ["I want to", "want to eat", "to eat chinese", "eat chinese food"]
- 接着,我们用最大似然估计计算每组词出现的概率
- Unigram 的 最大似然估计是 P(w_i) = C(w_i)/M ,其中C代表单词在整个语料库出现频率,M 表示count(word token)
- Bi-gram 的 最大似然估计是
P(T)=P(w1)*p(w2)*p(w3)***p(wn)=p(w1)*p(w2|w1)*p(w3|w1w2)** *p(wn|w1w2w3...)- 由于上述公式过于复杂,可以用Hidden Markov Chain 简化,简化后变成:
P(T) = P(w1)P(w2|w1)P(w3|w1w2)…P(wn|w1w2…wn-1)≈P(w1)P(w2|w1)P(w3|w2)…P(wn|wn-1)- 而 Bigram 和 Trigram 又在上述公式上做了个性化衍生:
Bi-Gram: P(T)=p(w1|begin)*p(w2|w1)*p(w3|w2)***p(wn|wn-1)
Tri-Gram: P(T)=p(w1|begin1,begin2)*p(w2|w1,begin1)*p(w3|w2w1)***p(wn| wn-1,wn-2)分布式表示 (Word Embedding)
1. Co-Occurance Matrix 共现矩阵
如果拥有3句话I like deep learning. I like NLP. I enjoy flying. 则构成如下共现矩阵; 共现矩阵一定是对称的
Neural Network 表示 (Word Embedding)
1. NNLM(Neural Network Language model)
- 目标是通过n-1个word,计算出第n个word是什么
w代表每一个word,C(w)代表word vector
NNLM 公式:
将 每组word 转成one-hot,再转成 C(w),再通过BP+SGD获得最好的C(w)
2. Word2Vec
把每一个词映射到一个vector, CBOW 和 skip-gram都是word2vec的一种;
通常使用 Negative Sample(负采样) 或者 Hierarchical Softmax 提高速度;
word2vec是一个两层的Neural Network 模型, 训练结果表示词和词之间的关系;
目前 word2vec 无法解决多义词关系,也无法针对特定任务做动态优化
3. CBOW (Word2Vec的变种 Continuous Bags of Words 连续词袋模型)
CBOW 通过Context预测current word
把words进行one-hot编码然后通过一个hidden layer 求和然后再通过softmax得到每一个word的生成概率
然后通过neural network 训练weight让每一个word的生成概率max
4. Skip-gram (Word2Vec的变种)
Skip-gram 通过 current word 预测 context
把 current word 作为 x, 把句子中的其他words作为y; 还是把words进行编码然后通过hidden layer 和 softmax求概率
由于一层softmax计算量大,会用多层softmax(即Hierarchical Softmax)
5. Sense2Vec (Word2Vec的变种)
能够处理更加精准的word vector, 比如 duck这个word的多义性需要多个词向量去表示