实践目标:
1、掌握词袋模型;
2、编写生成词袋模型的程序。
词袋模型
词袋模型(BOW)将文本看作单词的集合,并忽略单词在文本内的词序。词袋模型是一个二维列表,第1维是文档序列,第2维是文档的词袋模型数据,词袋模型数据是一个列表,列表元素是一个二元组(w,f),w是单词在字典的数字ID,f是单词在文档内出现的次数。

例如:
dictionaries = {'计算机': 0, 'Java编程': 1, 'C++编程': 2, '编程': 3, 'Python编程': 4, '语言': 5, '课程': 6}
text = [[‘Java编程’,’课程’,’Python编程’,’课程’],[‘C++编程’,’语言’,’课程’]]text依据字典dictionaries生成的词袋模型为:
BOW = [[(0,0),(1,1),(2,0),(3,0),(4,1),(5,0),(6,2)], [(0,0),(1,0),(2,1),(3,0),(4,0),(5,1),(6,1)]]
若文档数量为m,字典单词数量为n,生成的词袋模型(BOW)为m*n个二元组。
生成词袋模型(BOW)的Python代码如下:
dictionaries = {'计算机': 0,
'Java编程': 1,
'C++编程': 2,
'编程': 3,
'Python编程': 4,
'语言': 5,
'课程': 6}
texts = [["Java编程","课程","Python编程","课程"],
['C++编程','语言','课程']]
# 应用字典corpus_dict转换text为词袋模型
def toBow(texts, corpus_dict):
# 存储词袋数据
bow = []
# 遍历文档序列
for text in texts:
v = []
# 遍历字典全部单词
for key in corpus_dict.keys():
if key in text:
'''
若text包含字典单词,创建二元组(数字ID,词频)
添加二元组到词袋
'''
v.append((corpus_dict[key], text.count(key)))
else:
'''
若text不包含字典单词,创建二元组(数字ID,0)
添加二元组到词袋
'''
v.append((corpus_dict[key], 0))
# 词袋数据按二元组的数字ID排序
v = sorted(v, key= lambda x: x[0])
bow.append(v)
return bow
# 程序入口
if __name__ == '__main__':
print(toBow(texts,dictionaries))词袋模型(BOW)通过单词和单词的出现频率来表示文本的语义,出现频率高的单词可以提取为文档的关键字。
严格来说,词袋模型(BOW)不是数学意义上的向量(元素是二元组,不是数值),无法使用向量或矩阵运算进行相似度计算。在对词袋模型进行相似度计算之前,还需要对词袋模型数据进行预处理,从模型中抽取单词的出现次数,单独构建向量,模型中的词序不变。
例如:
BOW = [[(0,0),(1,1),(2,0),(3,0),(4,1),(5,0),(6,2)], [(0,0),(1,0),(2,1),(3,0),(4,0),(5,1),(6,1)]]
处理后:
VBOW = [[0,1,0,0,1,0,2], [0,0,1,0,0,1,1]]
转换代码如下:
# 词袋模型抽取为向量
def bow2Vector(bow): vect = [] for m in bow: v = [] for n in m: v.append(n[1]) vect.append(v) return vect
我们将BOW生成代码归并到相似性分析项目中,将代码归并到Dictionary类,做为类的一个方法。
# 输出词袋模型 def doc2bow(self,texts): # 存储词袋数据 self.bow = [] # 遍历文档序列 for text in texts: v = [] # 遍历字典全部单词 for key in self.token2id.keys(): if key in text: ''' 若text包含字典单词,创建二元组(数字ID,词频) 添加二元组到词袋 ''' v.append((self.token2id[key], text.count(key))) else: ''' 若text不包含字典单词,创建二元组(数字ID,0) 添加二元组到词袋 ''' v.append((self.token2id[key], 0)) # 词袋数据按二元组的数字ID排序 v = sorted(v, key= lambda x: x[0]) self.bow.append(v) return self.bow
这节实践课,掌握了词袋模型和生成词袋模型的编程技术。下一实践课应用余弦相似度对文本进行相似性分析。