Python文本處理——中文標點符號處理


中文文本中可能出現的標點符號來源比較復雜,通過匹配等手段對他們處理的時候需要格外小心,防止遺漏。以下為在下處理中文標點的時候采用的兩種方法,如有更好的工具,請推薦補充。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM