作者简介:小小明,Pandas数据处理专家,致力于帮助无数数据从业者解决数据处理难题。

之前有位群友分享了使用Pandas过滤停用词的技巧:

不过其实这并不是效率最高的一种方法,今天我将演示一种更高效过滤停用词的方法。

文章目录

  • 过滤停用词前的准备工作
    • 数据读取
    • jieba分词器设置角色为特定词汇
    • 开始分词
    • 加载停用词
  • 过滤停用词的n种方法性能对比
    • 直接过滤
    • 使用Pandas进行停用词过滤
    • 使用set集合过滤
  • 速度最快的过滤方法
  • 总结

过滤停用词前的准备工作

这次我打算用一部197W字的小说作为数据示例。

数据读取

首先,我们读取这部小说的数据:

with open(r"D:\hdfs\novels\天龙八部.txt", encoding="gb18030") as f:text = f.read()
print(len(text))

结果:

1272432

可见这部小说共127.2万字。

下面我们对它进行分词并加载停用词:

jieba分词器设置角色为特定词汇

为了避免jieba分词库不能将主角正确的切词,所以现在我们需要将这部小说的角色名称加入到jieba的分词表中。

首先,加载《天龙八部》小说的角色名称:

with open('D:/hdfs/novels/names.txt', encoding="utf-8") as f:for line in f:if line.startswith("天龙八部"):names = next(f).split()breakprint(names[:20])

前20个角色为:

['刀白凤', '丁春秋', '马夫人', '马五德', '小翠', '于光豪', '巴天石', '不平道人', '邓百川', '风波恶', '甘宝宝', '公冶乾', '木婉清', '包不同', '天狼子', '太皇太后', '王语嫣', '乌老大', '无崖子', '云岛主']

设置角色到特定词汇中:

import jieba
for word in names:jieba.add_word(word)

提示了一些警告信息:

Building prefix dict from the default dictionary ...
Loading model from cache C:\Users\Think\AppData\Local\Temp\jieba.cache
Loading model cost 0.759 seconds.
Prefix dict has been built successfully.

开始分词

然后对原始文本进行中文分词:

%time cut_word = jieba.lcut(text)
Wall time: 6 s

中文分词耗时6秒。

加载停用词

然后加载停用词:

#  加载停用词
with open("stoplist.txt", encoding="utf-8-sig") as f:stop_words = f.read().split()
stop_words.extend(['天龙八部', '\n', '\u3000', '目录', '一声','之中', '只见'])
print(len(stop_words), stop_words[:10])
5748 ['说', '人', '元', 'hellip', '&', ',', '?', '、', '。', '"']

过滤停用词的n种方法性能对比

直接过滤

%%time
all_words = [word for word in cut_word if len(word) > 1 and word not in stop_words]
print(len(all_words), all_words[:20])

结果:

300656 ['释名', '青衫', '磊落', '险峰', '玉壁', '月华', '马疾香幽', '高人远', '微步', '纹生', '谁家', '子弟', '谁家', '无计悔', '多情', '虎啸', '龙吟', '换巢', '鸾凤', '剑气']
Wall time: 26.2 s

直接过滤耗时26.2秒

使用Pandas进行停用词过滤

%%time
words = pd.Series(cut_word)
all_words = words[(words.str.len() > 1) & (~words.isin(stop_words))].tolist()
print(len(all_words), all_words[:20])

结果:

300656 ['释名', '青衫', '磊落', '险峰', '玉壁', '月华', '马疾香幽', '高人远', '微步', '纹生', '谁家', '子弟', '谁家', '无计悔', '多情', '虎啸', '龙吟', '换巢', '鸾凤', '剑气']
Wall time: 465 ms

耗时0.46秒

使用set集合过滤

%%time
stop_words = set(stop_words)
all_words = [word for word in cut_word if len(word) > 1 and word not in stop_words]
print(len(all_words), all_words[:20])

结果:

300656 ['释名', '青衫', '磊落', '险峰', '玉壁', '月华', '马疾香幽', '高人远', '微步', '纹生', '谁家', '子弟', '谁家', '无计悔', '多情', '虎啸', '龙吟', '换巢', '鸾凤', '剑气']
Wall time: 104 ms

耗时0.1秒

速度最快的过滤方法

虽然我们过滤停用词使用set集合过滤更快,但是我们并没有考虑一开始分词过程所消耗的时间,分词耗时达到6秒的时间,有没有办法降低这个时间呢?

先看看使用set集合的情况,分词过滤的整体耗时:

%%timeall_words = [word for word in jieba.cut(text) if len(word) > 1 and word not in stop_words]
print(len(all_words), all_words[:20])

结果:

300656 ['释名', '青衫', '磊落', '险峰', '玉壁', '月华', '马疾香幽', '高人远', '微步', '纹生', '谁家', '子弟', '谁家', '无计悔', '多情', '虎啸', '龙吟', '换巢', '鸾凤', '剑气']
Wall time: 5.91 s

耗时5.9s秒。

但假如我们一开始就将停用词从原始文本中去掉会不会更快点呢?

%%timetext_sub = text
for stop_word in stop_words:text_sub = text_sub.replace(stop_word, " ")
all_words = [word for word in jieba.cut(text_sub) if len(word) > 1]
print(len(all_words), all_words[:20])

结果:

174495 ['天龙', '释名', '青衫', '磊落', '险峰', '玉壁', '月华', '马疾香幽', '微步', '纹生', '子弟', '家院', '计悔', '虎啸', '龙吟', '换巢', '鸾凤', '剑气', '碧烟', '水榭']
Wall time: 5.76 s

整体耗时5.7秒。

速度稍微提升了一丁点儿,区别不大,结果差异还挺大,所以还是使用set集合来过滤比较好一点。

总结

综上所述,中文分词过滤停用词时,使用set集合即可获得最好的性能。

感谢各位读者的陪伴,下期我们将分享 词频统计的3种方法 和 字典与集合的原理。

咱们不见不散,下期再见~

100毫秒过滤一百万字文本的停用词相关推荐

  1. 如何在java中去除中文文本的停用词

    2019独角兽企业重金招聘Python工程师标准>>> 1.  整体思路 第一步:先将中文文本进行分词,这里使用的HanLP-汉语言处理包进行中文文本分词. 第二步:使用停用词表,去 ...

  2. 去停用词 java代码_如何在java中去除中文文本的停用词

    1.  整体思路 第一步:先将中文文本进行分词,这里使用的HanLP-汉语言处理包进行中文文本分词. 第二步:使用停用词表,去除分好的词中的停用词. 2.  中文文本分词环境配置 使用的HanLP-汉 ...

  3. 『NLP自然语言处理』中文文本的分词、去标点符号、去停用词、词性标注

    利用Python代码实现中文文本的自然语言处理,包括分词.去标点符号.去停用词.词性标注&过滤. 在刚开始的每个模块,介绍它的实现.最后会将整个文本处理过程封装成 TextProcess 类. ...

  4. WordCloud词云图去除停用词的正确方法

    前言 之前我们已经学习了如何使用wordcloud制作英文和中文词云,今天我们接着讲解,在实际制作词云中,有很多词是没有展示出的意义的,例如我,他等主语,那如何不显示这些词了,这就涉及到停用词. wo ...

  5. NLP深入学习——过滤停用词(Filtering stop words)

    文章目录 返回主目录 过滤停用词(Filtering stop words) Stemming操作 返回主目录 这是一个系列的文章,点击返回综合目录页 过滤停用词(Filtering stop wor ...

  6. 实战笔记:利用pandas提升分词后过滤停用词的效率

    前言:大家好,这里是Seon塞翁.最近工作中开发了一个需要对大批量文本进行分词及统计词频的工具,主要是在 jieba 分词.过滤停用词两个环节耗时.分词部分可以考虑采用 jieba-fast 库提升速 ...

  7. NLP-文本处理:基本技术【命名实体识别、分词、拼写纠错、停用词、词性标注】、文本序列化、文本向量化、文本语料的数据分析、文本特征处理(Ngram特征添加、文本长度规范)、数据增强

    分词(tokenization):英文通过空格或者标点符号,就可以将词分开:而中文的分词会涉及很多问题(未登录词问题.分词歧义问题.分词不一致问题),所以会有各种不同分词的算法. 清洗:我们需要对文本 ...

  8. python结巴分词去掉停用词、标点符号、虚词_NLP自然语言处理入门-- 文本预处理Pre-processing...

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  9. 中文停用词文档_使用Python中的NLTK和spaCy删除停用词与文本标准化

    译者 | VK 来源 | Analytics Vidhya [磐创AI 导读]:本文介绍了如何使用Python中的NLTK和spaCy删除停用词与文本标准化,欢迎大家转发.留言.想要更多电子杂志的机器 ...

最新文章

  1. Servlet体系结构
  2. [SIR数据集实验][2]Java类数据集相应工具使用的小经验
  3. 他读博期间发表3篇Science,28岁任武大教授,35岁入“杰青”名单,让人叹服!...
  4. Squeeze Net
  5. 使用ASP.NET Core MVC的Vue.Js
  6. react dispatch_梳理下redux、mobx 在react的应用
  7. Hive自定义函数入门实例
  8. 边界安全 - CDN/DMZ/网络协议
  9. java怎样编程界面_java程序的界面编程详解
  10. 计算线性回归方程和相应系数
  11. HTML5小游戏程序案例--冰桶挑战h5案例
  12. 2021年12月苹果开发者证书配置
  13. 利用Bootstrap制作汉堡按钮(header部分)
  14. Ae 入门系列之十:效果和动画预设
  15. C语言:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字
  16. maven 3.6.1版本下载地址
  17. oracle执行语句出无效字符,pl/sql动态执行sql语句时报错:ORA-00911: 无效字符 ORA-06512: 在 line 14...
  18. 编程计算图形的面积(圆形,正方形,长方形)
  19. SQL入门之第二一讲——IF函数的使用
  20. SQL语句(三) 更新语句(增 删 改)

热门文章

  1. 软件 ce ee 含义和区别
  2. 一张表告诉你木兰宽松许可证第二版(MulanPSL v2)与业界主流许可证的主要异同...
  3. 软件-DiskSpeekUp:DiskSpeekUp(磁盘整理工具)
  4. java fri星期转_如何在Java中将“Fri Sep 21 15:23:59 CEST 2012”转换为“2012-09-21T15:23:59”?...
  5. 试了一下搜狐云景对ruby的支持
  6. 分享系列--面试JAVA架构师--链家网
  7. C++ decorator(装饰)模式
  8. java 刷新文件夹 代码_UpdateFile.java(更新指定文件夹的文件)作者:阿飞
  9. CentOS下连VisualSVN服务器时报Key usage violation错误的解决方案
  10. 2014热门网络词汇汇总