使用Gensim库对文本进行词袋、TF-IDF和n-gram方法向量化处理

Gensim库简介

机器学习算法需要使用向量化后的数据进行预测,对于文本数据来说,因为算法执行的是关于矩形的数学运算,这意味着我们必须将字符串转换为向量。从数学的角度看,向量是具有大小和方向的几何对象,不需过多地关注概念,只需将向量化看作一种将单词映射到数学空间的方法,同时保留其本身蕴含的信息。

Gensim是世界上最大的NLP/信息检索Python库之一,兼具内存高效性和可扩展性。Gensim的可扩展性体现为它采用了Python内置的生成器和迭代器进行流式数据处理,所以数据集事实上并未完全加载到内存中。Gensim的主要特性有内存无关、潜在语义分析的多核实现、潜在Dirichlet分布、随即投影、分层Dirichlet过程,Word2Vec深度学习,以及在计算集群上运行LSA和LDA的能力。

1、数据预处理

本文通过处理部分新闻文本数据的test.txt,使用spacy和Gensim模块包对该文件进行去除停用词等预处理如下:

import spacy
from spacy.lang.zh.stop_words import STOP_WORDS
import pandas as pd
from gensim import corpora
from gensim import models
import gensim

#去除停用词
def stopwords(article):
    nlp = spacy.load("zh_core_web_sm")
    texts = []
    doc = nlp(article)
    for w in doc:
        if w.is_stop == False:
            texts.append(w.text)
    return texts

在对文本进行预处理后,分别使用词袋、TF-IDF和n-gram三种方法向量化,并分别输出成三份txt。下面讨论向量的几种表示方法:

2、词袋

词袋是将句子转换成向量的直接手段,这种方法在信息检索领域非常常用。词袋模型的一个重要的特征是,他是一种无序的文档表示,唯一的信息是词频,所以我们在使用这种方法的时候无法判断哪个单词会先出现,这样可能导致空间信息以及语义信息的丢失,当然这在一些对词顺序并不重要的应用场景中并不重要。

代码:

#词袋
def cidai(txts):
    dictionary = corpora.Dictionary(txts)
    corpus = [dictionary.doc2bow(word) for word in txts]
    corpus = str(corpus)
    ##将分好的语料库存储在本地
    with open (r"E:\1\Study\大三下\自然语言处理\作业4\bag.txt",'w') as f:
        f.write(corpus)

结果:


词袋结果

3、TF-IDF

词袋向量化的方法仅仅有词语出现的词频的信息,但是有些词频很高的词语却并不一定是关键词,因此我们可以用反向文档词频的方法来减少无效词的干扰,因此TF-IDF的向量表示方法便被提出。TF-IDF是一种将句子转换成向量的直观方法,它被广泛用于搜索引擎的算法。其中,TF表示一个词在文档中出现的词频,IDF表示单词在文档中的重要性。

代码:

#TF-IDF
def TfIdf(txts):
    doc = []
    tfidf = models.TfidfModel(txts)
    for document in tfidf[txts]:
        doc.append(document)
        doc = str(doc)
    with open (r"E:\1\Study\大三下\自然语言处理\作业4\TF_IDF.txt",'w') as f:
        f.write(doc)

结果:


TF-IDF结果

4、n-gram

前面两种表示方法假设字与字之间是相互独立的,没有考虑它们之间的顺序。于是引入n-gram( n元语法)的概念。n-gram指文本中n个相邻单词的连续序列,它是从一个句子中提取n个连续的字的集合,可以获取到字的前后信息。然而,词表的维度随着语料库的增长而膨胀,n-gram词序列随语料库增长呈指数型膨胀,更加快。
代码:

#n-grams
def N_g(txts):
    bigram = gensim.models.Phrases(txts)
    txts = [bigram[line] for line in txts]
    dictionary = corpora.Dictionary(txts)
    #print("token:",dictionary.token2id)
    corpus = [dictionary.doc2bow(text) for text in txts]
    corpus = str(corpus)
    with open (r"E:\1\Study\大三下\自然语言处理\作业4\n_gram.txt",'w') as f:
        f.write(corpus)

结果:


n-gram结果

5、总结

本文介绍了Gensim库以及使用不同向量的几种表示方法(词袋、TF-IDF和n-grams)。计算机支持多种表示方式来变换单词,TF-IDF和词袋便是其中的两种向量表示方法。Gensim是一个Python包,它为我们提供了生成各种向量表示的方法,这些向量将会作为各种机器学习和信息检索算法的输入。
更高级的预处理技术还包括创建n-grams、固定搭配和删除低频词,能帮助我们获得更好的效果。同时,向量的概念也是构成自然语言处理基础的很大因素之一。

你可能感兴趣的:(使用Gensim库对文本进行词袋、TF-IDF和n-gram方法向量化处理)