Python Gensim文本分析——从文本预处理到TFIDF、LDA建模分析

3 篇文章 1 订阅
1 篇文章 0 订阅

1、简介

文本数据的挖掘在当今互发达的联网环境下显得越来越具有价值,数据分析师Seth Grimes曾指出“80%的商业信息来自非结构化数据。本文以中文文本数据作为分析对象,针对中文文本存在的特征进行文本预处理,并调用Gensim工具包实现对文本的TFIDF建模已经LDA建模,从文本中抽取出的特征进行表征文本信息,可用于后续文本相似度、个性化推荐等研究。

2、中文文本预处理

首先,观察如下一条用户在网上所发表的评论:
在这里插入图片描述
不难发现,该用户发表的内容中不仅包含文字,还包括标点符号、emoji表情符号以及url网页链接,是一条十分具有代表性的现在文本数。诸如此类的文本数据,在进行文本挖掘之前,需要进行数据清洗,去除上述干扰信息从而避免影响文本分析的准确性。此外,文本分析的基本单位是词,需要对句子进行分词处理,去除没有实际意义的停用词。
本文通过Pyhon进行文本数据预处理,利用了中文停用词表去除停用词,调用了jieba分词,(注:中文停用词版本较多,可自行下载,这里提供一个版本: 停用词,提取码: h8xn),处理代码如下:

# coding=utf-8
import jieba, re

# 去除原始字符串中的url
def remove_urls(raw_sentence):
    # 正则表达式
    url_reg = r'[a-z]*[:.]+\S+'
    result = re.sub(url_reg, '', raw_sentence)
    return result


# 去除原始字符串中的emoji字符
def remove_emoji(raw_sentence):
    try:
        co = re.compile(u'[\U00010000-\U0010ffff]')
    except re.error:
        co = re.compile(u'[\uD800-\uDBFF][\uDC00-\uDFFF]')
    return co.sub('', raw_sentence)
    return result


# 创建停用词表
def stopwordslist():
    stopwords = [line.strip() for line in open('data/stopWords.txt', encoding='UTF-8').readlines()]
    return stopwords


# 利用jieba分词对文档进行中文分词
def seg_depart(raw_sentence):
    sentence_depart = jieba.cut(raw_sentence.strip())
    stopwords = stopwordslist()
    outstr = ''
    for word in sentence_depart:
        if word not in stopwords:
            outstr += word
            outstr += " "
    return outstr
#测试
sentence = "大众、奥迪现在几乎全部的最新电子科技都用在奥迪身上了,A4L的配置新科技应用很明显…😀https://zhidao.autohome.com.cn/summary/692.html#pvareaid=3454447"
print("原始:" + sentence)
pro_sentence_1 = remove_urls(sentence)
print("去除url: " + pro_sentence_1)
pro_sentence_2 = remove_emoji(pro_sentence_1)
print("去除emoji: " + pro_sentence_2)
final_sentence = seg_depart(pro_sentence_2)
print("分词结果: " + final_sentence)

通过处理后的文本数据结果如下,原始数据中的标点、url、emoji表情以及停用词已经被去除,且不同词之间用空格隔开。
在这里插入图片描述

3、Gensim文本挖掘

对于预处理好的文本数据,可以调用Gensim包进行文本挖掘。Gensim是一款开源的第三方Python工具包,用于从非结构化的文本中,无监督地学习到文本隐层的主题向量表达,支持包括TF-IDF,LSA,LDA,和word2vec在内的多种NPL模型,关于Gensim的详细介绍,可以访问官网了解:Gensim
在这里插入图片描述
将处理好的文本数据存入一个文本文件中,其中每一行代表一个文档,作为IFIDF以及LDA模型的输入,形式如下:
在这里插入图片描述
在进行文本建模分析之前,对于Gensim中比较关键的概念需要了解一下,其中Gensim的输入格式为分词处理好的元数据形成的列表,词典dictionary是文本数据所涉及的所有词,corpus是对文档进行处理后得到的词频向量,关系如下图:

3.1 TFIDF文本分析

对文本数据进行IFIDF分析,代码如下:

# coding=utf-8
from gensim import corpora, models, similarities

# 将分完词的文档加载成符合gensim文格式的输入
with open('data/import_1', 'r', encoding='utf-8') as f:
    train = []
    for line in f.readlines():
        line = [word.strip() for word in line.split()]
        train.append(line)

# 构造词典
dictionary = corpora.Dictionary(train)
feature_cnt = len(dictionary.token2id)  # 词典中词的数量
dictionary.save('dict.txt')  # 保存生成的词典,用于以后加载
# dictionary=Dictionary.load('dict.txt')#加载词典

# 基于词典,将【分词列表集】转换成【向量集】,形成【语料库】
corpus = [dictionary.doc2bow(text) for text in train]

# 使用【TF-IDF模型】处理语料库
tfidf_model = models.TfidfModel(corpus)

# 打印模型参数:文档数量与语料库单词数
print(tfidf_model)

# 存储通过tfidf转化过的文档
with open('data/tfidf_doc.txt', 'w', encoding='utf-8') as fr:
    for doc in tfidf_model[corpus]:
        fr.write(doc.__str__() + '\n')

通过TFIDF转化后每个文档都被表征成在词与权重的大小,文档如下:
在这里插入图片描述
对于一个新的文档,利用上述TFIDF模型进行表征后,与其他文档进行相似度的计算,进行如下处理:

# 加载测试文档,转成词矩阵
with open('data/test.txt', 'r', encoding='utf-8')as fr:
    line = fr.readline()
    test = [word.strip() for word in line.split()]
    test_vec = dictionary.doc2bow(test)

# 对测试文档进行相似度计算
with open('data/doc_sim.txt','w',encoding='utf-8') as sim_f:
    sim = index[tfidf_model[test_vec]]
    for i in range(len(sim)):
        sim_f.write('test 与 text%d 相似度为:%.2f' % (i + 1, sim[i]))

得到测试文档与训练数据中每个文档的相似度如下:

3.2 LDA文本分析

接下来对加载好的语料库利用LDA模型进行分析,代码如下:

# 利用lda模型对语料库进行建模,设置模型的主题的个数、迭代次数
lda = models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=100, iterations=2000)
# 打印LDA模型参数
print(lda)

# 存储LDA文档结果:文档主题-主题分布
with open('data/doc_dis_2.txt', 'w') as f1:
    # for doc in lda_corpus:
    for doc in lda[corpus]:
        f1.write(doc.__str__() + '\n')
        f1.flush()
        
# 存储LDA文档结果:存储主题-词分布
with open('data/topic_dis.txt', 'w') as f2:
    for topic in lda.get_topics():
        f2.write(topic.__str__() + '\n')
        f2.flush()

# 给定测试文档文档推断主题分布
infer_res = lda.get_document_topics(test_vec)
print(infer_res)

LDA 模型训练后的文档表征为在不同主题上的概率分布:
在这里插入图片描述
主题-词的分布如下:
在这里插入图片描述
对于最后给定的测试文档,推断其主题分布如下:
在这里插入图片描述

4、总结

本文阐述与实现了文本数据预处理以及利用TFIDF与LDA进行文本数据挖掘的过程,主要借助python Gensim完成了相关分析,对新的文档能推断其与训练文档的相似度、主题分布。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值