Python中⽂标点符号和英⽂标点符号(特殊符号)
中⽂⽂本中可能出现的标点符号来源⽐较复杂,通过匹配等⼿段对他们处理的时候需要格外⼩⼼,防⽌遗漏。以下为在下处理中⽂标点的时候采⽤的两种⽅法,如有更好的⼯具,请推荐补充。
1. 中⽂标点集合
⽐较常见标点有这些:
!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆  、、〃》「」『』【】〔〕〖〗    〜〝〞  〾〿–—‘’‛“”…‟…‧﹏.
调⽤的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")
2. 直接指明标点的unicode码范围
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符号
(!?。)基础上⾃⼰添加诸如~和,等获得⾃⼰想要的分句;⽽在情感分析的时候获取诸如!?...等符号的连续出现的长度可⽤于判断当前的语⽓强度。