利用Python代码实现中文文本的自然语言处理,包括分词、去标点符号、去停用词、词性标注&过滤。

在刚开始的每个模块,介绍它的实现。最后会将整个文本处理过程封装成 TextProcess 类。

页面导航

  • 结巴分词
  • 词性标注
  • 去停用词
  • 去标点符号
  • 最终代码
  • 参考文章

结巴分词

jieba 是比较好的中文分词库,在此之前,需要 pip install jieba

结巴分词有三种模式:

  • 全模式 :把句子中所有的可以成词的词语都扫描出来
jieba.cut(text, cut_all=True)
  • 精确模式 :将句子最精确地切开,适合文本分析
jieba.cut(text, cut_all=False)  # 默认模式
  • 搜索引擎模式 :在精确模式的基础上,对长词再次切分,适合用于搜索引擎分词
jieba.cut_for_search(txt)

三种分词效果如下图所示:
想要进一步了解 jieba 三种模式,请参考 详细介绍 。因为我要做的是文本分析,所以选用的是默认的精确模式。

对于一些词,比如“吃鸡”,jieba 往往会将它们分成 “吃” 和 “鸡” ,但是又不太想让它们分开,这该怎么做呢?这时候就需要加载自定义的词典 dict.txt。建立该文档,在其中加入“吃鸡”,执行以下代码:

file_userDict = 'dict.txt'  # 自定义的词典
jieba.load_userdict(file_userDict)

效果对比图:

词性标注

在用 posseg 分词后,结果是一对值,包括 wordflag ,可以用 for 循环获取。关于汉语词性对照表,请看 词性标注表

import jieba.posseg as pseg
sentence = "酒店就在海边,去鼓浪屿很方便。"
words_pair = pseg.cut(sentence)
result = " ".join(["{0}/{1}".format(word, flag) for word, flag in words_pair])
print(result)


在此基础上,可以进一步做词性过滤,只保留特定词性的词。首先在 tag_filter 表明想要留下哪些词,接着对于词性标注后的句子中的每一个词,如果词性符合,则加入到 list 中。在这里只保留了名词和动词。

import jieba.posseg as pseg
list = []
sentence = "人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界"
tag_filter = ['n', 'v']  # 需要保留的词性
seg_result = pseg.cut(sentence)  # 结果是一个pair,有flag和word两种值
list.append([" ".join(s.word for s in seg_result if s.flag in tag_filter)])
print("词性过滤完成")
print(list)

去停用词

去停用词时,首先要用到停用词表,常见的有哈工大停用词表百度停用词表,在网上随便下载一个即可。

在去停用词之前,首先要通过 load_stopword( ) 方法来加载停用词列表,接着按照上文所示,加载自定义词典,对句子进行分词,然后判断分词后的句子中的每一个词,是否在停用词表内,如果不在,就把它加入 outstr,用空格来区分 。

import jieba#  加载停用词列表
def load_stopword():f_stop = open('hit_stopwords.txt', encoding='utf-8')  # 自己的中文停用词表sw = [line.strip() for line in f_stop]  # strip() 方法用于移除字符串头尾指定的字符(默认为空格)f_stop.close()return sw# 中文分词并且去停用词
def seg_word(sentence):file_userDict = 'dict.txt'  # 自定义的词典jieba.load_userdict(file_userDict)sentence_seged = jieba.cut(sentence.strip())stopwords = load_stopword()outstr = ''for word in sentence_seged:if word not in stopwords:if word != '/t':outstr += wordoutstr += " "print(outstr)return outstrif __name__ == '__main__':sentence = "人们宁愿去关心一个蹩脚电影演员的吃喝拉撒和鸡毛蒜皮,而不愿了解一个普通人波涛汹涌的内心世界"seg_word(sentence)

去标点符号

导入 re 包,定义标点符号,使用 sub( ) 方法将之替换。

import resentence = "+蚂=蚁!花!呗/期?免,息★.---《平凡的世界》:了*解一(#@)个“普通人”波涛汹涌的内心世界!"
sentenceClean = []
remove_chars = '[·’!"\#$%&\'()#!()*+,-./:;<=>?\@,:?¥★、….>【】[]《》?“”‘’\[\\]^_`{|}~]+'
string = re.sub(remove_chars, "", sentence)
sentenceClean.append(string)
print(sentence)
print(sentenceClean)

最终代码

最后结合上面的内容,将它们封装到一个 TextProcess 类中。 filePath 是刚开始要处理的文本位置, fileSegDonePath 是处理完毕后要保存的位置。

思路是先将要处理的文本逐行保存到一个 fileTrainRead 的列表中,然后有两种方法可供选择:

  • 加载停用词表,对它进行分词及去停用词操作,保存到 word_list_seg 列表中;

  • 或者也可以选择不分词及去停用词,而是直接从句子中提取需要的词性,然后保存到 word_list_pos 列表中。

