用python处理文本数据

Q:这篇文章主要讲什么?

A:这篇文章主要讨论如何用python来做一些简单的文本处理——文本相似度比较。

谈起python的自然语言处理,肯定会让人想起NLTK。不过上面这两个任务并不需要NLTK这个库,只是用到了gensim。由于涉及中文,所以还用到了jieba来做中文分词。

Q:Gensim是什么东西?

A:首先说说gensim是个怎样的python库吧。

由于这篇笔记只记录最简单的用法,所以gensim更详细的介绍,更强大的功能请到官网阅读文档:gensim官网。不懂英文?赶紧去补啊!

gensim

Gensim is a free Python library designed to automatically extract semantictopics from documents, as efficiently (computer-wise) and painlessly (human-wise) as possible.

简单来说,gensim的主要功能有把文本转为向量(scikit-learn也能做到),抽取文本中的关键词(jieba也能做到),比较两个文本的相似度,甚至是计算一个查询(本质也是一个文本)与一个文档集合中所有文档的关联程度(这个似乎只有gensim能做,sklearn和jieba都不能)。更强大的是,gensim库实现了word2vec算法(其实我目前不懂这个算法的原理)!。

gensim有三个主要模块——

  • corpora:将文本转为向量,提供存储文本矩阵的方法。这里生产的向量形式是最基本的,族简单的,仅仅是为文档建立词典,然后计数文档中每个词出现的次数。
  • models:将corpora生产的简单向量转化为其他各种不同的向量。可以选择的向量模型有TFIDF, LSI, RP, LDA, HDP等。用户可以先用corpora模块把文本转为简单向量,再用models模块得到自己需要的向量形式。
  • similarites:提供计算文本相似度方法的模块。

gensim其他更强大的功能还没列出,所以想要深入学习就得去官网查阅文档了。

Q:如何使用gensim来计算文本相似度?

A:计算一个查询(字符串)与文档集中所有文档的相似度是搜索引擎的核心功能模块之一。gensim计算文本相似度的的套路就是先用copora模块把文档转为简单的稀疏矩阵;然后用models模块得到符合需要的向量模型;最后用similarities模块计算相似度。下面用一个案例来说明怎样计算文本相似度。

假设现在有一个八个文档组成的文档集:

texts = [    '什么是股票?',    '股票是个什么玩意?',    '新手怎样入门炒股?',    '现在股市的风险大吗?',    'python的自然语言处理',    'gensim的主要功能有把文本转为向量',    '提供存储文本矩阵的方法',    '这篇文章主要讨论如何用python来做一些简单的文本处理']

由于文本转向量算法的原理是统计文本中每个单词出现的个数,所以我们还要把文档集里的每个文档切词,也就是说把一个文档编程一个单词列表(或者数组,或者任何数据容器iterable)。西方语言由于先天就用空格把词分开,而类似中文的东方语言则需要特定的分词模块。一个常用的中文分词模块是jieba分词——可以分词、可以做词性标注、可以抽取关键字的分词模块。详见官方文档(当然是中文的)。

docs = [jieba.lcut_for_search(i) for i in texts] #返回一个包含着很多单词列表的列表。In [4]: print docs[[u'什么', u'是', u'股票', u'?'], [u'股票', u'是', u'个', u'什么', u'玩意', u'?'], [u'新手', u'怎样', u'入门', u'炒股', u'?'], [u'现在', u'股市', u'的', u'风险', u'大', u'吗', u'?'], [u'python', u'的', u'自然', u'语言', u'自然语言', u'处理'], [u'gensim', u'的', u'主要', u'功能', u'有', u'把', u'文本', u'转为', u'向量'], [u'提供', u'存储', u'文本', u'矩阵', u'的', u'方法'], [u'这', u'文章', u'篇文章', u'主要', u'讨论', u'如何', u'用', u'python', u'来', u'做', u'一些', u'简单', u'的', u'文本', u'本处', u'处理', u'文本处理']]#原谅我的机器在打印整个列表时,所有中文会变成unicode编码

下一步是构建文档集(单词列表集)的词典,然后利用词典来用向量表示文档

In [10]: dic = corpora.Dictionary(docs)In [11]: print dic  #这个词典给文档集中每个单词编号Dictionary(45 unique tokens: [u'风险', u'本处', u'的', u'处理', u'什么']...)In [12]: corpus = [dic.doc2bow(i) for i in docs]In [13]: print corpus [[(0, 1), (1, 1), (2, 1), (3, 1)], [(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)], [(3, 1), (6, 1), (7, 1), (8, 1), (9, 1)], [(3, 1), (10, 1), (11, 1), (12, 1), (13, 1), (14, 1), (15, 1)], [(12, 1), (16, 1), (17, 1), (18, 1), (19, 1), (20, 1)], [(12, 1), (21, 1), (22, 1), (23, 1), (24, 1), (25, 1), (26, 1), (27, 1), (28, 1)], [(12, 1), (25, 1), (29, 1), (30, 1), (31, 1), (32, 1)], [(12, 1), (16, 1), (17, 1), (24, 1), (25, 1), (33, 1), (34, 1), (35, 1), (36, 1), (37, 1), (38, 1), (39, 1), (40, 1), (41, 1), (42, 1), (43, 1), (44, 1)]]#这是稀疏矩阵的一种形式,每个列表的每个括号表示(词编号,词的出现次数)

这样一来,文本就转换成矩阵了。不过这个矩阵的向量模型非常简单,我们要用一个高级一点的LSI(潜语义分析)向量模型来做相似度计算。应用models模块的可以做到向量模型的转换。

In [14]: lsi = models.LsiModel(corpus, id2word=dic, num_topics=2)

向量模型转换完成,下面开始进行计算相似度的工作。为了方便和明显,我们计算一下“股票”这个词和“文本”这两个查询与文档集中八个文档的相似度。如果没有意外,按照我们的直觉,我们会看到“股票”这个查询和文档集中前四个文档比较相似,“文本”这个查询和文档集中后四个文档比较相似。

In [21]: qurey1 = "股票"      #首先把这两个查询也变成向量    ...: qurey2 = '文本'    ...: vec_query1 = dic.doc2bow([qurey1])    ...: vec_query2 = dic.doc2bow([qurey2])In [22]: index = similarities.MatrixSimilarity(lsi[corpus])#然后建立索引(估计是倒排词表,下面的就不怎么懂了)In [23]: sims1 = index[lsi[vec_query1]]    ...: sims2 = index[lsi[vec_query2]]#得到了查询语句与哥哥文档的相似度In [24]: sims_result1 = sorted(enumerate(sims1), key=lambda item: -item[1])    ...: sims_result2 = sorted(enumerate(sims2), key=lambda item: -item[1])#给结果排一下序    In [25]: print sims_result1[(1, 0.99990207), (0, 0.99984658), (2, 0.99941468), (3, 0.93057805), (6, 0.31655648), (5, 0.27374423), (4, 0.12518336), (7, -0.11772308)]In [27]: print sims_result2[(4, 0.99776512), (7, 0.98443955), (5, 0.97619325), (6, 0.96549642), (3, 0.4200055), (2, 0.092727646), (0, 0.076089963), (1, 0.07257086)]

很明显的看到“股票”这个查询和文档集中前四个文档比较相似,“文本”这个查询和文档集中后四个文档比较相似,这也是符合我们的常识的。

完整代码:

#coding: utf-8import sys, jiebafrom gensim import corpora, models, similaritiesreload(sys)sys.setdefaultencoding('utf8')texts = [    '什么是股票?',    '股票是个什么玩意?',    '新手怎样入门炒股?',    '现在股市的风险大吗?',    'python的自然语言处理',    'gensim的主要功能有把文本转为向量',    '提供存储文本矩阵的方法',    '这篇文章主要讨论如何用python来做一些简单的文本处理']docs = [jieba.lcut_for_search(i) for i in texts]dic = corpora.Dictionary(docs)corpus = [dic.doc2bow(i) for i in docs]lsi = models.LsiModel(corpus, id2word=dic, num_topics=2)qurey1 = "股票"qurey2 = '文本'vec_query1 = dic.doc2bow([qurey1])vec_query2 = dic.doc2bow([qurey2])index = similarities.MatrixSimilarity(lsi[corpus])sims1 = index[lsi[vec_query1]]sims2 = index[lsi[vec_query2]]sims_result1 = sorted(enumerate(sims1), key=lambda item: -item[1])sims_result2 = sorted(enumerate(sims2), key=lambda item: -item[1])print sims_result1print sims_result2

由于作者对于文本处理和gensim的原理还不太懂,如有不当之处,欢迎高手指点

