Python文本处理——中文标点符号处理

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

  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指明:好比python

>>> 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/#
相关文章
相关标签/搜索