文本转换为向量模型(3):词袋模型
4294字,阅读需时15分钟

实践目标:

1、掌握词袋模型;

2、编写生成词袋模型的程序。

词袋模型

词袋模型(BOW)将文本看作单词的集合,并忽略单词在文本内的词序。词袋模型是一个二维列表,第1维是文档序列,第2维是文档的词袋模型数据,词袋模型数据是一个列表,列表元素是一个二元组(w,f),w是单词在字典的数字ID,f是单词在文档内出现的次数。

03.png

例如:

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

这节实践课,掌握了词袋模型和生成词袋模型的编程技术。下一实践课应用余弦相似度对文本进行相似性分析。

我要评论
全部评论