由于停用词及词性过滤都对句子标点进行了去除,因此该类中不包含标点符号的去除。最后将处理好的句子写入文件中。

import jieba
import jieba.posseg as psegclass TextProcess(object):def __init__(self, filePath, fileSegDonePath):self.filePath = filePath  # 需要处理的文本位置self.fileSegDonePath = fileSegDonePath  # 处理完毕后的保存位置self.fileTrainRead = []  # 所有行保存到该列表self.stopPath = "hit_stopwords.txt"  # 自己所用的停用词表位置self.word_list_seg = []  # 分词及去停用词后保存的列表self.word_list_pos = []  # 词性过滤后保存的列表# 将每一行文本依次存放到一个列表def saveLine(self):count = 0  # 统计行数with open(self.filePath, encoding='utf-8') as fileTrainRaw:for index, line in enumerate(fileTrainRaw):self.fileTrainRead.append(line)count += 1print("一共有%d行" % count)return self.fileTrainRead# 加载停用词表def load_stopword(self):f_stop = open(self.stopPath, encoding='utf-8')  # 自己的中文停用词表sw = [line.strip() for line in f_stop]  # strip() 方法用于移除字符串头尾指定的字符(默认为空格)f_stop.close()return sw# 分词并且去停用词,与下一个词性过滤方法选择一个即可def segLine(self):file_userDict = 'dict.txt'  # 自定义的词典jieba.load_userdict(file_userDict)for i in range(len(self.fileTrainRead)):sentence_seged = jieba.cut(self.fileTrainRead[i].strip())stopwords = self.load_stopword()outstr = ''for word in sentence_seged:if word not in stopwords:if word != '/t':outstr += wordoutstr += " "self.word_list_seg.append([outstr])print("分词及去停用词完成")return self.word_list_seg# 保留特定词性def posLine(self):for i in range(len(self.fileTrainRead)):tag_filter = ['n', 'd', 'a', 'v', 'f', 'ns', 'vn']  # 需要保留的词性 d-副词 f-方位词 ns-地名 vn-名动词seg_result = pseg.cut(self.fileTrainRead[i])  # 结果是一个pair,有flag和word两种值self.word_list_pos.append([" ".join(s.word for s in seg_result if s.flag in tag_filter)])print("词性过滤完成")return self.word_list_pos# 处理后写入文件def writeFile(self):with open(self.fileSegDonePath, 'wb') as fs:for i in range(len(self.word_list_seg)):  # 选择去停用词方法fs.write(self.word_list_seg[i][0].encode('utf-8'))fs.write('\n'.encode("utf-8"))'''for i in range(len(self.word_list_pos)):  # 选择词性过滤方法fs.write(self.word_list_pos[i][0].encode('utf-8'))fs.write('\n'.encode("utf-8"))'''if __name__ == '__main__':tp = TextProcess('ex.txt', 'final.txt')tp.saveLine()  # 将每一行文本依次存放到一个列表tp.load_stopword()  # 加载停用词表tp.segLine()# tp.posLine()tp.writeFile()

原始文本(爬取的酒店评论部分数据):

各方面条件都很好,就是住进去时没有明面窗户屋子里比较潮,后来用了除湿器。
位置特别好,出入方便,酒店前台、门童服务特别好。
就在步行街路口,位置不错。酒店服务也挺好的。
酒店各方面非常不错。“健身房”实在是短板。太影响整体形象
酒店位置很好中山路步行街口,有停车场出行很方便。
早餐品种丰富,工作人员很热情,海景房能观赏鼓浪屿夜景相当不错!
早点丰富,出行方便!

选择去停用词方法效果:

方面 条件 都 很好 住 进去 时 没有 明 面 窗户 屋子里 比较 潮 后来 除湿 器
位置 特别 好 出入 方便 酒店 前台 门童 服务 特别 好
步行街 路口 位置 不错 酒店 服务 挺 好
酒店 方面 非常 不错 健身房 实在 短板 太 影响 整体 形象
酒店 位置 很好 中山路 步行街 口 停车场 出行 很方便
早餐 品种 丰富 工作人员 很 热情 海景房 观赏 鼓浪屿 夜景 相当 不错
早点 丰富 出行 方便

选择词性过滤方法效果:

方面 条件 都 就是 住 进去 时 没有 明 面 窗户 屋子里 比较 潮 除湿 器
位置 特别 出入 方便 酒店 前台 门童 服务 特别 好
就 步行街 位置 不错 酒店 服务 也 挺好
酒店 方面 非常 不错 健身房 实在 是 短板 太 影响 整体 形象
酒店 位置 中山路 步行街 有 停车场 出行
早餐 品种 丰富 工作人员 热情 海景房 能 观赏 鼓浪屿 夜景 相当 不错
早点 丰富 出行 方便

