1. 程式人生 > >【NLP】Python NLTK處理原始文字

【NLP】Python NLTK處理原始文字

作者:白寧超

2016年11月8日22:45:44

摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Named Entity Recognition, NER)、句法分析(Syntactic Parse)等各項 NLP 領域的功能。本文主要介紹:1)怎樣編寫程式訪問本地和網路上的檔案,從而獲得無限的語言材料?2)如何把文件分割成單獨的單詞和標點符號,並進行文字語料上的分析?3)怎樣編寫程式產生格式化輸出,並把結果儲存在檔案中?關於Python基礎知識可以參看本人的
【Python五篇慢慢彈】
系列文章(本文原創編著,轉載註明出處:Python NLTK處理原始文字

目錄

關於處理原始文字部分匯入語句:

>>> from __future__ import division
>>> import nltk,re,pprint

1 從網路和硬碟訪問文字(線上獲取傷寒雜病論)

 python網路訪問程式:

>>> from __future__ import division
>>> import nltk,re,pprint
>>> from urllib.request import urlopen
>>> url=r'http://www.gutenberg.org/files/24272/24272-0.txt'
>>> raw=urlopen(url).read()
>>> raw = raw.decode('utf-8')
>>> len(raw)
70306
>>> raw[2000:2500]

 執行結果:

對其中文分詞:

>>> from nltk.tokenize import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
    path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
    path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
    path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
    path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
    path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> result = segmenter.segment(raw)
>>> result[1000:2500]

 分詞結果:

2 線上獲取處理HTML文字(紅樓夢)

線上獲取html文字資料:

>>> import re,nltk
>>> from urllib.request import urlopen
>>> url='http://www.gutenberg.org/cache/epub/24264/pg24264-images.html'
>>> html=urlopen(url).read()
>>> html=html.decode('utf-8')
>>> html[5000:5500]

 執行結果:

相關正則知識:

  1. \d  匹配一個數字
  2. \w 匹配一個字母或者數字
  3. *  任意個字元(包括0個),
  4. +  至少一個字元
  5. ?  0個或1個字元
  6. {n} n個字元
  7. {n,m} n-m個字元
  8. \s 匹配一個空格
  9. \s+ 至少有一個空格
  10. \d{3,8} 表示3-8個數字,例如'1234567'
  11. \d{3}\s+\d{3,8}
  12. [0-9a-zA-Z\_] 匹配一個數字、字母或者下劃線
  13. [0-9a-zA-Z\_]+ 匹配至少由一個數字、字母或者下劃線組成的字串,
  14. 比如'a100','0_Z','Py3000'等等;
  15. [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字串,也就是Python合法的變數
  16. [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)
  17. A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
  18. ^表示行的開頭,^\d表示必須以數字開頭
  19. $表示行的結束,\d$表示必須以數字結束

正則表示式進行資料清洗:

>>> len(html)
962651
>>> strhtml=re.sub("[\s+\.\!\/_,$%^*(+\"\']+|[+——!,。??、[email protected]#¥%……&*()]+|[A-Za-z0-9]+","",html)#去掉中英文符號
>>> len(strhtml)
781150
>>> strhtml[5000:5500]

清洗後結果:

紅樓夢進行中文分詞

>>> # 紅樓夢進行中文分詞
>>> from nltk.tokenize import StanfordSegmenter
>>> segmenter = StanfordSegmenter(
    path_to_jar=r"E:\tools\stanfordNLTK\jar\stanford-segmenter.jar",
    path_to_slf4j=r"E:\tools\stanfordNLTK\jar\slf4j-api.jar",
    path_to_sihan_corpora_dict=r"E:\tools\stanfordNLTK\jar\data/",
    path_to_model=r"E:\tools\stanfordNLTK\jar\data\pku.gz",
    path_to_dict=r"E:\tools\stanfordNLTK\jar\data\dict-chris6.ser.gz"
)
>>> result = segmenter.segment(raw)

查詢分析:查詢“曰”後面的內容

re.findall(r'(曰.{,3})',strhtml)

 

備註:處理搜尋引擎的結果:基於自己配置的搜尋引擎處理

3 處理RSS訂閱

>>> import feedparser #feedparser需要在python庫中下載
>>> llog=feedparser.parse(url)

4 讀取本地檔案:strip()方法刪除輸入行結尾的換行符

方法一:

>>> f=open(r"E:\dict\q0.txt","r")
>>> for line in f:
	print(line.strip())

方法二:

>>> with open(r"C:\Users\cuitbnc\Desktop\dqdg.txt","r+") as f:
    str=f.read()

方法三:

>>> import nltk
>>> path=nltk.data.find(r'C:\Users\cuitbnc\Desktop\dqdg.txt')
>>> raw=open(path,'rU').read()
>>> len(raw)
673167
>>> 

 PDF或者MSWord以及其他二進位制提取文字,利用第三方函式庫pypdf和pywin32

>>> raw=open(r"E:\dict\q0.txt","r").read()
>>> tokens=nltk.word_tokenize(raw)
>>> words=[w for w in tokens]
>>> vocab=sorted(set(words))
>>> vocab

5 字串:最底層的文字處理

有用的字串方法:

  • s.find(t)  字串s中包含t的第一個索引s.rfind(t)  字串s中包含t的最後一個索引
  • s.index(t)  與s.find(t)類似
  • s.rindex(t)  與s.rfind(t)類似
  • s.join(text)
  • s.split(t)  字串分割
  • s.splitlines()
  • s.lower()
  • s.upper()
  • s.titlecase() s首字母大寫
  • s.strip()  返回一個沒有首尾空白字元的s的複製
  • s.replace(t,u) 用u替換s中的t

連結串列和字串的差異:字串和連結串列都是一種序列,可以通過索引抽取他們一部分,可以切片,可以合併。但是,連結串列和字串不能連線

6 使用Unicode進行文書處理

解碼:檔案中的文字都有特定的編碼,需要一些機制將文字翻譯成Unicode的過程就是解碼。 編碼:將Uniocde寫入一個檔案或者終端,首先需要將Unicode轉化為合適的編碼,這個過程就是編碼

中文解碼問題

>>> raw=open(r"E:\dict\text.txt","r").read()
Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    raw=open(r"E:\dict\text.txt","r").read()
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 16: illegal multibyte sequence
>>> import codecs
>>> f=codecs.open(r"E:\dict\text.txt",'r',encoding="utf-8").read()

 ord()查詢字元的整數序列

>>> ord('a')
97
>>> ord('f')
102

7 使用正則表示式檢測片語搭配

import re 匯入re函式庫

re.search('ed$',w)查詢w字串中是都ed結尾匹配 [w for w in wordlist if re,search('ed$',w)]

萬用字元“.”可以用來匹配任何單個字元。例如:有一個8個字母組成的字謎,j是第三個字母,t的第六個字母,每個空白單元格用句點隔開.(^字串開始,$字串結束)

[w for w in wordlist if re.search('^..j..t..$',w)]

計算文字中詞出現次數 sum(w for w in text if re.search('^e-?mail$',w))

搜尋數字

[w for w in wordlist if re.search('^[0-9]+\.[0-9]+$',w)]

[w for w in wordlist if re.search('^[0-9]{4}$',w)]

python正則表示式基本元字元 

  1. .   萬用字元,匹配所有字元
  2. ^abc  匹配以abc開始的字串
  3. abc$  匹配以abc結尾的字串
  4. [abc]  匹配字元集合
  5. [A-Z0-9] 匹配字元範圍
  6. ed|ing|s 匹配指定的字串,諸如ed或者ing或者s
  7. *   前面專案0個或者多個,如a*/[a-z]* (也叫Kleene閉包)
  8. +   前面專案1個或者多個,如a+、[a-z]+
  9. ?   前面專案0個或者1個,如a?、[a-z]?
  10. {n}   重複n次
  11. {n,}  至少重複n次
  12. {,n}  重複不多於n次
  13. {m,n}  至少重複m次不多於n次
  14. a(b|c)+  括號表示操作符的範圍
  15. 正則表示式符號:
  16. \b 詞邊界
  17. \d 任何數字等於[0-9]
  18. \D 任何非數字等於[^0-9]
  19. \s 任何空白字元[\t\n\r\f\v]
  20. \S 任何非空白字元[^\t\n\r\f\v]
  21. \w 任何字母[A-Za-z0-9]
  22. \W 任何非字母[^A-Za-z0-9]
  23. \t 製表符
  24. \n 換行符

指定條件查詢分析:

>>> f=codecs.open(r"E:\dict\q0.txt",'r').read()
>>> import re
>>> re.findall(r"大秦",f)
['大秦']
>>> re.findall(r"龐涓",f)
['龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓', '龐涓']
>>> len(re.findall(r"龐涓",f))
33
>>> 

【推薦】 

相關推薦

NLPPython NLTK處理原始文字

作者:白寧超 2016年11月8日22:45:44 摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Name

NLPPython NLTK獲取文字語料和詞彙資源

作者:白寧超 2016年11月7日13:15:24 摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Name

NLPPython例項:基於文字相似度對申報專案進行查重設計

作者:白寧超 2017年5月18日17:51:37 摘要:關於查重系統很多人並不陌生,無論本科還是碩博畢業都不可避免涉及論文查重問題,這也對學術不正之風起到一定糾正作用。單位主要針對科技專案申報稽核,傳統的方式人力物力比較大,且伴隨季度性的繁重工作,效率不高。基於此,單位覺得開發一款可以達到實用的

NLPPython NLTK 走進大秦帝國

sorted([w for w in set(text1) if w.endswith('ableness')]) sorted([term for term in set(text4) if 'gnt' in term]) sorted([item for item in set(text6) if

NLPPython實例:基於文本相似度對申報項目進行查重設計

用戶 strip() 字符串 執行 原創 這樣的 string 得到 亂碼問題 Python實例:申報項目查重系統設計與實現 作者:白寧超 2017年5月18日17:51:37 摘要:關於查重系統很多人並不陌生,無論本科還是碩博畢業都不可避免涉及論文查重問題,這也

NLP乾貨!Python NLTK結合stanford NLP工具包進行文字處理

Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:01:18) [MSC v.1900 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more infor

NLPTika 文字處理:抽取各種格式檔案內容

作者 白寧超 2016年3月30日18:57:08 摘要:本文主要針對自然語言處理(NLP)過程中,重要基礎部分抽取文字內容的預處理。首先我們要意識到預處理的重要性。在大資料的背景下,越來越多的非結構化半結構化文字。如何從海量文字中抽取我們需要的有價值的知識顯得尤為重要。另外文字格式常常不一,諸

NLPCNN文字分類原理及python程式碼實現

CNN分類模型架構   python程式碼實現: #!/usr/bin/python # -*- coding: utf-8 -*- import tensorflow as tf class TCNNConfig(object): #class TCNNConfig(

Python之mmap記憶體對映模組(大文字處理)說明 mmap函式介紹

【轉】Python之mmap記憶體對映模組(大文字處理)說明 背景:       通常在UNIX下面處理文字檔案的方法是sed、awk等shell命令,對於處理大檔案受CPU,IO等因素影響,對伺服器也有一定的壓力。關於sed的說明可以看瞭解sed的工作原理,本文將

原創Python 對象創建過程中元類, __new__, __call__, __init__ 的處理

diff regular luci 自定義 weight ica 一般來說 att ray 原始type: type是最原始的元類,其__call__方法是在你使用" t_class = type(classname_string, base_classes_tuple,

Python自動化開發課堂筆記Day03 - Python基礎(字符編碼使用,文件處理,函數)

賦值 創建 解釋器 使用 重復 closed 操作 邏輯 默認 字符編碼使用 1. 文本編輯器如何存取文件 文本編輯器相當一個運行在內存中的進程,所以文件內容在編輯未存儲時都是在內存中的,尚未存儲在硬盤之中,在沒有保存之前,所編輯的任何文本都只是一堆字符,沒有任何邏輯上的意

代碼學習PYTHON 異常處理

上下文 當前 異常處理 通過 工作 相同 try語句 標記 異常信息 一、什麽是異常   在程序執行過程中可能會影響程序的正常執行,一般情況下,在python無法正常處理程序時就會發生一個異常   當python腳本發生異常時我們需要捕獲處理他,否則程序會終止執行 二、異常

AI基礎python:openCV——處理鼠標事件(1)

python:opencv 處理鼠標 一、用戶通過鼠標對圖像視窗最常見的操作有: 左鍵單擊按下 左鍵單擊擡起 左鍵按下拖動 鼠標指針位置移動 二、單次單擊操作響應事件及順序 Opencv中setMouseCallback()創建了一個鼠標回調函數,每次在圖像上單擊鼠標左鍵再擡起的過程,

Python處理wave文件

方式 RM ani tag 文件格式 嵌套 場景 分享圖片 wave #本文PDF版下載 Python解析Wav文件並繪制波形的方法 #本文代碼下載 Wav波形繪圖代碼 #本文實例音頻文件night.wav下載 音頻文件下載 (石進-夜的鋼琴曲) 前言 在現在繁忙的生活中,

NLP漢語自然語言處理與實踐分詞_筆記

統計 The 計算 分詞 其余 雙向 name -c max 一、兩種分詞標準: 1. 粗粒度。 將詞作為最小基本單位。比如:浙江大學。 主要用於自然語言處理的各種應用。 2. 細粒度。 不僅對詞匯繼續切分,也對詞匯內部的語素進行切分。比如:浙江/大學。 主要用於搜索

原創python學習筆記(10)--《笨辦法學python》字串處理

  字串基本操作 (1) 字串+字串 (2)字串*數字 (3)字串+str(其他) # -*- coding:utf-8 -*- print ("test1") name1="alice" name2="bob" name_new=name1+name2 print

NLP十一基於RNN和tf.keras 實現文字生成

【一】宣告 本文源自TensorFlow官方指導(https://tensorflow.google.cn/tutorials/sequences/text_generation),增加了部分細節說明。 【二】綜述 1. tf.keras與keras有如下三個較大的不同點 1):op

NLP中文處理前提--jieba詳解

介紹 \quad\quad在自然語言處理中,中文處理技術比西文處理技術要落後很大一段距離,許多西文的處理方法中文不能直接採用,就是因為中文必需有分詞這道工序。 \quad\quad當我們進行自然語言處理

8、PythonPython orator處理資料庫

一、orator 簡介     Orator提供一個簡單和方便的資料庫資料處理庫。它的靈感來源於PHP的Laravel框架,藉助其思想實現了python版的查詢構造器和ORM(物件關係對映)。     完整的介紹文件地址:http://orator-orm.com/docs 二、or

NLP知乎文字分類比賽第一名筆記

知乎“看山杯” 奪冠記 陳雲 研究僧 537 人讚了該文章 知乎看山杯奪冠記 Update:2017-09-03: 新增2.6訓練方法說明 七月,酷暑難耐,認識的幾位同學參加知乎看山杯,均取得不錯的排名。當時天池AI醫療大賽初賽結束,官方正在為