麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

手機(jī)站
千鋒教育

千鋒學(xué)習(xí)站 | 隨時(shí)隨地免費(fèi)學(xué)

千鋒教育

掃一掃進(jìn)入千鋒手機(jī)站

領(lǐng)取全套視頻
千鋒教育

關(guān)注千鋒學(xué)習(xí)站小程序
隨時(shí)隨地免費(fèi)學(xué)習(xí)課程

當(dāng)前位置:首頁(yè)  >  技術(shù)干貨  > 探索 Python、機(jī)器學(xué)習(xí)和 NLTK 庫(kù)

探索 Python、機(jī)器學(xué)習(xí)和 NLTK 庫(kù)

來(lái)源:千鋒教育
發(fā)布人:xqq
時(shí)間: 2023-11-06 03:39:51 1699213191

挑戰(zhàn):使用機(jī)器學(xué)習(xí)對(duì)RSS提要進(jìn)行分類(lèi)

最近,我接到一項(xiàng)任務(wù),要求為客戶(hù)創(chuàng)建一個(gè)RSS提要分類(lèi)子系統(tǒng)。目標(biāo)是讀取幾十個(gè)甚至幾百個(gè)RSS提要,將它們的許多文章自動(dòng)分類(lèi)到幾十個(gè)預(yù)定義的主題領(lǐng)域當(dāng)中。客戶(hù)網(wǎng)站的內(nèi)容、導(dǎo)航和搜索功能都將由這個(gè)每日自動(dòng)提要檢索和分類(lèi)結(jié)果驅(qū)動(dòng)。

客戶(hù)建議使用機(jī)器學(xué)習(xí),或許還會(huì)使用ApacheMahout和Hadoop來(lái)實(shí)現(xiàn)該任務(wù),因?yàn)榭蛻?hù)最近閱讀了有關(guān)這些技術(shù)的文章。但是,客戶(hù)的開(kāi)發(fā)團(tuán)隊(duì)和我們的開(kāi)發(fā)團(tuán)隊(duì)都更熟悉Ruby,而不是Java?技術(shù)。本文將介紹解決方案的技術(shù)之旅、學(xué)習(xí)過(guò)程和最終實(shí)現(xiàn)。

什么是機(jī)器學(xué)習(xí)?

我的第一個(gè)問(wèn)題是,“究竟什么是機(jī)器學(xué)習(xí)?”我聽(tīng)說(shuō)過(guò)這個(gè)術(shù)語(yǔ),并且隱約知道超級(jí)計(jì)算機(jī)IBM?Watson最近使用該技術(shù)在一場(chǎng)Jeopardy比賽中擊敗了人類(lèi)競(jìng)爭(zhēng)者。作為購(gòu)物者和社交網(wǎng)絡(luò)活動(dòng)參與者,我也知道Amazon.com和Facebook根據(jù)其購(gòu)物者數(shù)據(jù)在提供建議(如產(chǎn)品和人)方面表現(xiàn)良好。總之,機(jī)器學(xué)習(xí)取決于IT、數(shù)學(xué)和自然語(yǔ)言的交集。它主要關(guān)注以下三個(gè)主題,但客戶(hù)的解決方案最終僅涉及前兩個(gè)主題:

分類(lèi)。根據(jù)類(lèi)似項(xiàng)目的一組訓(xùn)練數(shù)據(jù),將相關(guān)的項(xiàng)分配到任意預(yù)定義的類(lèi)別

建議。根據(jù)類(lèi)似項(xiàng)目的觀察來(lái)建議采用的項(xiàng)

集群。在一組數(shù)據(jù)內(nèi)確定子組

Mahout和Ruby的選擇

理解了機(jī)器學(xué)習(xí)是什么之后,下一步是確定如何實(shí)現(xiàn)它。根據(jù)客戶(hù)的建議,Mahout是一個(gè)合適的起點(diǎn)。我從Apache下載了代碼,并開(kāi)始了學(xué)習(xí)使用Mahout及其兄弟Hadoop實(shí)現(xiàn)機(jī)器學(xué)習(xí)的過(guò)程。不幸的是,我發(fā)現(xiàn)即使對(duì)于有經(jīng)驗(yàn)的Java開(kāi)發(fā)人員而言,Mahout的學(xué)習(xí)曲線也很陡峭,并且不存在可用的樣例代碼。同樣不幸的是,機(jī)器學(xué)習(xí)缺乏基于Ruby的框架或gem。

發(fā)現(xiàn)Python和NLTK

我繼續(xù)搜索解決方案,并且在結(jié)果集中一直遇到"Python"。作為一名Ruby開(kāi)發(fā)人員,雖然我還沒(méi)有學(xué)過(guò)該語(yǔ)言,但我也知道Python是一個(gè)面向相似對(duì)象的、基于文本的、可理解和動(dòng)態(tài)的編程語(yǔ)言。盡管兩種語(yǔ)言之間存在一些相似之處,但我多年來(lái)都忽視了學(xué)習(xí)Python,將它視為一項(xiàng)多余的技能集。Python是我的“盲點(diǎn)”,我懷疑許多Ruby開(kāi)發(fā)人員同行都是這樣認(rèn)為的。

搜索機(jī)器學(xué)習(xí)的書(shū)籍,并更深入研究它們的目錄,我發(fā)現(xiàn),有相當(dāng)高比例的此類(lèi)系統(tǒng)在使用Python作為其實(shí)現(xiàn)語(yǔ)言,并使用了一個(gè)被稱(chēng)為NaturalLanguageToolkit(NLTK,自然語(yǔ)言工具包)的庫(kù)。通過(guò)進(jìn)一步的搜索,我發(fā)現(xiàn)Python的應(yīng)用比我意識(shí)到的還要廣泛,如GoogleAppEngine、YouTube和使用Django框架構(gòu)建的網(wǎng)站。它甚至還預(yù)安裝在我每天都使用的MacOSX工作站上!此外,Python為數(shù)學(xué)、科學(xué)和工程提供了有趣的標(biāo)準(zhǔn)庫(kù)(例如,NumPy和SciPy)。

我決定推行一個(gè)Python解決方案,因?yàn)槲艺业搅朔浅:玫木幋a示例。例如,下面這一行代碼就是通過(guò)HTTP讀取RSS提要并打印其內(nèi)容所需的所有代碼:

printfeedparser.parse("http://feeds.nytimes.com/nyt/rss/Technology")

快速掌握Python

執(zhí)行Python程序同樣很簡(jiǎn)單。獲得一個(gè)名稱(chēng)為locomotive_main.py的程序和三個(gè)參數(shù),然后您就可以使用Python程序編譯并執(zhí)行它:

$pythonlocomotive_main.pyarg1arg2arg3

Python使用清單1中的if__name__=="__main__":語(yǔ)法來(lái)確定文件本身是從命令行執(zhí)行的還是從其他代碼導(dǎo)入的。為了讓文件變得可以執(zhí)行,需要添加"__main__"檢測(cè)。

清單1.Main檢測(cè)

importsys

importtime

importlocomotive

if__name__=="__main__":

start_time=time.time()

iflen(sys.argv)>1:

app=locomotive.app.Application()

...additionallogic...

virtualenv

大多數(shù)Ruby開(kāi)發(fā)人員熟悉系統(tǒng)范圍的庫(kù)或gem的問(wèn)題。使用一組系統(tǒng)范圍內(nèi)的庫(kù)的做法一般是不可取的,因?yàn)槟钠渲幸粋€(gè)項(xiàng)目可能依賴(lài)于某個(gè)給定的庫(kù)的版本1.0.0,而另一個(gè)項(xiàng)目則依賴(lài)于版本1.2.7。同樣,Java開(kāi)發(fā)人員都知道系統(tǒng)范圍的CLASSPATH存在同樣的問(wèn)題。就像Ruby社區(qū)使用其rvm工具,而Python社區(qū)使用virtualenv工具(請(qǐng)參閱參考資料,以獲得相關(guān)鏈接)來(lái)創(chuàng)建獨(dú)立的執(zhí)行環(huán)境,其中包含特定版本的Python和一組庫(kù)。清單2中的命令顯示了如何為您p1項(xiàng)目創(chuàng)建一個(gè)名為p1_env的虛擬環(huán)境,其中包含feedparser、numpy、scipy和nltk庫(kù)。

清單2.使用virualenv創(chuàng)建一個(gè)虛擬環(huán)境的命令

$sudopipinstallvirtualenv

$cd~

$mkdirp1

$cdp1

$virtualenvp1_env--distribute

$sourcep1_env/bin/activate

(p1_env)[~/p1]$pipinstallfeedparser

(p1_env)[~/p1]$pipinstallnumpy

(p1_env)[~/p1]$pipinstallscipy

(p1_env)[~/p1]$pipinstallnltk

(p1_env)[~/p1]$pipfreeze

每次在一個(gè)shell窗口使用您的項(xiàng)目時(shí),都需要“獲得”您的虛擬環(huán)境激活腳本。請(qǐng)注意,在激活腳本被獲得后,shell提示符會(huì)改變。當(dāng)在您的系統(tǒng)上創(chuàng)建和使用shell窗口,輕松地導(dǎo)航到您的項(xiàng)目目錄,并啟動(dòng)其虛擬環(huán)境時(shí),您可能想在您的~/.bash_profile文件中添加以下條目:

$aliasp1="cd~/p1;sourcep1_env/bin/activate"

代碼庫(kù)結(jié)構(gòu)

在完成簡(jiǎn)單的單文件“HelloWorld”程序的編寫(xiě)之后,Python開(kāi)發(fā)人員需要理解如何正確地組織其代碼庫(kù)的目錄和文件名。Java和Ruby語(yǔ)言在這方面都有各自的要求,Python也沒(méi)有什么不同。簡(jiǎn)單來(lái)說(shuō),Python使用包的概念對(duì)相關(guān)的代碼進(jìn)行分組,并提供了明確的名稱(chēng)空間。出于演示目的,在本文中,代碼存在于某個(gè)給定項(xiàng)目的根目錄中,例如~/p1。在這個(gè)目錄中,存在一個(gè)用于相同名稱(chēng)的Python包的locomotive目錄。清單3顯示了這個(gè)目錄結(jié)構(gòu)。

清單3.示例目錄結(jié)構(gòu)

locomotive_main.py

locomotive_tests.py

locomotive/

__init__.py

app.py

capture.py

category_associations.py

classify.py

news.py

recommend.py

rss.py

locomotive_tests/

__init__.py

app_test.py

category_associations_test.py

feed_item_test.pyc

rss_item_test.py

請(qǐng)注意名稱(chēng)古怪的__init__.py文件。這些文件指示Python為您的包加載必要的庫(kù)和特定的應(yīng)用程序代碼文件,它們都位于相同的目錄中。清單4顯示了文件locomotive/__init__.py的內(nèi)容。

清單4.locomotive/__init__.py

#systemimports;loadsinstalledpackages

importcodecs

importlocale

importsys

#applicationimports;theseloadyourspecific*.pyfiles

importapp

importcapture

importcategory_associations

importclassify

importrss

importnews

importrecommend

有了結(jié)構(gòu)如清單4所示的locomotive包之后,在項(xiàng)目的根目錄中的主程序就可以導(dǎo)入并使用它。例如,文件locomotive_main.py包含以下導(dǎo)入:

importsys#>--systemlibrary

importtime#>--systemlibrary

importlocomotive#>--customapplicationcodelibraryinthe"locomotive"directory

測(cè)試

Pythonunittest標(biāo)準(zhǔn)庫(kù)提供一個(gè)非常好的測(cè)試解決方案。熟悉JUnit的Java開(kāi)發(fā)人員和熟悉Test::Unit框架的Ruby開(kāi)發(fā)人員應(yīng)該會(huì)覺(jué)得清單5中的Pythonunittest代碼很容易理解。

清單5.Pythonunittest

classAppTest(unittest.TestCase):

defsetUp(self):

self.app=locomotive.app.Application()

deftearDown(self):

pass

deftest_development_feeds_list(self):

feeds_list=self.app.development_feeds_list()

self.assertTrue(len(feeds_list)==15)

self.assertTrue('feed://news.yahoo.com/rss/stock-markets'infeeds_list)

清單5中的代碼還演示了Python的一個(gè)顯著的特點(diǎn):所有的代碼必須一致縮進(jìn),否則無(wú)法成功編譯。tearDown(self)方法可能在開(kāi)始時(shí)看起來(lái)有點(diǎn)古怪。您可能會(huì)問(wèn),為什么測(cè)試總是被硬編碼為通過(guò)?事實(shí)上并非如此。這只是在Python中編寫(xiě)空方法的一種方式。

工具

我真正需要的是一個(gè)具備語(yǔ)法突出顯示、代碼完成和斷點(diǎn)調(diào)試功能的集成開(kāi)發(fā)環(huán)境(IDE),用該環(huán)境幫助我掌握我的Python學(xué)習(xí)曲線。作為使用EclipseIDE進(jìn)行Java開(kāi)發(fā)的一名用戶(hù),pyeclipse插件是我考慮的下一個(gè)工具。雖然該插件有時(shí)比較慢,但它工作得相當(dāng)不錯(cuò)。我最終投資了PyCharmIDE,它滿足了我的所有IDE要求。

在掌握了Python及其生態(tài)系統(tǒng)的基本知識(shí)之后,終于來(lái)到開(kāi)始實(shí)現(xiàn)機(jī)器學(xué)習(xí)解決方案的時(shí)候。

使用Python和NLTK實(shí)現(xiàn)分類(lèi)

