赞
踩
参考文献:胡盼盼编著. 自然语言处理从入门到实战[M]. 中国铁道出版社, 2020.
最近在学习文本表示的一种最简单方式——词袋模型,书中给出了使用gensim生成词袋模型的代码,原代码就来自于这本书,我加了一些注释,方便理解代码。
from gensim.models import TfidfModel
from gensim.corpora import Dictionary
import jieba
raw_texts = ['你站在桥上看风景','看风景的人在楼上看你','明月装饰了你的窗子','你装饰了别人的梦']
如果要对自己的数据处理,可以读入数据的时候,把它们处理成上面这种样式,一般来说就是按行读取,每行作为列表的一个元素就可以生成如代码所示的格式。
texts =[ [word for word in jieba.cut(text, cut_all=True)] for text in raw_texts]
print(texts)
这是分词后的结果:所有句子是一个大列表,每个句子作为列表里的一个列表,分好的词就是列表里的一个元素。
[[‘你’, ‘站’, ‘在’, ‘桥上’, ‘看’, ‘风景’], [‘看’, ‘风景’, ‘的’, ‘人’, ‘在’, ‘楼上’, ‘看’, ‘你’], [‘明月’, ‘装饰’, ‘了’, ‘你’, ‘的’, ‘窗子’], [‘你’, ‘装饰’, ‘了’, ‘别人’, ‘的’, ‘梦’]]
建立词典的主要目的是为每个词弄个索引
dictionary = Dictionary(texts)
print(dictionary.token2id)
打印一下词典,如下所示:词典里以逗号为分割,‘你’:0代表‘你’这个词在词典里的位置是0,这个标号会在后面词袋里用到。
{‘你’: 0, ‘在’: 1, ‘桥上’: 2, ‘看’: 3, ‘站’: 4, ‘风景’: 5, ‘人’: 6, ‘楼上’: 7, ‘的’: 8, ‘了’: 9, ‘明月’: 10, ‘窗子’: 11, ‘装饰’: 12, ‘别人’: 13, ‘梦’: 14}
bow_texts = [dictionary.doc2bow(text) for text in texts]
print(bow_texts)
打印一下输出,如下,每个小列表代表一个句子,如第一个小列表里的(0,1)就代表词典里0这个位置的出现频次为1,就是说你在第一个句子里出现了1次,其它同理。
[[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1)], [(0, 1), (1, 1), (3, 2), (5, 1), (6, 1), (7, 1), (8, 1)], [(0, 1), (8, 1), (9, 1), (10, 1), (11, 1), (12, 1)], [(0, 1), (8, 1), (9, 1), (12, 1), (13, 1), (14, 1)]]
tfidf = TfidfModel(bow_texts)##接口数据为基于频次生成的数据
tfidf_vec = [tfidf[text] for text in bow_texts]
print(tfidf_vec)
生成的结果如下面所示,和基于频次的理解一样,如(1, 0.30151134457776363)就代表词典里标号为1,也就是“在”这个词的TF-IDF值为0.3吧啦吧啦。
[[(1, 0.30151134457776363), (2, 0.6030226891555273), (3, 0.30151134457776363), (4, 0.6030226891555273), (5, 0.30151134457776363)], [(1, 0.2656320682560318), (3, 0.5312641365120636), (5, 0.2656320682560318), (6, 0.5312641365120636), (7, 0.5312641365120636), (8, 0.11024726933725056)], [(8, 0.1301303789000364), (9, 0.31353884679371596), (10, 0.6270776935874319), (11, 0.6270776935874319), (12, 0.31353884679371596)], [(8, 0.1301303789000364), (9, 0.31353884679371596), (12, 0.31353884679371596), (13, 0.6270776935874319), (14, 0.6270776935874319)]]
不过这里有一个点发现了没有,词典里标号为0(你)这个词没有出现,那是因为gensim具有去除停用词的功能,它把“你”当作停用词给删了。
另外一点,不管是基于频次的,还是基于TF-IDF的,所有频次为0,或者TF-IDF值为0的不会出现。因为我们知道,词袋模型的一大缺点,就是高维稀疏向量,因此为了节省空间,只会将非零元素用tuple表示出来。
另外还有使用scikit-learn也可以生成词袋模型,明天也写一下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。