NLP Primmer:Representation

要把语言交给机器学习中的算法去处理,通常首先需要将语言数学化,这种数学化的方式统称为:表示
下面分别接讨论两个问题,词向量化与文档向量化

1.词向量化(word2vec)

2.文档向量化(text2vec)

为什么要介绍文档向量化,比如在使用LDA模型时,LDA将整个文档视为词袋模型(Bag of Word),这个词袋模型就是文档向量化的一种方式,词袋模型的思想是,首先得到文档中不重复的词的集合,记为voc(字典),其次,对于一个文档(doc or text),然后初始化一个与字典长度相同的向量,将其对应位置设置为这个文档中词的频数,如下图所示:

  • 1.经过分词后的doc

  • 2.构建个不重复的词集voc

  • 3.使用bow表示的doc1

代码如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#1. 数据
doc1 = "apple orange banana"
doc2 = "apple orange apple"
doc3 = "cat dog tiger"
doc4 = "dog cat"

doc_set = [doc1,doc2,doc3,doc4]

#2. 分词
doc_tokenize = []
for doc in doc_set:
doc_tokenize.append(nltk.word_tokenize(doc))

print(doc_tokenize)

#3. 构建词集
def create_vocabulary(doc_tokenize):
vocabSet = set()
for doc in doc_tokenize:
vocabSet = vocabSet | set(doc)
return list(vocabSet)

voc = create_vocabulary(doc_tokenize)
voc = sorted(voc)
print(voc)

#4. 表示(文档向量)
def bow(vocabSet,inputset):
returnVec = [0 for t in range(len(vocabSet))]
for word in inputset:
if word in vocabSet:
returnVec[vocabSet.index(word)] += 1
return returnVec

bow1 = bow(voc,doc_tokenize[0])
print(doc1)
print(bow1)

'''
#5 表示(文档矩阵)
'''

doc_matrix = []
for doc in doc_tokenize:
doc_matrix.append(bow(voc,doc))

print(doc_matrix)

输出如下所示:

参考文档

  1. wikipedia 词袋模型
  2. paddle book
  3. 词向量和语言模型
  4. word2vec
  5. 词向量( Distributed Representation)工作原理是什么?