實(shí)現(xiàn)解決方案涉及捕獲模擬的RSS提要、整理其文本、使用一個(gè)NaiveBayesClassifier和kNN算法對(duì)類(lèi)別進(jìn)行分類(lèi)。下面將會(huì)介紹這些操作中的每一個(gè)。

捕獲和解析提要

該項(xiàng)目特別具有挑戰(zhàn)性,因?yàn)榭蛻?hù)還沒(méi)有定義目標(biāo)RSS提要列表。因此,也不存在“訓(xùn)練數(shù)據(jù)”。所以,在初始開(kāi)發(fā)期間必須模擬提要和訓(xùn)練數(shù)據(jù)。

我用來(lái)獲得示例提要數(shù)據(jù)的第一個(gè)方法是只提取在某個(gè)文本文件中指定的列表中的RSS提要。Python提供了一個(gè)很好的RSS提要解析庫(kù),其名稱(chēng)為feedparser,它抽象不同的RSS和Atom格式之間的差異。簡(jiǎn)單的基于文本的對(duì)象序列化的另一個(gè)有用的庫(kù)被幽默地稱(chēng)為pickle(泡菜)。這兩個(gè)庫(kù)在清單6的代碼中均有使用,清單6中的代碼將每一個(gè)RSS提要捕獲為“腌制過(guò)的”對(duì)象文件,以備后用。如您所見(jiàn),Python代碼非常簡(jiǎn)潔,且功能強(qiáng)大。

清單6.CaptureFeeds類(lèi)

importfeedparser

importpickle

classCaptureFeeds:

def__init__(self):

for(i,url)inenumerate(self.rss_feeds_list()):

self.capture_as_pickled_feed(url.strip(),i)

defrss_feeds_list(self):

f=open('feeds_list.txt','r')

list=f.readlines()

f.close

returnlist

defcapture_as_pickled_feed(self,url,feed_index):

feed=feedparser.parse(url)

f=open('data/feed_'+str(feed_index)+'.pkl','w')

pickle.dump(feed,f)

f.close()

if__name__=="__main__":

cf=CaptureFeeds()

下一步的挑戰(zhàn)性之大是出乎意料的。現(xiàn)在,我有了樣例提要數(shù)據(jù),必須對(duì)它進(jìn)行分類(lèi),以便將它用作訓(xùn)練數(shù)據(jù)。訓(xùn)練數(shù)據(jù)是向您的分類(lèi)算法提供的數(shù)據(jù)集,以便您能從中進(jìn)行學(xué)習(xí)。

例如,我使用的樣例提要包括了體育電視網(wǎng)絡(luò)公司ESPN。提要的項(xiàng)目之一是關(guān)于DenverBroncos橄欖球隊(duì)的TimTebow被轉(zhuǎn)會(huì)到NewYorkJets橄欖球隊(duì),在同一時(shí)間,Broncos簽了他們新的四分衛(wèi)PeytonManning。提要結(jié)果中的另一個(gè)項(xiàng)目是BoeingCompany和它的新噴氣式飛機(jī)(jet)。所以,這里的問(wèn)題是,應(yīng)該將哪些具體的類(lèi)別值分配給第一個(gè)故事?tebow、broncos、manning、jets、quarterback、trade和nfl這些值都是合適的。但只有一個(gè)值可以在訓(xùn)練數(shù)據(jù)中被指定為訓(xùn)練數(shù)據(jù)類(lèi)別。同樣,在第二個(gè)故事中,類(lèi)別應(yīng)該是boeing還是jet?困難的部分在于這些細(xì)節(jié)。如果您的算法要產(chǎn)生精確的結(jié)果,那么大型訓(xùn)練數(shù)據(jù)集的準(zhǔn)確手工分類(lèi)非常關(guān)鍵。要做到這一點(diǎn),不應(yīng)該低估所需的時(shí)間。

我需要使用更多的數(shù)據(jù),而且這些數(shù)據(jù)必須已進(jìn)行了準(zhǔn)確的分類(lèi),這種情況很快就變得明顯。我可以在哪里找到這樣的數(shù)據(jù)呢?進(jìn)入PythonNLTK。除了是一個(gè)出色的語(yǔ)言文本處理庫(kù)之外,它甚至還帶有可下載的示例數(shù)據(jù)集,或是其術(shù)語(yǔ)中的文集,以及可以輕松訪問(wèn)此下載數(shù)據(jù)的應(yīng)用程序編程接口。要安裝Reuters文集,可以運(yùn)行如下所示的命令。會(huì)有超過(guò)10,000篇新聞文章將下載到您的~/nltk_data/corpora/reuters/目錄中。與RSS提要項(xiàng)目一樣,每篇Reuters新聞文章中都包含一個(gè)標(biāo)題和一個(gè)正文,所以這個(gè)NLTK預(yù)分類(lèi)的數(shù)據(jù)非常適合于模擬RSS提要。

