发布时间:2023-06-12 16:30
用python处理文本数据
Q:这篇文章主要讲什么?
A:这篇文章主要讨论如何用python来做一些简单的文本处理——文本相似度比较。
谈起python的自然语言处理,肯定会让人想起NLTK。不过上面这两个任务并不需要NLTK这个库,只是用到了gensim。由于涉及中文,所以还用到了jieba来做中文分词。
Q:Gensim是什么东西?
A:首先说说gensim是个怎样的python库吧。
由于这篇笔记只记录最简单的用法,所以gensim更详细的介绍,更强大的功能请到官网阅读文档:
http://radimrehurek.com/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\'\\\\u4ec0\\\\u4e48\', u\'\\\\u662f\', u\'\\\\u80a1\\\\u7968\', u\'\\\\uff1f\'], [u\'\\\\u80a1\\\\u7968\', u\'\\\\u662f\', u\'\\\\u4e2a\', u\'\\\\u4ec0\\\\u4e48\', u\'\\\\u73a9\\\\u610f\', u\'\\\\uff1f\'], [u\'\\\\u65b0\\\\u624b\', u\'\\\\u600e\\\\u6837\', u\'\\\\u5165\\\\u95e8\', u\'\\\\u7092\\\\u80a1\', u\'\\\\uff1f\'], [u\'\\\\u73b0\\\\u5728\', u\'\\\\u80a1\\\\u5e02\', u\'\\\\u7684\', u\'\\\\u98ce\\\\u9669\', u\'\\\\u5927\', u\'\\\\u5417\', u\'\\\\uff1f\'], [u\'python\', u\'\\\\u7684\', u\'\\\\u81ea\\\\u7136\', u\'\\\\u8bed\\\\u8a00\', u\'\\\\u81ea\\\\u7136\\\\u8bed\\\\u8a00\', u\'\\\\u5904\\\\u7406\'], [u\'gensim\', u\'\\\\u7684\', u\'\\\\u4e3b\\\\u8981\', u\'\\\\u529f\\\\u80fd\', u\'\\\\u6709\', u\'\\\\u628a\', u\'\\\\u6587\\\\u672c\', u\'\\\\u8f6c\\\\u4e3a\', u\'\\\\u5411\\\\u91cf\'], [u\'\\\\u63d0\\\\u4f9b\', u\'\\\\u5b58\\\\u50a8\', u\'\\\\u6587\\\\u672c\', u\'\\\\u77e9\\\\u9635\', u\'\\\\u7684\', u\'\\\\u65b9\\\\u6cd5\'], [u\'\\\\u8fd9\', u\'\\\\u6587\\\\u7ae0\', u\'\\\\u7bc7\\\\u6587\\\\u7ae0\', u\'\\\\u4e3b\\\\u8981\', u\'\\\\u8ba8\\\\u8bba\', u\'\\\\u5982\\\\u4f55\', u\'\\\\u7528\', u\'python\', u\'\\\\u6765\', u\'\\\\u505a\', u\'\\\\u4e00\\\\u4e9b\', u\'\\\\u7b80\\\\u5355\', u\'\\\\u7684\', u\'\\\\u6587\\\\u672c\', u\'\\\\u672c\\\\u5904\', u\'\\\\u5904\\\\u7406\', u\'\\\\u6587\\\\u672c\\\\u5904\\\\u7406\']]
#原谅我的机器在打印整个列表时,所有中文会变成unicode编码
下一步是构建文档集(单词列表集)的词典,然后利用词典来用向量表示文档
In [10]: dic = corpora.Dictionary(docs)
In [11]: print dic #这个词典给文档集中每个单词编号
Dictionary(45 unique tokens: [u\'\\\\u98ce\\\\u9669\', u\'\\\\u672c\\\\u5904\', u\'\\\\u7684\', u\'\\\\u5904\\\\u7406\', u\'\\\\u4ec0\\\\u4e48\']...)
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-8
import sys, jieba
from gensim import corpora, models, similarities
reload(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_result1
print sims_result2
由于作者对于文本处理和gensim的原理还不太懂,如有不当之处,欢迎高手指点
iPhone 14 Pro CAD设计图曝光:酷炫“感叹号”加粗了
Android 中TextureView和SurfaceView的属性方法及示例说明
Halcon实例转OpenCvSharp(C# OpenCV)实现--瓶口缺陷检测(附源码)
【语义分割】SETR_Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformer
后渗透篇:劫持技术(lpk.dll劫持游戏注入【Win7 实例】)
Datawhale-深入浅出pytorch主要组成模块和基础实战
python向量机使用方法_机器学习算法之——支持向量机(Support Vector Machine)讲解及Python实现...
技术可以小白,但心态不行!聊聊在黑客的世界里,我们如何正确提问!