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/#
相關文章
相關標籤/搜索