$python#enteraninteractivePythonshell

>>>importnltk#importthenltklibrary

>>>nltk.download()#runtheNLTKDownloader,thenenter'd'Download

Identifier>reuters#specifythe'reuters'corpus

特別令人感興趣的是文件~/nltk_data/corpora/reuters/cats.txt。它包含了一個(gè)列表,其中包含文章文件名稱(chēng),以及為每個(gè)文章文件分配的類(lèi)別。文件看起來(lái)如下所示,所以,子目錄test中的文件14828中的文章與主題grain有關(guān)。

test/14826trade

test/14828grain

自然語(yǔ)言是混亂的

RSS提要分類(lèi)算法的原始輸入,當(dāng)然是以英語(yǔ)書(shū)寫(xiě)的文本。原始,確實(shí)如此。

從計(jì)算機(jī)處理的角度來(lái)看,英語(yǔ)或任何自然語(yǔ)言(口語(yǔ)或普通的語(yǔ)言)都是極不規(guī)范和不準(zhǔn)確的。首先,存在大小寫(xiě)的問(wèn)題。單詞Bronco是否等于bronco?答案是,也許是。接下來(lái),您要應(yīng)付標(biāo)點(diǎn)和空格。bronco.是否等于bronco或bronco,?算是吧。然后,有復(fù)數(shù)形式和相似的單詞。run、running和ran是否相等?這取決于不同的情況。這三個(gè)詞有一個(gè)共同的詞根。如果將自然語(yǔ)言詞匯嵌入在標(biāo)記語(yǔ)言(如HTML)中,情況會(huì)怎么樣呢?在這種情況下,您必須處理像bronco這樣的文本。最后,還有一個(gè)問(wèn)題,就是那些經(jīng)常使用但基本上毫無(wú)意義的單詞,像a、and和the。這些所謂的停用詞非常礙事。自然語(yǔ)言非常凌亂;在處理之前,需要對(duì)它們進(jìn)行整理。

幸運(yùn)的是,Python和NLTK讓您可以收拾這個(gè)爛攤子。在清單7中,RssItem類(lèi)的normalized_words方法可以處理所有這些問(wèn)題。請(qǐng)?zhí)貏e注意NLTK如何只使用一行代碼就能夠清潔嵌入式HTML標(biāo)記的原始文章文本!使用一個(gè)正則表達(dá)式刪除標(biāo)點(diǎn),然后每個(gè)單詞被拆分,并規(guī)范化為小寫(xiě)。

清單7.RssItem類(lèi)

classRssItem:

...

regex=re.compile('[%s]'%re.escape(string.punctuation))

...

defnormalized_words(self,article_text):

words=[]

oneline=article_text.replace('','')

cleaned=nltk.clean_html(oneline.strip())

toks1=cleaned.split()

fort1intoks1:

translated=self.regex.sub('',t1)

toks2=translated.split()

fort2intoks2:

t2s=t2.strip().lower()

ifself.stop_words.has_key(t2s):

pass

else:

words.append(t2s)

returnwords

只需這一行代碼就可以從NLTK獲得停用詞列表;并且還支持其他自然語(yǔ)言:

nltk.corpus.stopwords.words('english')

NLTK還提供了一些“詞干分析器”類(lèi),以便進(jìn)一步規(guī)范化單詞。請(qǐng)查看有關(guān)詞干、詞形歸并、句子結(jié)構(gòu)和語(yǔ)法的NLTK文檔,了解有關(guān)的更多信息。

使用NaiveBayes算法進(jìn)行分類(lèi)

算法在NLTK中被廣泛使用并利用nltk.NaiveBayesClassifier類(lèi)實(shí)現(xiàn)。Bayes算法根據(jù)特性在其數(shù)據(jù)集中的每個(gè)存在或不存在對(duì)項(xiàng)目進(jìn)行分類(lèi)。在RSS提要項(xiàng)目的情況下,每一個(gè)特性都是自然語(yǔ)言的一個(gè)給定的(清潔過(guò)的)單詞。該算法是“樸實(shí)”的,因?yàn)樗僭O(shè)特性(在本例中,單詞)之間沒(méi)有任何關(guān)系。

