In [3]:
from __future__ import division
import nltk, re, pprint
In [1]:
from urllib import urlopen
url = "http://www.gutenberg.org/files/2554/2554.txt"
raw = urlopen(url).read()
type(raw)
Out[1]:
註:如果要使用proxy下載,可以用
proxy = {'http': 'http://www.someproxy.com:3128'}
raw = urlopen(url, proxies=proxy).read()
剛下載的raw
是字串形態,包含許多不必要的字,所以需要tokenization,使單字分離。
In [4]:
tokens = nltk.word_tokenize(raw)
tokens[:10]
Out[4]:
產生的token可以進一步轉換成nltk text形態,以便進一步處理。
In [5]:
text = nltk.Text(tokens)
text
Out[5]:
In [6]:
text.collocations()
In [7]:
url = "http://news.bbc.co.uk/2/hi/health/2284783.stm"
html = urlopen(url).read()
html[:60]
Out[7]:
In [15]:
from bs4 import BeautifulSoup
bs = BeautifulSoup(html, "lxml")
In [21]:
tokens = nltk.word_tokenize(bs.get_text())
tokens[:5]
Out[21]:
concordance
列出單字出現的每個地方
In [22]:
text = nltk.Text(tokens)
text.concordance('gene')
In [31]:
s = """hello, my
friend"""
print s
str
支援+
和*
兩個operator。+
代表連接兩個字串,*
代表重複一個字串。
In [32]:
'must' + 'maybe' + 'hello'
Out[32]:
In [34]:
'bug-' * 5
Out[34]:
用[i]
可以存取第i+1個字元,如果字串長度是n,則i的範圍為0到n-1。
用[-i]
可以存取後面數過來第i個字元,如果字串長度是n,則i的範圍為-1到-n。
In [36]:
s = 'hello, world'
s[0], s[1], s[:5], s[-5:]
Out[36]:
其他常見的字串函式:
s.find(t)
: 找到字串s內第一個字串t的位置,介於0~n-1間,找不到傳回-1s.rfind(t)
: 從右邊找字串s內第一個字串t的位置,介於0~n-1間,找不到傳回-1s.index(t)
: 功能如s.find(t)
,但找不到時會產生ValueErrors.rindex(t)
: 功能如s.rfind(t)
,但找不到時會產生ValueErrors.join([a,b,c])
: 將字串a,b,c結合,中間插入s,最後結果為asbscs.split(t)
: 用字串t為分隔,將s拆成多個字串,預設t為空白字元s.splitlines()
: 將字串s根據換行拆成多個字串s.lower()
: 將所有字母換成小寫s.upper()
: 將所有字母換成大寫s.titlecase()
: 每個單字第一個字母換成大寫s.strip()
: 刪除前後的空白字元s.replace(t, u)
: 將s中的字串t替換成字串u
In [44]:
path = nltk.data.find('corpora/unicode_samples/polish-lat2.txt')
In [60]:
import codecs
f = codecs.open(path, encoding='latin2')
for line in f:
print line, line.encode('utf-8'), line.encode('unicode_escape'), '\n'
In [65]:
# 傳回unicode的編號
print ord(u'許'), ord(u'洪'), ord(u'蓋')
In [66]:
print repr(u'許洪蓋')
unicodedata
可以印出unicode中對字元的描述
In [67]:
import unicodedata
lines = codecs.open(path, encoding='latin2').readlines()
line = lines[2]
print line.encode('unicode_escape')
In [69]:
for c in line:
if ord(c) > 127:
print '%s U+%04x %s' % (c.encode('utf8'), ord(c), unicodedata.name(c))
In [70]:
import re
In [77]:
# 一般re.search傳回的是一個 _sre.SRE_Match 物件
# 將物件轉換成 bool 值,如果 True 代表有找到符合的字串
bool(re.search('ed$', 'played')), bool(re.search('ed$', 'happy'))
Out[77]:
In [98]:
# re.findall 可以取出部分的字串,要取出的部分由()的範圍決定
re.findall('\[\[(.+?)[\]|\|]+', 'My Name is [[Bany]] Hung, this is my [[Dog|Animal]]')
Out[98]:
In [97]:
# re.sub 會取代字串
re.sub('\[\[.+?[\]|\|]+', '###', 'My Name is [[Bany]] Hung, this is my [[Dog|Animal]]')
Out[97]:
In [105]:
porter = nltk.PorterStemmer()
lanc = nltk.LancasterStemmer()
w = ['I','was','playing','television','in','the','painted','garden']
[(a, porter.stem(a), lanc.stem(a)) for a in w]
Out[105]:
作stemming之前,要將原始資料存在dict中,以方便使用。
In [120]:
class IndexedText(object):
def __init__(self, stemmer, text):
self._text = text
self._stemmer = stemmer
self._index = nltk.Index((self._stem(word), i) for (i, word) in enumerate(text))
def concordance(self, word, width=40):
key = self._stem(word)
wc = int(width/4) # words of context
for i in self._index[key]:
lcontext = ' '.join(self._text[i-wc:i])
rcontext = ' '.join(self._text[i:i+wc])
ldisplay = '%*s' % (width, lcontext[-width:])
rdisplay = '%-*s' % (width, rcontext[:width])
print ldisplay, rdisplay
def _stem(self, word):
return self._stemmer.stem(word).lower()
In [121]:
grail = nltk.corpus.webtext.words('grail.txt')
text = IndexedText(porter, grail)
text.concordance('lie')
In [132]:
s = ['women', 'are', 'living']
wnl = nltk.WordNetLemmatizer()
zip(s, [wnl.lemmatize(t, 'v') for t in s], [wnl.lemmatize(t, 'n') for t in s])
Out[132]:
In [135]:
s = ['We', 'called', 'him', 'Tortoise', 'because', 'he', 'taught', 'us', '.']
' '.join(s)
Out[135]:
In [137]:
';'.join(s)
Out[137]: