Python自然語言處理 3 處理原始文字

CopperDong發表於2017-11-19

本章的目的是要回答下列問題:

(1) 怎樣才能編寫程式訪問本地和網路上的檔案,從而獲得無限的語言材料?

(2)如何把文件分割成單獨的單詞和標點符號,並進行文字語料上分析?

(3)怎樣編寫程式產生格式化的輸出,並把結果儲存在檔案中?

為了解決這些問題,本章將介紹NLP的重要概念,包括分詞和詞幹提取.在過程中,鞏固Python知識並且學習關於字串,檔案和正規表示式的知識.網路上的文字都是HTML格式的,我們將學習如何使用HTML

一,從網路和硬碟訪問文字

#處理電子書 txt

古騰堡專案http://www.gutenberg.org/catalog/有25000本免費線上書籍的目錄

編號2554的文字是<罪與罰>

from urllib import urlopen
url = "http://www.gutenberg.org/files/2554/2554-0.txt"
raw = urlopen(url).read()
type(raw)

   str

len(raw)
   
1201733
raw = raw.replace('\xef\xbb\xbf','')
raw[:75]

'The Project Gutenberg EBook of Crime and Punishment, by Fyodor Dostoevsky\r\n\'
分詞

import nltk

import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )

tokens = nltk.word_tokenize(raw)

type(tokens)

list
len(tokens)

244761
tokens[:15]

['\xef',
 '\xbb',
 '\xbfThe',
 'Project',
 'Gutenberg'
在連結串列中建立NLTK文字

text = nltk.Text(tokens)

type(text)

text[1020:1060]

text.collocations()

raw.find("PART I")

5381
raw.rfind("End of Project Gutenberg’s Crime")

1182515
raw = raw[5381:1182515]

raw.find("PART I")

0

#處理HTML

url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = urlopen(url).read()
html[:60]

'<!doctype html public "-//W3C//DTD HTML 4.0 Transitional//EN'
#raw = nltk.clean_html(html)

from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
raw = soup.get_text()

tokens = nltk.word_tokenize(raw)

tokens

[u'BBC',
 u'NEWS',
 u'|',
 u'Health',
 u'|',

#處理搜尋引擎的結果

網路可以被看做未經標註的巨大語料庫

#處理RSS訂閱

http://feedparser.org

#讀取本地檔案

import sys

#從PDF,MS word及其他二進位制格式中提取文字

使用pypdf和pywin32

#捕獲使用者輸入

s = raw_input("Enter some text: ")

#NLP的流程


二, 字串: 最底層的文字處理


#連結串列與字串的差異

字串和連結串列都是一種序列.可以通過索引抽取它們中的一部分,可以給它們切片,也可以使用連線將它們合併在一起,但是,字串和連結串列之間不能連線

query = 'Who knows?' 

beatles = ['John', 'Paul', 'George', 'Ringo']

query[0] = 'F'  #不可變

beatles[0] = 'F' #可變的

三, 使用Unicode進行文書處理


#從檔案中提取已編碼文字

import   codecs

f = codecs.open(path, encoding='utf8')


四  使用正規表示式檢測片語搭配


五 正規表示式的有益應用

#提取字元塊

找出文字中兩個或兩個以上的母音序列,並確定它們的相對頻率

import re
wsj = sorted(set(nltk.corpus.treebank.words()))
fd = nltk.FreqDist(vs for word in wsj for vs in re.findall(r'[aeiou]{2,}', word))
fd.items()

#在字元塊上做更多事情

#查詢詞幹

查詢"laptops"會找到含有"laptop"的文件

def stem(word):
    for suffix in ['ing','ly','ed','ious','ies','ive','es','s','ment']:
        if word.endswith(suffix):
            return word[:-len(suffix)]
    return word

使用正規表示式

#搜尋已分詞文字

這種自動和人工處理相結合的方式是最常見的建造新語料庫的方式

六 規範化文字


raw = """DENNIS:Listen, strange women lying in ponds distributing swords is no basis for a system of government. Supreme executive power derives from a mandate from the masses, not from some farcical aquatic ceremony."""

tokens = nltk.word_tokenize(raw)

#詞幹提取器

porter = nltk.PorterStemmer()
lancaster = nltk.LancasterStemmer()
[porter.stem(t) for t in tokens]
[u'denni',
 ':',
 'listen',
 ',',
 u'strang',

#詞形歸併

wnl = nltk.WordNetLemmatizer()
[wnl.lemmatize(t) for t in tokens]
['DENNIS',
 ':',
 'Listen',
 ',',
 'strange',
 u'woman',
 'lying',

七 用正規表示式為文字分詞

#分詞的簡單方法

re.split(r" ', raw)    #在空格符處分割原始文字

re.split(r'[ \t\n]+', raw)  #同時需要匹配任何數量的空格符\製表符或換行符

八 分割

#斷句

sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
text = nltk.corpus.gutenberg.raw('chesterton-thursday.txt')
sents = sent_tokenizer.tokenize(text)
pprint.pprint(sents[171:181])

#分詞


九 格式化:從連結串列到字串

#從連結串列到字串

silly = ['We','called','him','Tortoise','because','he','taught','us','.']
' '.join(silly)
'We called him Tortoise because he taught us .'
';'.join(silly)
'We;called;him;Tortoise;because;he;taught;us;.'
''.join(silly)
'WecalledhimTortoisebecausehetaughtus.'

十 深入閱讀

















































相關文章