中文文本中可能出現的標點符號來源比較復雜,通過匹配等手段對他們處理的時候需要格外小心,防止遺漏。以下為在下處理中文標點的時候采用的兩種方法,如有更好的工具,請推薦補充。
- 中文標點集合
比較常見標點有這些:
!?。"#$%&'()*+,-/:;<=>@[\]^_`{|}~⦅⦆「」、、〃》「」『』【】〔〕〖〗〘〙〚〛〜〝〞〟〰〾〿–—‘’‛“”„‟…‧﹏.
調用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")
- 直接指明標點的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)
小結:
- 基本標點符號的處理和上中文的文本處理一樣需要轉換成unicode碼,而且需要注意的是中文的格式比較多,每種格式對應的unicode碼都是不同的,比如半角和全角的符號就是不同的unicode碼。
- 由於標點符號在斷句以及情感語氣判斷時比較重要,尤其是在網絡短文本上尤其如此。在斷句的時候可以在固定的full stop符號(!?。)基礎上自己添加諸如~和,等獲得自己想要的分句;而在情感分析的時候獲取諸如!?...等符號的連續出現的長度可用於判斷當前的語氣強度。
參考: