Python是一個(gè)高層次的結(jié)合了解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言。
Python的設(shè)計(jì)具有很強(qiáng)的可讀性,相比其他語(yǔ)言經(jīng)常使用英文關(guān)鍵字,其他語(yǔ)言的一些標(biāo)點(diǎn)符號(hào),它具有比其他語(yǔ)言更有特色語(yǔ)法結(jié)構(gòu)。
Python特點(diǎn)
§ 1.易于學(xué)習(xí):Python有相對(duì)較少的關(guān)鍵字,結(jié)構(gòu)簡(jiǎn)單,和一個(gè)明確定義的語(yǔ)法,學(xué)習(xí)起來(lái)更加簡(jiǎn)單。
§ 2.易于閱讀:Python代碼定義的更清晰。
§ 3.易于維護(hù):Python的成功在于它的源代碼是相當(dāng)容易維護(hù)的。
§ 4.一個(gè)廣泛的標(biāo)準(zhǔn)庫(kù):Python的最大的優(yōu)勢(shì)之一是豐富的庫(kù),跨平臺(tái)的,在UNIX,Windows和Macintosh兼容很好。
§ 5.互動(dòng)模式:互動(dòng)模式的支持,您可以從終端輸入并獲得結(jié)果的語(yǔ)言,互動(dòng)的測(cè)試和調(diào)試代碼片斷。
§ 6.便攜式:Python可以運(yùn)行在多種硬件平臺(tái)和所有平臺(tái)上都具有相同的接口。
§ 7.可擴(kuò)展:可以添加低層次的模塊到Python解釋器。這些模塊使程序員可以添加或定制自己的工具,更有效。
§ 8.數(shù)據(jù)庫(kù):Python提供所有主要的商業(yè)數(shù)據(jù)庫(kù)的接口。
§ 9.GUI編程:Python支持GUI可以創(chuàng)建和移植到許多系統(tǒng)調(diào)用。
§ 10.可擴(kuò)展性:相比 shell 腳本,Python 提供了一個(gè)更好的結(jié)構(gòu),且支持大型程序。
什么是NLP?
自然語(yǔ)言處理(NLP)是關(guān)于開發(fā)能夠理解人類語(yǔ)言的應(yīng)用程序和服務(wù)。一些NLP的實(shí)際例子是語(yǔ)音識(shí)別,例如:谷歌語(yǔ)音搜索,了解內(nèi)容是什么或情感分析等。
NLP
這些是自然語(yǔ)言處理(NLP)的一些成功實(shí)現(xiàn):
搜索引擎,如谷歌,雅虎等。谷歌搜索引擎了解你是一個(gè)技術(shù)人員,所以它顯示了與你相關(guān)的結(jié)果。
社交網(wǎng)站像Facebook新聞源一樣提供。新聞Feed算法使用自然語(yǔ)言處理了解您的興趣,并向您展示與其他帖子相關(guān)的廣告和帖子。
語(yǔ)音引擎,Apple Siri等。
垃圾郵件過濾器, 現(xiàn)在垃圾郵件過濾器了解電子郵件內(nèi)容中的內(nèi)容,看看它是否是垃圾郵件。
如何使用Python開始使用NLP?
自然語(yǔ)言工具包(NLTK)是最受歡迎的自然語(yǔ)言處理庫(kù)(NLP),它是用Python編寫的,背后有一個(gè)很大的社區(qū)。
NLTK也很容易學(xué)習(xí),它是您將使用的最簡(jiǎn)單的自然語(yǔ)言處理(NLP)庫(kù)。
在這個(gè)NLP教程中,我們將使用Python NLTK庫(kù)。
Python基礎(chǔ)知識(shí),在我開始安裝NLTK之前,我假設(shè)您已經(jīng)了解了一些。
安裝nltk使用pip,如果您使用的是Windows或Linux或Mac,則可以安裝NLTK :
$ pip install nltk
在撰寫本文時(shí),您可以在Python 2.7,3.4和3.5上使用NLTK。
要檢查NLTK是否已正確安裝,您可以打開python終端并鍵入以下內(nèi)容:
導(dǎo)入nltk
如果一切順利,這意味著您已成功安裝NLTK庫(kù)。
一旦安裝了NLTK,就應(yīng)該通過運(yùn)行以下Python代碼來(lái)安裝NLTK軟件包:
import nltk
nltk.download()
這將顯示NLTK下載程序,以選擇需要安裝的軟件包。
您可以安裝所有包,因?yàn)樗鼈兊某叽绾苄 ?/p>
我們將學(xué)習(xí)如何識(shí)別網(wǎng)頁(yè)在Python中使用NLTK的內(nèi)容
首先,我們將抓取一個(gè)網(wǎng)頁(yè)并分析文本以查看該頁(yè)面的內(nèi)容。
urllib模塊將幫助我們抓取網(wǎng)頁(yè)
import urllib.request
response = urllib.request.urlopen('https://en.wikipedia.org/wiki/SpaceX')
html = response.read()
print(html)
從鏈接可以清楚地看出,該頁(yè)面是關(guān)于SpaceX的,現(xiàn)在讓我們看看我們的代碼是否能夠正確識(shí)別頁(yè)面的上下文。
Beautiful Soup
我們將使用這是一個(gè)Python庫(kù),用于從HTML和XML文件中提取數(shù)據(jù)。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'html5lib')
text = soup.get_text(strip = True)
print(text)
你會(huì)得到一個(gè)像這樣的輸出
現(xiàn)在我們從已抓取的網(wǎng)頁(yè)上獲得了干凈的文字,讓我們將文本轉(zhuǎn)換為tokens。
tokens = [t for t in text.split()]
print(tokens)
lambda
§ lambda表達(dá)式是起到一個(gè)函數(shù)速寫的作用。允許在代碼內(nèi)嵌入一個(gè)函數(shù)的定義。它只是一個(gè)表達(dá)式,函數(shù)體比def簡(jiǎn)單很多。
§ 3個(gè)數(shù)求和的例子:
>>>f = lambda x,y,z:x+y+z
>>>f(1,2,3)
>>>6
§ 而如何要用正常函數(shù)實(shí)現(xiàn)上述功能的話,需要先用def定義函數(shù)名,代碼如下:
>>>def f(x,y,z):
>>> return x+y+z
>>>n = f(1,2,3)
>>>6
filter()
§ filter()函數(shù)
§ 包括兩個(gè)參數(shù),分別是function和list。該函數(shù)根據(jù)function參數(shù)返回的結(jié)果是否為真來(lái)過濾list參數(shù)中的項(xiàng),最后返回一個(gè)新列表,如下例所示:
>>>a=[1,2,3,4,5,6,7]
>>>b=filter(lambda x:x>5, a)
>>print b
>>>[6,7]
§ 如果filter參數(shù)值為None,就使用identity()函數(shù),list參數(shù)中所有為假的元素都將被刪除。如下所示:
>>>a=[0,1,2,3,4,5,6,7]
b=filter(None, a)
>>>print b
>>>[1,2,3,4,5,6,7]
§ map()函數(shù)
§ map()的兩個(gè)參數(shù)一個(gè)是函數(shù)名,另一個(gè)是列表或元組。
>>>map(lambda x:x+3, a) #這里的a同上
>>>[3,4,5,6,7,8,9,10] #另一個(gè)例子
>>>a=[1,2,3] >>>b=[4,5,6]
>>>map(lambda x,y:x+y, a,b)
>>>[5,7,9]
§ 在刷題的過程中,map()函數(shù)通常可以結(jié)合輸入一起使用,例如在一行中輸入3個(gè)整數(shù),可用如下語(yǔ)句:
a,b,c = map(int, input().split())
§ reduce()函數(shù)
§ reduce()函數(shù)接收的參數(shù)和 map()類似,一個(gè)函數(shù) f,一個(gè)list,但行為和 map()不同,reduce()傳入的函數(shù) f 必須接收兩個(gè)參數(shù),reduce()對(duì)list的每個(gè)元素反復(fù)調(diào)用函數(shù)f,并返回最終結(jié)果值。
§ 例如,編寫一個(gè)f函數(shù),接收x和y,返回x和y的和:
def f(x, y):
return x + y
§ 調(diào)用 reduce(f, [1, 3, 5, 7, 9])時(shí),reduce函數(shù)將做如下計(jì)算:
1. 先計(jì)算頭兩個(gè)元素:f(1, 3),結(jié)果為4;
2. 再把結(jié)果和第3個(gè)元素計(jì)算:f(4, 5),結(jié)果為9;
3. 再把結(jié)果和第4個(gè)元素計(jì)算:f(9, 7),結(jié)果為16;
4. 再把結(jié)果和第5個(gè)元素計(jì)算:f(16, 9),結(jié)果為25;
5. 由于沒有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。
range()
§ range() 函數(shù)可創(chuàng)建一個(gè)整數(shù)列表,一般用在 for 循環(huán)中。語(yǔ)法如下:
§ range(start, stop, step)
§ 實(shí)例:
>>>range(10) # 從 0 開始到 10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(1, 11) # 從 1 開始到 11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> range(0, 30, 5) # 步長(zhǎng)為 5 [0, 5, 10, 15, 20, 25]
>>> range(0, 10, 3) # 步長(zhǎng)為 3 [0, 3, 6, 9]
>>> range(0, -10, -1) # 負(fù)數(shù) [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
>>> range(0) []
>>> range(1, 0) []
§ range 在 for 中的使用:
for i in range(n): # 正序遍歷,表示i的取值從0到n-1
for i in range(n,0,-1): # 倒序遍歷,表示i的取值從n到1
dict字典
§ dict字典使用鍵-值(key-value)存儲(chǔ),具有極快的查找速度。在Java中也稱為map。
§ 舉個(gè)例子,假設(shè)要根據(jù)同學(xué)的名字查找對(duì)應(yīng)的成績(jī),如果用list實(shí)現(xiàn),需要兩個(gè)list:
names = ['Michael', 'Bob', 'Tracy']
scores = [95, 75, 85]
§ 給定一個(gè)名字,要查找對(duì)應(yīng)的成績(jī),就先要在names中找到對(duì)應(yīng)的位置,再?gòu)膕cores取出對(duì)應(yīng)的成績(jī),list越長(zhǎng),耗時(shí)越長(zhǎng)。
§ 如果用dict實(shí)現(xiàn),只需要一個(gè)“名字”-“成績(jī)”的對(duì)照表,直接根據(jù)名字查找成績(jī),無(wú)論這個(gè)表有多大,查找速度都不會(huì)變慢。用Python寫一個(gè)dict如下:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael'] 95
§ 我在刷題的時(shí)候,遇到一個(gè)問題就是需要在循環(huán)中動(dòng)態(tài)往dict添加數(shù)據(jù),但是沒有找到添加的函數(shù),其實(shí)不用插入函數(shù),循環(huán)中動(dòng)態(tài)往dict添加數(shù)據(jù)也很簡(jiǎn)單,如下所示:
dt = {} #先定義一個(gè)字典,注意是{},如果定義數(shù)組是[]
for i in range(n):
dt[key[i]] = value[i]
sort
§ sort參數(shù)說(shuō)明
L.sort(cmp=None, key=None, reverse=False)
§ sorted參數(shù)說(shuō)明
sorted(iterable, cmp=None, key=None, reverse=False)
§ iterable:是可迭代類型,通常為一個(gè)集合;
§ cmp:用于比較的函數(shù),比較什么由key決定,有默認(rèn)值,迭代集合中的一項(xiàng);
§ key:用列表元素的某個(gè)屬性和函數(shù)進(jìn)行作為關(guān)鍵字,有默認(rèn)值,迭代集合中的一項(xiàng);
§ reverse:排序規(guī)則. reverse = True 表示降序 或者 reverse = False 表示升序,默認(rèn)值為False。
§ 使用sort()方法對(duì)list排序會(huì)修改list本身,不會(huì)返回新list,使用方法如下:
my_list = [3, 5, 1, 4, 2]
my_list.sort()
print my_list
#輸出:
[1, 2, 3, 4, 5]
§ 而使用sorted()方法排序時(shí)會(huì)返回一個(gè)新的list:
my_list = [3, 5, 1, 4, 2]
result = sorted(my_list) #返回一個(gè)新的list
print result
#輸出:
[1, 2, 3, 4, 5]
常用的一些零散的小知識(shí)
§ 求實(shí)數(shù)的多少次冪
§ 正常在java和C語(yǔ)言中,求一個(gè)數(shù)的冪需要調(diào)用一個(gè)求冪的函數(shù),但是Python中直接一個(gè)運(yùn)算符就可以搞定了:
#Python求冪
10**2 #10的平方
10**4 #10的4次方
§ print(‘xx’,end=’’)中end問題
§ end是print()函數(shù)的一個(gè)參數(shù)。end 是輸出語(yǔ)句結(jié)束以后附加的字符串,它的默認(rèn)值是換行(’ ’)。如果輸出的時(shí)候不需要換行需要顯示的給end賦值。
§ 例如輸出一個(gè)數(shù)組,每個(gè)數(shù)之間以空格隔開,可以用如下語(yǔ)句:
for i in range(n):
print(data[i],end=' ') #end值為空格
§ 如果只是單純的想要輸出不換行,可以令end='',end值為空字符串
§ // 與 / 的區(qū)別
§ “ / “ 表示浮點(diǎn)數(shù)除法,返回浮點(diǎn)結(jié)果;
§ “ // “ 表示整數(shù)除法,返回不大于結(jié)果的一個(gè)最大的整數(shù)
§ 【code】
print("6 // 4 = " + str(6 // 4))
print("6 / 4 =" + str(6 / 4))
§ 【result】
6 // 4 = 1
6 / 4 =1.5
§ 記得用set去除重復(fù)元素
§ 如果一個(gè)數(shù)組中有很多重復(fù)元素,根據(jù)需求需要去除重復(fù)元素的話,可以使用set集合,類似于Java的HashSet。
§ 語(yǔ)法很簡(jiǎn)單,只需一行代碼就可以去重,如下所示:
§ 【code】
a = [1,1,2,2,3,4,5]
a = set(a) print(a)
§ 【result】
{1, 2, 3, 4, 5}
關(guān)鍵詞: Python