就此结束!^o^y

参考文章

NLP-中文文本去除标点符号

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

  1. 『NLP学习笔记』TextCNN文本分类原理及Pytorch实现

    TextCNN文本分类原理及Pytorch实现 文章目录 一. TextCNN网络结构 1.1. CNN在文本分类上得应用 1.2. 回顾CNN以及Pytorch解析 1.2.1. CNN特点 1.2 ...

  2. 『NLP学习笔记』BERT文本分类实战

    BERT技术详细介绍! 文章目录 一. 数据集介绍 二. 数据读取 三. 训练集和验证集划分 四. 数据分词tokenizer 五. 定义数据读取(继承Dataset类) 六. 定义模型以及优化方法 ...

  3. 【自然语言处理基础技能(NLP)】jieba中文文本处理

    1.基本分词函数与用法 # jieba.cut 以及 jieba.cut_for_search 返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语(un ...

  4. 人工智能NLP自然语言之基础篇文本分类pytorch-transformers实现BERT文本分类bert

    一.数据集介绍 中文文本分类数据集 数据来源: 今日头条客户端 数据格式: 6554695793956094477_!_110_!_news_military_!_「欧洲第一陆军」法兰西帝国的欧陆霸权 ...

  5. 【自然语言处理】中文文本预处理及词云_以小说《白夜行》为例

    参考:https://www.cnblogs.com/pinard/p/6744056.html import pandas as pd import numpy as np import jieba ...

  6. ik分词和jieba分词哪个好_Python 中文 文本分析 实战:jieba分词+自定义词典补充+停用词词库补充+词频统计...

    最近项目需要,实现文本的词频分析,折腾了几天才完成任务,有点成就感,最后整理总结一下这部分的内容,希望更多同僚受益. 一.使用前准备 环境:Python3.6 安装结巴:pip install ji ...

  7. 使用python对中文文本进行分词

    何为中文分词,指的是将一个汉字序列切分成一个个单独的词. 这里我们推荐使用jieba分词,它是专门使用python语言开发的分词系统,占用资源较少,常识类文档的分词精度较高. 我们可以去网上下载jie ...

  8. 『NLP学习笔记』工业级自然语言处理spaCy开源库的使用

    工业级自然语言处理spaCy开源库的使用 文章目录 一. spaCy介绍 1.1. 什么是spaCy 1.2. spaCy的优势 1.3. spaCy的处理过程(Processing Pipeline ...

  9. 自然语言处理的中文文本相似度

    前言 人与计算机的交互过程中,如果能提供人类的自然语言形式来进行交流,那么人与计算机就能更加亲密友好.而要实现这一机制就需要自然语言处理来处理,一般来说自然语言处理会涉及几个学科:计算机科学.语言学. ...

最新文章

  1. android荧光进度条,CSS3 彩色荧光棒进度条
  2. 第三十三课.一些经典的优化策略与神经网络变种
  3. Android之组件化开发
  4. Hadoop详解(三):HDFS完全分布式环境搭建
  5. 有关EnableQ在线问卷调查引擎的记者访谈记录
  6. 2.UiSelector API 详细介绍
  7. hive python脚本,Hive调用Python脚本错误
  8. 树组件:主要配置项、属性、方法
  9. Mac废纸篓无法清空怎么办?
  10. linux ln链接命令
  11. 如何快速制作一张数据地图,收藏这10张模板就够了
  12. ceph 知识技能树
  13. java实现微信H5支付和回调的Demo源码
  14. c语言pow函数原型_c语言pow的用法
  15. 笔记本触摸屏使用技巧
  16. hive中NULL值问题
  17. 有声语音计算机软件,有声语音计算器
  18. UI设计中最重要的元素和原则是什么
  19. 平板电脑如何蓝牙和手机配对_如何将蓝牙设备与计算机,平板电脑或手机配对...
  20. PR 2019 快速入门(17)

热门文章

  1. ZooKeeper知识点整理
  2. 科目二需要注意的点(笔记包含图片讲解)
  3. 显示农历天气时钟小部件下载_优效日历电脑版-优效日历下载v2.0.10.16
  4. 电脑显示请检查映像服务器,该任务映像已损坏或已篡改的解决方法
  5. 自上而下面向能力的编程思想
  6. 【论文翻译】Automatic Conversion of Road Networks from OpenDRIVE to Lanelets
  7. WMS系统(一)成品出库
  8. 扩展正则表达式之加号
  9. 泰坦尼克数据分析与预处理
  10. 36岁,被单位解聘,我干起了深夜外卖