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

  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/#

最新文章

  1. python爬取github数据
  2. JavaScript选项卡/页签/Tab的实现
  3. sm30表维护做排序
  4. BTrace入门教程
  5. Eclipse 高亮显示选中的相同变量
  6. PAT 07-3 求素数
  7. YARN-RPC
  8. std::string 字符替换函数
  9. js和jquery实现显示隐藏
  10. ABP新增模块可能遇到的问题
  11. docker--compose--sonarqube
  12. ceph 安装过程
  13. eclipse回退到上个版本
  14. python中的list的*运算使用过程中遇到的问题
  15. QT新建工程编译出现&quot;Moc&#39;ing xxx.h...&quot; 找不到文件或者error MSB6006: &quot;cmd.exe&quot; exited with code 3.
  16. Activiti任务认领
  17. Java NIO系列教程(十)DatagramChannel
  18. 《JavaScript高级程序设计》5.5 Function类型
  19. spring事务的隔离级别(透彻理解)
  20. 小程序:位置信息(Location)及微信小程序LBS解决方案实践

热门文章

  1. Java的数组长度无需编译指定,因为它是对象
  2. linux系统下,查看端口号被哪个应用占用
  3. C#中页面之间跳转方法比较
  4. CSS3如何去除 inline block 元素之间多出的空格
  5. bx, bp, si, di寄存器的使用规则
  6. JavaScript设计模式:读书笔记(未完)
  7. Geolocation API 原理及方法
  8. mysql 操作用户权限
  9. JAVA的单例模式与延时加载
  10. css z-index属性使用过程中遇到的问题