然而,英語(yǔ)這種語(yǔ)言包含超過(guò)250,000個(gè)單詞。當(dāng)然,我不希望為了將RSS提要項(xiàng)目傳遞給算法就要為每個(gè)RSS提要項(xiàng)目創(chuàng)建一個(gè)包含250,000個(gè)布爾值的對(duì)象。那么,我會(huì)使用哪些單詞?簡(jiǎn)單來(lái)說(shuō),答案是在培訓(xùn)數(shù)據(jù)組中除了停用詞之外最常見(jiàn)的單詞。NLTK提供了一個(gè)優(yōu)秀的類(lèi),即nltk.probability.FreqDist,我可以用它來(lái)識(shí)別這些最常用的單詞。在清單8中,collect_all_words方法返回來(lái)自所有培訓(xùn)文章的所有單詞的一個(gè)數(shù)組。

然后,此數(shù)組被傳遞給identify_top_words方法,以確定最頻繁的單詞。nltk.FreqDist類(lèi)的一個(gè)有用的特性是,它實(shí)質(zhì)上是一個(gè)散列,但是它的鍵按其對(duì)應(yīng)的值或計(jì)數(shù)排序。因此,使用[:1000]Python語(yǔ)法可以輕松獲得最頻繁的1000個(gè)單詞。

清單8.使用nltk.FreqDist類(lèi)

defcollect_all_words(self,items):

all_words=[]

foriteminitems:

forwinitem.all_words:

words.append(w)

returnall_words

defidentify_top_words(self,all_words):

freq_dist=nltk.FreqDist(w.lower()forwinall_words)

returnfreq_dist.keys()[:1000]

對(duì)于利用NLTKReuters文章數(shù)據(jù)模擬的RSS提要項(xiàng)目,我需要確定每個(gè)項(xiàng)目的類(lèi)別。為此,我讀取前面提到的~/nltk_data/corpora/reuters/cats.txt文件。用Python讀取一個(gè)文件非常簡(jiǎn)單,如下所示:

defread_reuters_metadata(self,cats_file):

f=open(cats_file,'r')

lines=f.readlines()

f.close()

returnlines

接下來(lái)的步驟是獲得每個(gè)RSS提要項(xiàng)目的特性。RssItem類(lèi)的features方法(如下所示)可以做到這一點(diǎn)。在該方法中,在文章中的all_words數(shù)組首先被減少到一個(gè)較小的set對(duì)象,以消除重復(fù)的單詞。然后會(huì)遍歷top_words,并在該set中進(jìn)行比較,確定是否存在重復(fù)的單詞。隨后返回1000個(gè)布爾值組成的一個(gè)散列,以w_為鍵,后面是單詞本身。這個(gè)Python非常簡(jiǎn)潔。

deffeatures(self,top_words):

word_set=set(self.all_words)

features={}

forwintop_words:

features["w_%s"%w]=(winword_set)

returnfeatures

接下來(lái),我收集了訓(xùn)練集的RSS提要項(xiàng)目和它們各自的特性,并將它們傳遞給算法。清單9中的代碼演示了這個(gè)任務(wù)。請(qǐng)注意,分類(lèi)器被訓(xùn)練成為只有一行代碼。

清單9.訓(xùn)練nltk.NaiveBayesClassifier

defclassify_reuters(self):

...

training_set=[]

foriteminrss_items:

features=item.features(top_words)

tup=(features,item.category)#tupisa2-elementtuple

featuresets.append(tup)

classifier=nltk.NaiveBayesClassifier.train(training_set)

NaiveBayesClassifier在運(yùn)行中的Python程序的內(nèi)存中,它現(xiàn)在是經(jīng)過(guò)訓(xùn)練的。現(xiàn)在,我只需遍歷需要進(jìn)行分類(lèi)的RSS提要項(xiàng)目集,并要求分類(lèi)器猜測(cè)每個(gè)項(xiàng)目的類(lèi)別。這很簡(jiǎn)單。

foriteminrss_items_to_classify:

features=item.features(top_words)

category=classifier.classify(feat)

變得不那么樸實(shí)

如前所述,算法假設(shè)每個(gè)特性之間是沒(méi)有關(guān)系的。因此,像"machinelearning"和"learningmachine",或者"NewYorkJet"和"jettoNewYork"這樣的短語(yǔ)是等效的(to是一個(gè)停用詞)。在自然的語(yǔ)言上下文中,這些單詞之間有明顯的關(guān)系。所以,我怎么會(huì)讓算法變得“不那么天真”,并識(shí)別這些單詞的關(guān)系?

其中一個(gè)技巧是在特性集內(nèi)包括常見(jiàn)的雙字詞(兩個(gè)單詞為一組)和三字詞(三個(gè)單詞為一組)。NLTK以nltk.bigrams(...)和nltk.trigrams(...)的形式對(duì)此提供了支持,現(xiàn)在我們對(duì)此應(yīng)該不再感到驚訝了。正如可以從訓(xùn)練數(shù)據(jù)組收集最常用的n個(gè)單詞那樣,也可以識(shí)別最常用的雙字詞和三字詞,并將它們用作特性。

