gensim简介

gensim简介

作为自然语言处理爱好者,大家都应该听说过或使用过大名鼎鼎的Gensim吧,这是一款具备多种功能的神器。

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。

它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训练,并提供了诸如相似度计算,信息检索等一些常用任务的API接口

安装方法:pip install gensim

基本概念

  • 语料(Corpus):一组原始文本的集合,由文档列表组成,用于无监督地训练文本主题的隐层结构。语料中不需要人工标注的附加信息。在Gensim中,Corpus通常是一个可迭代的对象(比如列表)。每一次迭代返回一个可用于表达文本对象的稀疏向量。

  • 向量(Vector):由一组文本特征构成的列表。是一段文本在Gensim中的内部表达。

  • 稀疏向量(SparseVector):通常,我们可以略去向量中多余的0元素。此时,向量中的每一个元素是一个(key, value)的元组。

  • 模型(Model):是一个抽象的术语。定义了两个向量空间的变换(即从文本的一种向量表达变换为另一种向量表达)。

常见主题模型总结

1. TF-IDF

TF-IDF(注意:这里不是减号)是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜索引擎应用,作为文件与用户查询之间相关程度的度量或评级。

  1. 一个词预测主题能力越强,权重就越大,反之,权重就越小。我们在网页中看到“原子能”这个词,或多或少地能了解网页的主题。我们看到“应用”一次,对主题基本上还是一无所知。因此,“原子能“的权重就应该比应用大。
  2. 应删除词的权重应该是零。

2. LDA文档主题生成模型

LDA是一种文档主题生成模型,包含词、主题和文档三层结构。

所谓生成模型,就是说,我们认为一篇文章的每个词都是通过“以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语”这样一个过程得到。文档到主题服从多项式分布,主题到词服从多项式分布。

LDA是一种非监督机器学习技术,可以用来识别大规模文档集或语料库中潜藏的主题信息。它采用了词袋的方法,这种方法将每一篇文档视为一个词频向量,从而将文本信息转化为了易于建模的数字信息。

但是词袋方法没有考虑词与词之间的顺序,这简化了问题的复杂性,同时也为模型的改进提供了契机。每一篇文档代表了一些主题所构成的一个概率分布,而每一个主题又代表了很多单词所构成的一个概率分布。

代码示例

1. 训练语料预处理

下面是一个示例语料库,它由10个文档组成,其中每个文档都是一个由单个句子组成的字符串。

text_corpus = [
    '36氪CEO冯大刚:行业内二三四五名加起来都没我们强,我们是最强的',
     '为薅羊毛加了十几个互助群 网友:双十一我好难啊',
     '史上最强商业模式?万物皆可订阅的时代正来临',
     '价值70万元国画快递中受损 快递公司:只能赔300元',
     '中国电商巨头逐鹿东南亚市场 多头混战生态格局持续',
     '比特大陆最新内部邮件:启动全员调薪',
     '电子商务助推脱贫 贫困村通宽带比例达到97%',
     '上海市经信委邀虎扑文化等10家重点科创企业座谈',
     '微软为Chromium版Edge浏览器准备了新Logo',
     '多款网售电子烟仍参与“双十一”促销'
]

分词并去除停用词

import jieba

stop_words = list("的地得:?:“”, ")
text_list = [[item.strip() for item in list(jieba.cut(text)) \
              if item.strip() and item.strip() not in stop_words]  \
              for text in text_corpus]
print(text_list)

结果

[['36', '氪', 'CEO', '冯大刚', '行业', '内', '二三', '四五名', '加', '起来', '都', '没', '我们', '强', '我们', '是', '最强'],
 ['为', '薅', '羊毛', '加', '了', '十几个', '互助', '群', '网友', '双十', '一', '我', '好', '难', '啊'],
 ['史上', '最强', '商业模式', '万物', '皆', '可', '订阅', '时代', '正', '来临'],
 ['价值', '70', '万元', '国画', '快递', '中', '受损', '快递', '公司', '只能', '赔', '300', '元'],
 ['中国', '电商', '巨头', '逐鹿', '东南亚', '市场', '多头', '混战', '生态', '格局', '持续'],
 ['比特', '大陆', '最新', '内部', '邮件', '启动', '全员', '调薪'],
 ['电子商务', '助推', '脱贫', '贫困村', '通', '宽带', '比例', '达到', '97%'],
 ['上海市', '经信委邀', '虎', '扑', '文化', '等', '10', '家', '重点', '科创', '企业', '座谈'],
 ['微软', '为', 'Chromium', '版', 'Edge', '浏览器', '准备', '了', '新', 'Logo'],
 ['多款', '网售', '电子', '烟', '仍', '参与', '双十', '一', '促销']]

2. 词袋模型

文档转化为词袋模型,结果为[(token, token在该文档中出现的频率), …]

dic = corpora.Dictionary(text_list)
corpus = [dic.doc2bow(text) for text in text_list]
print(corpus[0])

结果

[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1), (8, 2), (9, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)]

3. TFIDF

tfidf_model = models.TfidfModel(corpus)
print(tfidf_model[corpus[0]])

tfidf_model.save("./tfidf.model")
tfidf = models.TfidfModel.load("./tfidf.model")
print(tfidf[corpus[0]])

结果

[(0, 0.23585221748020752), (1, 0.23585221748020752), (2, 0.23585221748020752), (3, 0.23585221748020752), (4, 0.23585221748020752), (5, 0.16485362547480026), (6, 0.23585221748020752), (7, 0.23585221748020752), (8, 0.47170443496041503), (9, 0.23585221748020752), (10, 0.16485362547480026), (11, 0.23585221748020752), (12, 0.23585221748020752), (13, 0.23585221748020752), (14, 0.23585221748020752), (15, 0.23585221748020752)]

[(0, 0.23585221748020752), (1, 0.23585221748020752), (2, 0.23585221748020752), (3, 0.23585221748020752), (4, 0.23585221748020752), (5, 0.16485362547480026), (6, 0.23585221748020752), (7, 0.23585221748020752), (8, 0.47170443496041503), (9, 0.23585221748020752), (10, 0.16485362547480026), (11, 0.23585221748020752), (12, 0.23585221748020752), (13, 0.23585221748020752), (14, 0.23585221748020752), (15, 0.23585221748020752)]

LSI

lsi_model = models.LsiModel(corpus, num_topics=2, id2word=dic)
documents = lsi_model[corpus]
print(lsi_model[corpus[0]])
print([item for item in documents])

结果

[(0, 4.2056404045594995), (1, 1.086715713287038)]

[[(0, 4.2056404045594995), (1, 1.086715713287038)], [(0, 1.1764090147511927), (1, -3.5082869411230417)], [(0, 0.44806346836872357), (1, 0.18294844490095152)], [], [], [], [], [], [(0, 0.2506661781155588), (1, -1.1812392740758637)], [(0, 0.22653177673635805), (1, -1.0110321473687516)]]

小结

gensim作为一款强大且开源的工具包非常值得我们花时间学习,如果对搜索引擎和自然语言处理感兴趣,更需要深入学习。在学习过程中建议大家多关注一些牛人博客,并进行归纳。

参考资料

公子天:https://www.cnblogs.com/iloveai/p/gensim_tutorial.html

官网:https://radimrehurek.com/gensim

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值