python中数据用折线图表示_用python处理文本数据相关推荐

  1. python中format函数用法简书_从Python安装到语法基础,这才是初学者都能懂的爬虫教程...

    Python和PyCharm的安装:学会Python和PyCharm的安装方法 变量和字符串:学会使用变量和字符串的基本用法 函数与控制语句:学会Python循环.判断语句.循环语句和函数的使用 Py ...

  2. python中导入模块使用哪个关键字_关于python导入模块的关键字介绍

    关于python导入模块的关键字介绍 发布时间:2020-04-17 10:13:26 来源:亿速云 阅读:101 作者:小新 今天小编给大家分享的是关于python导入模块的关键字介绍,很多人都不太 ...

  3. python中数据用折线图表示_使用PyQtGraph进行Python数据可视化:绘制精美折线图(以 上证指数走势为例)...

    在前两篇文章中,我们介绍了: 在了解了基本的PyQtGraph模块绘制图形功能之后,我们通过几个常用常见的数据可视化图形来演示使用PyQtGraph进行Python数据可视化. 本篇,我们介绍使用Py ...

  4. echars显示折点数据_Echarts 折线图一个点显示多个实时数据tooltip

    在项目开发需要中.有个需求就是在折线图的每一个折点上悬浮窗要显示几条不同的数据而且是跟x轴一样每个点不一样..研究了一下..有点坑.其实很简单,正常的思路来想 要想在悬浮窗显示数据 一般都会有线 才会 ...

  5. 在python中print表示的数据类型是_【Python连载】那些必须掌握的Python数据类型

    原标题:[Python连载]那些必须掌握的Python数据类型 经过近几年的发展,Python已成为了数据科学和机器学习的首选语言,许多人也因此开始走上自学python之路.从今天开始,本公众号将陆续 ...

  6. 在python中定义类时、运算符重载_自定义 Python 类中的运算符和函数重载(上)...

    如果你对 Python 中的str对象使用过 + 或 * 运算符,你一定注意到了它的操作与 int 或 float 类型的区别: 你可能想知道同一内置运算符或函数如何对不同类对象进行不同操作的.这分别 ...

  7. python中的super用法详解_【Python】【类】super用法详解

    一.问题的发现与提出 在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(sel ...

  8. python中对象的概念是什么_简述Python中的面向对象编程的概念

    面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  9. 在python中股票的收盘价如何表示_利用python计算股票涨跌幅

    作为一个python新手,在学习中遇到很多问题,要善于运用各种方法.今天,在学习中,碰到了如何通过收盘价计算股票的涨跌幅. 第一种: 读取数据并建立函数: import numpy as np imp ...

最新文章

  1. linux anacron 定时任务 计划任务
  2. java logger 静态,java11教程--公共静态接口System.Logger
  3. 手动编译安装mysql-5.5.28a
  4. 如何在Mac 上的“终端”中限制回滚行数?
  5. 应有那个数据库操作类的一个简单实例
  6. tomcat配置管理员帐号密码
  7. 记录下qcharts绘制曲线遇到的坑
  8. c语言入门编程题库100题,C语言入门100题
  9. 中学生怎样学计算机编程6,中学生学电脑编程有什么好处
  10. 支付宝手机网站H5支付
  11. teamviewer远程控制工具
  12. HTML班级网站实例(笔记1)
  13. html5判断出生日期,出生时间看五行,出生日期查五行属性?
  14. javaFX裁剪视频exe
  15. Python工具库安装
  16. qqc什么梗_qqc是什么
  17. 2022茶艺师(中级)特种作业证考试题库及答案
  18. Upload-labs
  19. 不能在具有唯一索引 ‘NonClusteredIndex-20220419-093301‘ 的对象 ‘dbo.cux_machine_info‘ 中插入重复键的行。 语句已终止。
  20. 科学家称五年内将3D打印人类心脏

热门文章

  1. 一份.NET 容器化的调查小结
  2. Ocelot 入门Demo系列(01-Ocelot极简单Demo及负载均衡的配置)
  3. 【话题揭秘】某大型国有银行的敏捷落地实践
  4. .net core实践系列之短信服务-架构设计
  5. 《你必须掌握的Entity Framework 6.x与Core 2.0》书籍出版
  6. 迁移Net项目为Net Core\Standard项目
  7. 使用Docker分分钟启动常用应用
  8. 使用 CefSharp 在 C# App 中嵌入 Chrome 浏览器
  9. 分布式系统事务一致性解决方案大对比,谁最好使?
  10. Asp.net 面向接口可扩展框架之核心容器