您的結(jié)果會(huì)有所不同

對(duì)數(shù)據(jù)和算法進(jìn)行完善是一門(mén)藝術(shù)。您是否應(yīng)該進(jìn)一步規(guī)范化單詞集,也許應(yīng)該包括詞根?或者包括超過(guò)1000個(gè)最常用單詞?少一點(diǎn)是否合適?或者是否應(yīng)該使用更大的訓(xùn)練數(shù)據(jù)集?是否應(yīng)該添加更多信用詞或“停用詞根”?這些都是您要問(wèn)自己的正確問(wèn)題。使用它們進(jìn)行實(shí)驗(yàn),通過(guò)試錯(cuò)法,您可以會(huì)為您的數(shù)據(jù)實(shí)現(xiàn)最佳算法。我發(fā)現(xiàn),85%是一個(gè)很好的分類(lèi)成功率。

利用k-NearestNeighbors算法提出建議

客戶(hù)希望顯示在選定類(lèi)別或相似類(lèi)別中的RSS提要項(xiàng)目。現(xiàn)在,這些項(xiàng)目已經(jīng)用NaiveBayes算法進(jìn)行分類(lèi),這一要求的第一部分已得到了滿足。較難的部分是實(shí)現(xiàn)“或相似類(lèi)別”的要求。這是機(jī)器學(xué)習(xí)建議器系統(tǒng)開(kāi)始發(fā)揮作用的地方。建議器系統(tǒng)根據(jù)其他項(xiàng)目的相似性來(lái)建議一個(gè)項(xiàng)目。Amazon.com的產(chǎn)品建議和Facebook的朋友建議就是此功能的很好的示例。

k-NearestNeighbors(kNN)是最常用的建議算法。思路是向它提供一組標(biāo)簽(即類(lèi)別),并且每個(gè)標(biāo)簽都對(duì)應(yīng)一個(gè)數(shù)據(jù)集。然后,該算法對(duì)各數(shù)據(jù)集進(jìn)行了比較,以識(shí)別相似的項(xiàng)目。數(shù)據(jù)集由多個(gè)數(shù)值數(shù)組構(gòu)成,數(shù)值的范圍往往被規(guī)范化為從0到1。然后,它可以從數(shù)據(jù)集識(shí)別相似的標(biāo)簽。與只產(chǎn)生一個(gè)結(jié)果的NaiveBayes不同,kNN可以產(chǎn)生一個(gè)有排名的列表,其中包含若干(即,k的值)個(gè)建議。

我發(fā)現(xiàn),建議器算法比分類(lèi)算法更容易理解和實(shí)現(xiàn),但對(duì)于本文來(lái)說(shuō),其代碼過(guò)于冗長(zhǎng),并且有復(fù)雜的數(shù)學(xué),無(wú)法在這里詳述。請(qǐng)參閱由Manning出版的一本很好的新書(shū)MachineLearninginAction,獲取kNN編碼示例(請(qǐng)參閱參考資料中的鏈接)。在RSS提要項(xiàng)目實(shí)現(xiàn)的過(guò)程中,標(biāo)簽值是項(xiàng)目類(lèi)別,而數(shù)據(jù)集是最常用的1000個(gè)單詞的值數(shù)組。同樣,在構(gòu)建這個(gè)數(shù)組時(shí),一部分屬于科學(xué)范疇,一部分屬于數(shù)學(xué)范疇,還有一部分屬于藝術(shù)范疇。在數(shù)組中,每個(gè)單詞的值都可以是簡(jiǎn)單的0或1的布爾值、文章中單詞出現(xiàn)次數(shù)的百分比、該百分比的指數(shù)值,或一些其他值。

結(jié)束語(yǔ)

探索Python、NLTK和機(jī)器學(xué)習(xí)一直是一個(gè)有趣的、令人愉快的經(jīng)驗(yàn)。Python語(yǔ)言強(qiáng)大而又簡(jiǎn)潔,現(xiàn)在已成為我的開(kāi)發(fā)工具包的核心部分。它非常適合于機(jī)器學(xué)習(xí)、自然語(yǔ)言和數(shù)學(xué)/科學(xué)應(yīng)用程序。雖然本文中并沒(méi)有提到,但我還發(fā)現(xiàn)Python對(duì)于圖表和繪圖非常有用。

以上內(nèi)容為大家介紹了探索Python、機(jī)器學(xué)習(xí)和NLTK庫(kù),希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注多測(cè)師。http://www.dietsnews.net/

聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
請(qǐng)您保持通訊暢通,專(zhuān)屬學(xué)習(xí)老師24小時(shí)內(nèi)將與您1V1溝通
免費(fèi)領(lǐng)取
今日已有369人領(lǐng)取成功
劉同學(xué) 138****2860 剛剛成功領(lǐng)取
王同學(xué) 131****2015 剛剛成功領(lǐng)取
張同學(xué) 133****4652 剛剛成功領(lǐng)取
李同學(xué) 135****8607 剛剛成功領(lǐng)取
楊同學(xué) 132****5667 剛剛成功領(lǐng)取
岳同學(xué) 134****6652 剛剛成功領(lǐng)取
梁同學(xué) 157****2950 剛剛成功領(lǐng)取
劉同學(xué) 189****1015 剛剛成功領(lǐng)取
張同學(xué) 155****4678 剛剛成功領(lǐng)取
鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
董同學(xué) 138****2867 剛剛成功領(lǐng)取
周同學(xué) 136****3602 剛剛成功領(lǐng)取
相關(guān)推薦HOT
有Java基礎(chǔ)的學(xué)習(xí)python應(yīng)該注意些什么

首先,對(duì)于具有Java編程基礎(chǔ)的人來(lái)說(shuō),學(xué)習(xí)Python的初期并不會(huì)遇到太大的障礙,但是要結(jié)合自己的發(fā)展規(guī)劃來(lái)制定學(xué)習(xí)規(guī)劃,尤其要重視學(xué)習(xí)方向的...詳情>>

2023-11-06 06:25:27
Python 定時(shí)修改數(shù)據(jù)庫(kù)

當(dāng)需要定時(shí)修改數(shù)據(jù)庫(kù)時(shí),一般我們都選擇起一個(gè)定時(shí)進(jìn)程去改庫(kù)。如果將這種定時(shí)任務(wù)寫(xiě)入業(yè)務(wù)中,寫(xiě)成一個(gè)接口呢,定時(shí)進(jìn)程顯得有些不太合適?如...詳情>>

2023-11-06 06:03:51
Python有哪些常用函數(shù)?

Python常用函數(shù)有哪些?我想大家都比較好奇這個(gè)問(wèn)題,今天小編特地整理了一篇有關(guān)Python常用函數(shù)的相關(guān)內(nèi)容,接下來(lái)我們一起來(lái)看看具體的內(nèi)容介...詳情>>

2023-11-06 05:49:27
Python常用的三大開(kāi)源框架

眾所周知,Python是一種腳本語(yǔ)言,具有易學(xué)、語(yǔ)法清晰、易維護(hù)等優(yōu)點(diǎn),而且具有豐富和強(qiáng)大的庫(kù),被稱(chēng)作為膠水語(yǔ)言。Python語(yǔ)言誕生較早,經(jīng)過(guò)多...詳情>>

2023-11-06 05:35:03
Python算法是什么?有哪幾類(lèi)?

了解Python的人應(yīng)該都聽(tīng)說(shuō)過(guò)Python算法,但是它們的類(lèi)型和定義并不是很清楚,那么你知道什么是算法嗎?Python算法有哪些類(lèi)型?讓我們通過(guò)這篇文章...詳情>>

2023-11-06 05:31:27
主站蜘蛛池模板: 女人与大拘交在线播放| 欧美videosdesexo肥婆| 87福利网| 国产凌凌漆国语| 四虎1515hh丶com| 波多野结衣之双调教hd| 国产精品久久国产精品99| h视频免费观看| 波多吉衣| 印度精品性hd高清| 欧美三级黄色大片| 美女张开双腿让男生捅| 交换人生电影在线| 欧美一级特黄aa大片在线观看免费 | 亚洲清纯| 国产粉嫩嫩00在线正在播放| 农夫山泉有点甜高清2在线观看| 玉蒲团之风雨山庄| 男人操女人免费视频| 一线在线观看全集免费高清中文 | 久久精品99香蕉国产| 中文字幕一区二区三| 青青伊人精品| 欧美黑人xxxx性高清版| 国产小视频网站| 男人的j插入女人的p| 亚洲一级毛片免费在线观看| 欧美日韩在线一区二区三区| 69精品久久久久| 久久精品麻豆日日躁夜夜躁 | 国产亚洲欧美日韩俺去了| 1024你懂的国产精品| 国产精品成人久久久久久久| 台湾三级全部播放| 里番acg全彩本子| 骚虎影院在线观看| 日本三级高清| 国产午夜视频高清| 中文字幕第9页萱萱影音先锋| 欧美天堂视频| 亚洲一区二区三区免费观看|