中文文本中可能出现的标点符号来源比较复杂,通过匹配等手段对他们处理的时候需要格外小心,防止遗漏。以下为在下处理中文标点的时候采用的两种方法,如有更好的工具,请推荐补充。

  1. 中文标点集合

    比较常见标点有这些:

    !?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.

    调用zhon包zhon.hanzi.punctuation函数即可得到这些中文标点。

    如果想用英文的标点,则可调用string包的string.punctuation函数可得到: !"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~

    因此,比如需要将所有标点符号去除,可以进行以下操作:
>>> import re
>>> from zhon.hanzo import punctuation
>>> line = "测试。。去除标点。。"
>>> print re.sub(ur"[%s]+" %punctuation, "", line.decode("utf-8")) # 需要将str转换为unicode
测试去除标点
>>> print re.sub(ur"[%s]+" %punctuation, "", line) #将不会发生替换
测试。。去除标点。。

当然,如果想去除重复的符号而只保留一个,那么可以用\1指明:比如

>>> re.sub(ur"([%s])+" %punctuation, r"\1", line.decode("utf-8"))

如果不是用的zhon包提供的已经是unicode码的标点集,而是自己定义,那么请不要忘了转换成unicode码:

punc = "!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏."
punc = punc.decode("utf-8")
  1. 直接指明标点的unicode码范围

    所有字符的unicode编码可以参考这里

    大部分标点分布在以下几个范围:
Basic Latin: u'\u0020' - u'\007f'
general punctuation: u'\u2000' - u'\u206f'
CJK Symbols and Punctuation: u'\u3000' - u'\u303f'
halfwidth and fulllwidth forms: u'\uff00' - u'\uffef'

在用u'\u0020-\u007f\u2000-\u206f\u3000-\u303f\uff00-uffef'替换punctuation就能实现上述操作。

PS:中文常用字符的范围是u'\u4e00' - u'\u9fff'匹配所以中文可以这样:

re.findall(ur"\u4e00-\u9fff", line)

小结:

  1. 基本标点符号的处理和上中文的文本处理一样需要转换成unicode码,而且需要注意的是中文的格式比较多,每种格式对应的unicode码都是不同的,比如半角和全角的符号就是不同的unicode码。
  2. 由于标点符号在断句以及情感语气判断时比较重要,尤其是在网络短文本上尤其如此。在断句的时候可以在固定的full stop符号(!?。)基础上自己添加诸如~和,等获得自己想要的分句;而在情感分析的时候获取诸如!?...等符号的连续出现的长度可用于判断当前的语气强度。

参考:

  1. http://stackoverflow.com/questions/2718196/find-all-chinese-text-in-a-string-using-python-and-regex
  2. http://stackoverflow.com/questions/1366068/whats-the-complete-range-for-chinese-characters-in-unicode
  3. http://zhon.readthedocs.io/en/latest/#

Python文本处理——中文标点符号处理的更多相关文章

  1. 巧用css text-indent减小中文标点符号的占位大小

    由于设计需要,我们的页面中经常会有如下效果: 可是我们实现出来的效果确实这样的: 看起来两行文本没有对齐嘛,仔细检查后原来是[字符的原因,因为是中文标点符号占半个字的位置.不信?选中下汉字标点符号看一 ...

  2. 转:python的nltk中文使用和学习资料汇总帮你入门提高

    python的nltk中文使用和学习资料汇总帮你入门提高 转:http://blog.csdn.net/huyoo/article/details/12188573 nltk的安装 nltk初步使用入 ...

  3. 算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

    算是休息了这么长时间吧!准备学习下python文本处理了,哪位大大有好书推荐的说下!

  4. PhpStorm 2016.3 For Mac 重大里程碑更新 -- 终于解决了不能输入中文标点符号的重大bug

    PhpStorm 2016.3 For Mac 重大里程碑更新 1.[终于解决了]不能输入中文标点符号的重大bug,如 逗号“,”.“.”: 2.可以在一个窗体中,同时打开多个项目: 3.其他... ...

  5. php 过滤英文标点符号 过滤中文标点符号

    php 过滤英文标点符号 过滤中文标点符号 代码 function filter_mark($text){ if(trim($text)=='')return ''; $text=preg_repla ...

  6. Java 中文字符判断 中文标点符号判断

    Java Character 实现Unicode字符集介绍  CJK中文字符和中文标点判断 主要内容: 1. Java Character类介绍: 2. Unicode 简介及 UnicodeBloc ...

  7. Python中使用中文

    python的中文问题一直是困扰新手的头疼问题,这篇文章将给你详细地讲解一下这方面的知识.当然,几乎可以确定的是,在将来的版本中,python会彻底解决此问题,不用我们这么麻烦了. 先来看看pytho ...

  8. Python 文本解析器

    Python 文本解析器 一.课程介绍 本课程讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序. 二.相关技术 Python:一种面向对象.解释型计算机程序设计语言,用它可以做 ...

  9. 2019-02-18 扩展Python控制台实现中文反馈信息之二-正则替换

    "中文编程"知乎专栏原文地址 续前文扩展Python控制台实现中文反馈信息, 实现了如下效果: >>> 学 Traceback (most recent call ...

随机推荐

  1. 数据结构与算法分析-AVL树

    1.AVL树是带有平衡条件的二叉查找树. 2.AVL树的每个节点高度最多相差1. 3.AVL树实现的难点在于插入或删除操作.由于插入和删除都有可能破坏AVL树高度最多相差1的特性,所以当特性被破坏时需 ...

  2. Shell脚本检测文件夹是否已被挂载的方法

    方法1: if grep -qs '/mnt/foo' /proc/mounts; then echo "It's mounted." else echo "It's n ...

  3. git学习:关于origin和master

    [转载请注明出处]http://www.cnblogs.com/mashiqi 2016/10/27 本文主要是对这篇博客文章的理解. git的服务器端(remote)端包含多个repository, ...

  4. 解决织梦DEDEcms指定arclist的特定ID排序的方法

    转载网址:http://blog.hrseo.net/xuexi/184.html 替换/include/taglib/arclist.lib.php这个文件,下载链接: http://pan.bai ...

  5. C(++) Websocket消息推送---GoEasy

    Goeasy, 它是一款第三方推送服务平台,使用它的API可以轻松搞定实时推送!个人感觉goeasy推送更稳定,推送 速度快,代码简单易懂上手快 浏览器兼容性:GoEasy推送 支持websocket ...

  6. textarea自适应高度

    最近做项目遇见了这个自适应高度的问题,也在网上找了些资料,大多选择用DIV模拟textarea,但是这样就有安全性的问题,因为你是可以直接将HTML代码输入进去的. 接下来介绍的这种办法是采用两个te ...

  7. ajax 选项卡

    Ajax其实就是交互式网页应用开发技术包括以下几个方面: 1.XHTML和CSS 2.使用DOM作为动态显示和交互 3.使用XML和XSLT 做数据交互和操作 (这些完全不太懂) 4.使用XMLHtt ...

  8. C语言数据结构之 简单选择排序

    算法:设所排序序列的记录个数为n.i取1,2,-,n-1,从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出排序码最小的记录,与第i个记录交换.执行n-1趟 后就完成了记录序列的排序. 编译器: ...

  9. UVa 712 S树

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  10. [Thinking in Java]这些必须先了解

    2.基本概念和认识 2.1 Java引用 Java中一切皆是对象,一切对象实例的标识符号(对象名称)都只是对象的引用. 2.2 对象的创建 通过new关键字创建,但是要注意基础类型和String类型的 ...