【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]
執行結果:
相關正則知識:
- \d 匹配一個數字
- \w 匹配一個字母或者數字
- * 任意個字元(包括0個),
- + 至少一個字元
- ? 0個或1個字元
- {n} n個字元
- {n,m} n-m個字元
- \s 匹配一個空格
- \s+ 至少有一個空格
- \d{3,8} 表示3-8個數字,例如'1234567'
- \d{3}\s+\d{3,8}
- [0-9a-zA-Z\_] 匹配一個數字、字母或者下劃線
- [0-9a-zA-Z\_]+ 匹配至少由一個數字、字母或者下劃線組成的字串,
- 比如'a100','0_Z','Py3000'等等;
- [a-zA-Z\_][0-9a-zA-Z\_]*可以匹配由字母或下劃線開頭,後接任意個由一個數字、字母或者下劃線組成的字串,也就是Python合法的變數
- [a-zA-Z\_][0-9a-zA-Z\_]{0, 19}更精確地限制了變數的長度是1-20個字元(前面1個字元+後面最多19個字元)
- A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'
- ^表示行的開頭,^\d表示必須以數字開頭
- $表示行的結束,\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正則表示式基本元字元
- . 萬用字元,匹配所有字元
- ^abc 匹配以abc開始的字串
- abc$ 匹配以abc結尾的字串
- [abc] 匹配字元集合
- [A-Z0-9] 匹配字元範圍
- ed|ing|s 匹配指定的字串,諸如ed或者ing或者s
- * 前面專案0個或者多個,如a*/[a-z]* (也叫Kleene閉包)
- + 前面專案1個或者多個,如a+、[a-z]+
- ? 前面專案0個或者1個,如a?、[a-z]?
- {n} 重複n次
- {n,} 至少重複n次
- {,n} 重複不多於n次
- {m,n} 至少重複m次不多於n次
- a(b|c)+ 括號表示操作符的範圍
- 正則表示式符號:
- \b 詞邊界
- \d 任何數字等於[0-9]
- \D 任何非數字等於[^0-9]
- \s 任何空白字元[\t\n\r\f\v]
- \S 任何非空白字元[^\t\n\r\f\v]
- \w 任何字母[A-Za-z0-9]
- \W 任何非字母[^A-Za-z0-9]
- \t 製表符
- \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 >>>
【推薦】
相關推薦
【NLP】Python NLTK處理原始文字
作者:白寧超 2016年11月8日22:45:44 摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Name
【NLP】Python NLTK獲取文字語料和詞彙資源
作者:白寧超 2016年11月7日13:15:24 摘要:NLTK是由賓夕法尼亞大學計算機和資訊科學使用python語言實現的一種自然語言工具包,其收集的大量公開資料集、模型上提供了全面、易用的介面,涵蓋了分詞、詞性標註(Part-Of-Speech tag, POS-tag)、命名實體識別(Name
【NLP】Python例項:基於文字相似度對申報專案進行查重設計
作者:白寧超 2017年5月18日17:51:37 摘要:關於查重系統很多人並不陌生,無論本科還是碩博畢業都不可避免涉及論文查重問題,這也對學術不正之風起到一定糾正作用。單位主要針對科技專案申報稽核,傳統的方式人力物力比較大,且伴隨季度性的繁重工作,效率不高。基於此,單位覺得開發一款可以達到實用的
【NLP】Python 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
【NLP】Python實例:基於文本相似度對申報項目進行查重設計
用戶 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
【NLP】Tika 文字預處理:抽取各種格式檔案內容
作者 白寧超 2016年3月30日18:57:08 摘要:本文主要針對自然語言處理(NLP)過程中,重要基礎部分抽取文字內容的預處理。首先我們要意識到預處理的重要性。在大資料的背景下,越來越多的非結構化半結構化文字。如何從海量文字中抽取我們需要的有價值的知識顯得尤為重要。另外文字格式常常不一,諸
【NLP】CNN文字分類原理及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、【Python】Python orator處理資料庫
一、orator 簡介 Orator提供一個簡單和方便的資料庫資料處理庫。它的靈感來源於PHP的Laravel框架,藉助其思想實現了python版的查詢構造器和ORM(物件關係對映)。 完整的介紹文件地址:http://orator-orm.com/docs 二、or
【NLP】知乎文字分類比賽第一名筆記
知乎“看山杯” 奪冠記 陳雲 研究僧 537 人讚了該文章 知乎看山杯奪冠記 Update:2017-09-03: 新增2.6訓練方法說明 七月,酷暑難耐,認識的幾位同學參加知乎看山杯,均取得不錯的排名。當時天池AI醫療大賽初賽結束,官方正在為