Python自然语言处理实战(7):文本向量化

7.1 文本向量化概述

    文本表示是自然语言处理中的基础工作,文本表示的好坏直接影响到整个自然语言处理系统的性能。文本向量化是文本表示的一种重要方式。顾名思义,文本向量化就是将文本表示成一系列能够表达文本语义的向量。无论是中文还是英文,词语都是表达文本处理的最基本单元。当前阶段,对文本向量化大部分的研究都是通过词向量化实现的。与此同时,也有相当一部分研究者将句子作为文本处理的基本单元,于是产生了doc2vec和str2vec技术。

7.2 向量化算法word2vec

    词袋(Bag of Word)模型是最早的以词语为基本处理单元的文本向量化方法。词向量(word2vec)技术就是为了利用嗯神经网络从大量无标注的文本中提取有用信息而产生的。如何使“词表示”包含语义信息是该领域研究者面临的问题。分布假设(distributional hypothesis)的提出为解决上述问题提供了理论基础。该假设的核心思想是:上下文相似的词,其语义也相似。随后有学者整理了利用上下文表示词义的方法,这类方法就是有名的词空间模型(word space model)。随着神经网络模型的发展,接下来将重点三种常见的生成词向量的神经网络模型。

    21世纪初,有研究者试着使用神经网络求解二元语言模型。随后神经网络语言模型(Neural Network Language Model,NNLM)被正式提出。

    NNLM模型的目标是构建一个语言概率模型,而C&W则是以生成词向量为目标的模型,核心机理是:如果n元短语在语料库中出现过,那么模型会给该短语打高分;如果是未出现在语料库中的短语则会得到较低的评分。

    为了更高效地获取词向量,有研究者在NNLM和C&W模型的基础上保留其核心部分,得到了CBOW(Continuous Bag of Words)模型和Skip-gram模型。

    CBOW模型去掉了隐藏层,这回大幅度提升计算速率,使用上下文各词的词向量的平均值替代NNLM模型各个拼接的词向量。使用一段 文本的中间词作为目标词。Skip-gram模型则从目标词w的上下文中选择一个词,将其词向量组成上下文的表示。

     https://arxiv.org/pdf/1301.3781.pdf

7.3 向量化算法doc2vec/str2vec

     同样word2vec技术也用于计算句子或者其他长文本间的相似度,其一般做法是对文本分词后,提取其关键词,用词向量表示这些关键词,接着对关键词向量求平均或者将其拼接,最后利用词向量计算文本间的相似度。这种方法丢失了文本中的语序信息,而文本的语序包含重要信息。为此,有研究者在word2vec的基础上提出了文本向量化(doc2vec),又称str2vec和para2vec。doc2vec技术存在两种模型--Distributed Memory(DM)和Distributed Bag of Words(DBOW),分别对应word2vec技术里的CBOW和Skip-gram模型。

7.4 案例:将网页文本向量化

    采用维基百科里的中文网页作为训练语料库,下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

   维基百科提供的语料是xml格式,需要转移为txt,繁体转为简体。使用Jieba分词工具包对语料中的句子进行分词,最后将处理后的语料存入txt文档中。

# -*- coding: utf-8 -*-
from gensim.corpora import WikiCorpus
import jieba
from langconv import *

def my_function():
    space = ' '
    i = 0
    l = []
    zhwiki_name = './data/zhwiki-latest-pages-articles.xml.bz2'
    f = open('./data/reduce_zhiwiki.txt', 'w')
    wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        for temp_sentence in text:
            temp_sentence = Converter('zh-hans').convert(temp_sentence)
            seg_list = list(jieba.cut(temp_sentence))
            for temp_term in seg_list:
                l.append(temp_term)
        f.write(space.join(l) + '\n')
        l = []
        i = i + 1

        if (i %200 == 0):
            print('Saved ' + str(i) + ' articles')
    f.close()

if __name__ == '__main__':
    my_function()

向量化训练

 

你可能感兴趣的:(NLP)