Esplori Python, Maŝino Lernado Biblioteko kaj NLTK
Disvolvi apliko categorizar RSS uzante Python, NLTK kaj maŝina lerno
Resumo:
La maŝino lernado, kiu estas cxe la komunaĵo de IT, matematiko kaj
natura lingvo, estas ĝenerale uzata en granda datumoj aplikoj. Ĉi tiu artikolo diskutas la programlingvo Pitono kaj NLTK vian bibliotekon kaj aplikas ilin al maŝino-lernado projekto.
Dato: 30/Out/2012
Nivelo: Intera
Ankaŭ disponebla en: English
Aktiveco: 1748 vizitoj
Komentoj: 0 (Visualizar | Incluir comentário - Conectar)
Nivelo: Intera
Ankaŭ disponebla en: English
Aktiveco: 1748 vizitoj
Komentoj: 0 (Visualizar | Incluir comentário - Conectar)
La defio: Uzante maŝino lerni categorizar RSS
Ĵus, mi komisiis kun kreante subsistemo categorización de RSS por kliento. La celo estis legi dekojn aŭ eĉ centoj de RSS kaj aŭtomate categorizar la diversaj artikoloj en unu el dekoj da predefinido temo areoj. La enhavo, navigado kaj serĉo funkciaro de la kliento de afiŝinto baziĝus sur la rezultoj de reakiro kaj categorización, aŭtomata ĉiutaga nutrado.
La kliento sugestis uzi maŝino lernado, eble kun Apache mahout kaj Hadoop ĉar ŝi ĵus legis artikolojn pri tiuj teknologioj. Tamen, ilia evoluo teamo kaj nia estas flua en Ruby anstataŭ Java ™ teknologio. Ĉi tiu artikolo priskribas la veturon tekniko, procezo de lernado kaj fina efektivigo de solvaĵo.
Kio estas maŝino lernado?
Mia unua demando estis: "Kion ekzakte estas maŝino lernado?". Mi aŭdis la terminon kaj sciis malprecize ke la IBM supercomputadora Vatsono ® uzis por venki homaj partoprenantoj en ludo de Jeopardy. Buyer Kiel partoprenanto kaj sociaj retoj, mi ankaŭ sciis ke Amazon.com kaj Facebook estas grandaj rekomendojn (produkto kaj homoj) bazitaj sur datumoj de aĉetantoj. En resumo, maŝino lernado estas la komunaĵo de IT, matematiko kaj natura lingvo. Estas rilataj ĉefe al tiuj tri temoj, sed la solvo al la kliento eventuale impliki la unua du:
Komprenante kio maŝino lernado, la sekva paŝo estis determini kiom apliki. Kiel la kliento sugestas, mahout estis bona deirpunkto. Mi elŝutis la kodon de Apache kaj eklernis pri maŝino lernado kun mahout kaj lia frato, Hadoop. Bedaŭrinde, mi trovis ke mahout havas krutajn lernado kurbo, eĉ por sperta Java programisto, kaj ke ne estis funkcia specimeno kodo. Estis ankaŭ ne strukturoj aŭ gemojn por Ruby-bazita maŝino lernado.
Finding Python kaj NLTK
Mi konservis serĉas solvon kaj ĉiam trovis "Python" en la rezulto aro. Kiel Rubeno programisto, mi sciis estis Python programlingvo simila (objektema, teksto-bazita, interpretita kaj dinamika), sed mi ne lernis la lingvon. Malgraŭ ĉi tiuj similecoj, mi ne tedis lerni Python tra la jaroj, kiel kvalifiko konsideras superfluaj. Python estis en mia "blinda punkto" kiel mi kredas ke devus esti por multaj kolegoj de Ruby.
Serĉante libroj sur maŝino lernado kaj profundigo mi en ĝia enhavo, mi malkovris ke granda procento de tiuj sistemoj uzas Python kiel la efektivigo lingvo kune kun biblioteko nomita Natura Lingvo Toolkit (NLTK). Aliaj serĉoj ke relevaram Python estis pli populara ol mi pensis - ekz, Google App Engine, YouTube kaj retejoj kreitaj kun la Django kadro. Do estas antaŭ-instalita sur la laborstacioj Mac OS X, kiun mi uzas ĉiutage! Cetere, Python norma biblioteko proponas interesan (ekz. NumPy kaj SciPy) por Y, la scienco kaj inĝenierado. Kiu sciis?
Mi decidis serĉi solvon en Python post trovi ekzemplojn de eleganta kodo. La sekva linio, ekzemple, estas tuta kodo bezonis legi RSS-servo per HTTP kaj presi la enhavo:
Sciante Python
Kiam lerni novan lingvon de programado, la facila parto estas kutime lernas la lingvon mem. La malmola parto lernas lia ekosistemo - kiel instali, inkluzive bibliotekoj, skribi kodon, strukturigi vian kodo dosieroj, kuri, debug, kaj skribu unueco provoj. Tiu sekcio enhavas mallongan enkondukon al tiuj temoj. Kontrolu Rimedoj por ligiloj al pli da informoj.
Pip
La Python Pako Indekso (
Por vidi liston de Python bibliotekoj instalitaj en via sistemo, kuri jena ordono:
Kurante programoj
Kuri Python programo estas same simpla. Donita programo nomata locomotive_main.py kaj tri argumentojn, ni kompilos kaj ekzekuti la programon kun
Pitono uzas la sintakson
Kantoj 1. Detekto de ĉefaj
virtualenv
Plej Rubeno programistoj konas la temon de sistemo bibliotekoj aŭ gemoj. Aro de bibliotekoj por la tuta sistemo ne estas ideala, ĉar unu el la projektoj povas dependi de la versio 1.0.0 de iu biblioteko, dum alia projekto dependas versio 1.2.7. Simile, Java programistoj konata problemo kun ĉi tiu sistemo Classpath. Kiel la Rubeno komunumo kun la ilo
Kantoj 2. Komandoj por krei virtualan medion kun virtualenv
Vi devas reakiri la skripto aktivigo de la virtuala medio vojo "fonto" ĉiufoje kiam vi laboras kun la projekto en ŝela fenestro. Notu ke la komand-linio shell script ŝanĝas kiam la aktivigo estas restaŭrita. Por krei kaj uzi fenestroj konko en la sistemo por pli facile navigi al via projekto dosierujon kaj aktivigi la virtuala medio, ĝi povas esti utila por inkludi eniro kiel la sekva en via ~ /. Bash_profile dosiero:
La strukturo de la kodo bazo
Post pasi programoj per simpla "Saluton Mondo" unu linio de Python programistoj bezonas por kompreni kiel bone strukturigi vian kodo bazon rilate dosierujoj kaj dosierujaj nomoj. Java kaj Ruby havas siajn proprajn kondiĉojn por tio, kaj Python estas malsama. Mallonge, Python uzas la koncepton de pakoj kolekti rilatantaj kodo kaj krei nomspacoj senduba. Por pruvo intencoj en ĉi tiu artikolo, la kodo estas en la radiko de iu projekto, kiel ~ / p1. En tiu ĉi dosierujo ekzistas dosierujo lokomotivo por la Python pako de la sama nomo. Listing 3 montras ĉi dosierujo strukturo.
Kantoj 3. Directory strukturo ekzemplo
Rimarku la dosierojn kun la stranga nomo de __ init__.py. Tiuj dosieroj diru la Python ŝarĝi la necesajn bibliotekojn por la pako dosierojn kaj apliko kodo kiu estas specifa al la sama dosierujo. Listing 4 montras la enhavon de la lokomotivo / __ init__.py.
Kantoj 4. lokomotivo / __ init__.py
Kun la lokomotivo pako strukturita kiel en Listing 4 , la ĉefaj programoj en la radika dosierujo de la projekto povas importi ĝin kaj uzi ĝin. Ekzemple, la dosiero locomotive_main.py enhavas la sekvajn importoj:
Testo
La norma biblioteko
Kantoj 5. Pitono unittest
La kodo en Listing 5 ankaŭ evidentigas diferencante karakterizaĵo de Python: ĉiuj kodo devus esti dentado konsekvence, aŭ ne kompili sukcese. La metodo
Ilo kit
Kion mi vere bezonis estis integrita disvolviĝo medio (IDE) kun sintaksa kolorigo, kodo finaĵon kaj depuración funcionalidad Haltpunkto helpi en lerni Python. Kiel uzanto de la Eklipso IDE por Java disvolviĝo, la plug-in
Kun bazaj scioj de Python kaj lia ekosistemo, estis tempo por komenci realiganta la solvo de maŝino lernado.
Implementando categorización kun Python kaj NLTK
Apliki la solvon, oni devis kapti RSS simulita, pura teksto, uzu
Kaptante kaj analizi feeds
La projekto havis specialan defio: la kliento ankoraux ne starigis liston de RSS kiu estus celoj. Sekve, ne estis "trejnado datumoj". Sekve, la nutrado kaj la trejnado datumoj devis esti simulita dum frua evoluo.
La unua alproksimiĝo mi uzis por akiri specimenon datumoj simple serĉas liston de RSS nutras precizigita en teksta dosiero. Pitono biblioteko proponas bonan analizon de RSS, nomita
Kantoj 6. La klaso CaptureFeeds
La sekva paŝo estis surprize defia. Nun mi nutros datumoj specimeno, estis necese klasifiki ilin por uzo kiel trejnado datumoj. Datumoj de la trejnado datuma aro estas donita al la categorización algoritmo por ke ĝi povu lerni.
Ekzemple, la specimeno nutras ke mi uzis inkludis ESPN, la Sports Reto. Unu el flueroj parolis pri la transigo de Tim Tebow, la teamo de futbalo Denver Malafablaj, la New York Jetoj dum la Malafablaj estis dungita Peyton Manning esti lia nova antaŭa. Alia listero pri la rezultoj de la nutrado estis pri la entrepreno kaj lia nova Boeing jeto. La demando estas: kio specifa kategorio valoro devas esti atribuita al la unua artikolo? La valoroj
Ĝi baldaŭ evidentiĝis, ke mi bezonis pli datumojn por labori, kaj oni devis jam esti _categorized_ - kaj precizeco. Kie mi trovas ĉi datumoj? Jen venas la Python NLTK. Krom esti bonega biblioteko por vorto prilaborado, ĝi eĉ venas kun specimeno datenaroj por malŝarĝi, aŭ korpuso en lia terminologio, kaj apliko programado interfaco por facile aliri la elŝutitaj datumoj. Por instali la Reuters korpuso, ruli la komandojn sube. Super 10.000 gazetaro artikoloj estos kopiitaj al la dosierujo ~ / nltk_data / korpusoj / Reuters /. Ĝuste kiel la RSS-flueroj, ĉiu Reuters artikolo enhavas titolo kaj korpo, tiel ke datumoj antaŭ-_categorized_ NLTK estas bonegaj kampoj por simuli RSS.
De aparta intereso estas la dosiero ~ / nltk_data / korpusoj / Reuters / cats.txt. Ĝi enhavas liston de nomoj de arkivoj kaj eron kategorio atribuita al ĉiu el ili. La dosiero havas la jena formato, do la artikolo sur dosiero en la subdosierujo testo 14828 temo apartenas al la
Naturaj lingvoj estas malklara
La kruda enigo algoritmo categorización de RSS estas evidente skribita teksto en la angla. Estas vere malpura.
Angla, aŭ iu ajn alia natura lingvo (te lingvoj parolataj aŭ komuna) estas tre malregula kaj malpreciza el la vidpunkto de komputila prilaborado. Unue, tie estas la demando de la distingo inter majuskloj kaj minuskla. La vorto egalas Malafabla Malafabla? La respondo estas eble. Tiam estas la problemo de interpunkcio kaj spacoj. La termino Malafabla. Egalas Malafabla aŭ Malafabla,? Pli aŭ malpli. Plie, estas pluralo kaj similaj vortoj. Kuru, kurante, kaj kuris ekvivalento? Nu, tio dependas. La tri vortoj havas komunan radikon. Kaj se ni havas naturan lingvon estas integritaj en markado lingvo kiel HTML? En ĉi tiu kazo, estus necesa por manipuli tekston
Feliĉe, Python kaj NLTK permesi purigi ĉi salato. La metodo
Kantoj 7. La klaso RssItem
La listo de stopwords venis de NLTK kun jena linio de kodo. Estas apogo por aliaj naturaj lingvoj:
NLTK ankaŭ ofertas plurajn klasojn "lematizadoras" por normaligi eĉ pli vortoj. Vidu la dokumentado sur la NLTK devenaj, frazo strukturo kaj gramatiko por pli informo.
Klasifiko kun Naiva Bayes algoritmo
Naiva Bayes algoritmo estas larĝe uzata kaj implementado en NLTK kun klaso
Tamen, la angla enhavas pli ol 250.000 vortojn. Mi certe ne volas devi krei Bulea objekto enhavas 250.000 por ĉiu RSS ero pasi al la algoritmo. Do kio vortoj mi uzas? Mallonge, la respondo estas la plej uzataj vortoj en la loĝantaro de la trejnado datumoj kiuj ne stopwords. NLTK havigas klaso excepciona,
Tiu tabelo estas pasita al la metodo
Kantoj 8. Uzante la klaso nltk.FreqDist
Por RSS feed items kun simulita datumoj de la NLTK artikoloj de Reuters, mi bezonas por identigi la kategorioj de ĉiu ero. Por tio, mi legis la dosieron ~ / nltk_data / korpusoj / Reuters / cats.txt menciita antaŭe. Legante dosieron kun Python estas simpla:
La sekva paŝo estas akiri la rimedojn por ĉiu ero de RSS. La metodo
Tiam mi enspezi trejnado aro de eroj de RSS kaj iliaj individuaj trajtoj kaj paŝo al la algoritmo. La kodo en Listing 9 montras tiun taskon. Notu ke la imposto estas trejnita en akurate unu linio de kodo.
Kantoj 9. Trejnado nltk.NaiveBayesClassifier
La
Getting malpli naiva
Kiel deklaris antaŭe, la algoritmo supozas ke ne ekzistas rilato inter la individuaj rimedoj. Do frazoj kiel "maŝina lerno" kaj "lerni maŝino" aŭ "Nova Jorko Jeto" kaj "jeto al Nov-Jorko," estas ekvivalento (al estas stopword). En la kunteksto de natura lingvo, estas evidenta rilato inter tiuj vortoj. Do kiel mi povas instrui la algoritmo esti "malpli naiva" kaj rekoni tiujn rilatojn inter vortoj?
Unu tekniko estas por inkludi la komuna bigrams (du grupoj de vortoj) kaj trigrams (grupoj de tri vortoj) en la aro de trajtoj. Ne surprize, la NLTK havas subtenon por tio en la formo de la funkcioj
La rezultoj varias
Rafini datumojn kaj la algoritmo estas arto. Ni cetere normaligi la aro de vortoj, eble kun devenaj? Aŭ inkluzivas pli ol 1.000 ŝlosilaj vortoj? Malpli? Aŭ uzas aron de trejnado datumoj pli? Inkludi pli stopwords aŭ "ĉesi-gramoj"? Ĉi tiuj estas ĉiuj validaj demandoj. Eksperimento kun ili kaj, tra provo kaj eraro, vi atingos la plej bona algoritmo por viaj datumoj. Mi rimarkis, ke 85% estas bona kurzo de sukcesa categorización.
Rekomendo kun la k-proksima Najbaroj
La kliento volis montri erojn de RSS en selektita kategorio aŭ similaj kategorioj. Nun ke la eroj estis klasifikitaj kun Naiva Bayes algoritmo, la unua parto de la postulo estis donacita. La plej malfacila parto estis realigi la postulo "aŭ similaj kategorioj." Tie estas kie la sistemoj rekomendoj de maŝino lernado. Sistemoj rekomendi artikolon rekomendoj bazitaj sur simileco inter aliaj celoj. La produkto rekomendoj de Amazon.com kaj amikoj en Facebook estas bonaj ekzemploj de ĉi funkciojn.
k-proksima Najbaroj (kNN) algoritmo estas la plej komuna rekomendo. La ideo estas proponi aron de etiketoj (tio, kategorioj) kaj aro de datumoj responda al ĉiu el ili. Tiam, la algoritmo komparas datenaroj identigi similajn objektojn. La datumoj aro konsistas tabeloj de nombraj valoroj, kutime en ununormigita limigo 0 al 1. Ĝi povas tial identigi simila etiketoj en aroj. Kontraste naiva Bayes, kiu produktas nur rezulto, kNN povas produkti ordo listo de rekomendoj (te, la valoro de k).
Mi pensis la rekomendo algoritmoj simple kompreni kaj apliki la algoritmoj por la klasifiko, kvankam la kodo kaj lia matematika komplekseco estas tro granda por inkludi tie. Vidu la bonegan novan libron de Manning, Maŝino Lernado en aktivo, por vidi specimenon kodo kNN (vidu Rimedoj por ligilon). En la kazo de la efektivigo de RSS feed items, valoroj estis etikedita ero kategorioj kaj la datuma aro estis tabelo kun la valoroj de ĉiu de la 1.000 ŝlosilaj vortoj. Denove, kreante ke tabelo engaĝas scienco, matematikoj kaj arto. La valoroj de ĉiu vorto en la tabelo povas esti nulo aŭ simpla bulea, procentoj de spritaĵoj de vortoj en la artikolo, eksponenta valoro de ĉi tiu procento aŭ alian valoron.
Konkludo
Discover Python, NLTK kaj maŝina lerno estis interesa kaj agrabla sperto. La Python lingvo estas efika kaj konciza kaj estas parto de mia ilaro programisto nun. Ĝi taŭgas por aplikoj de maŝina lerno, natura lingvo math / scienco. Kvankam ne estas menciita en tiu artikolo, ankaŭ trovos ĝin utila por grafikaĵoj kaj konspiras. Se Python estis ankaŭ en via blinda makulo, mi sugestas ke vi rigardu en tiu lingvo.
Signifas
Lernu
Ĵus, mi komisiis kun kreante subsistemo categorización de RSS por kliento. La celo estis legi dekojn aŭ eĉ centoj de RSS kaj aŭtomate categorizar la diversaj artikoloj en unu el dekoj da predefinido temo areoj. La enhavo, navigado kaj serĉo funkciaro de la kliento de afiŝinto baziĝus sur la rezultoj de reakiro kaj categorización, aŭtomata ĉiutaga nutrado.
La kliento sugestis uzi maŝino lernado, eble kun Apache mahout kaj Hadoop ĉar ŝi ĵus legis artikolojn pri tiuj teknologioj. Tamen, ilia evoluo teamo kaj nia estas flua en Ruby anstataŭ Java ™ teknologio. Ĉi tiu artikolo priskribas la veturon tekniko, procezo de lernado kaj fina efektivigo de solvaĵo.
Kio estas maŝino lernado?
Mia unua demando estis: "Kion ekzakte estas maŝino lernado?". Mi aŭdis la terminon kaj sciis malprecize ke la IBM supercomputadora Vatsono ® uzis por venki homaj partoprenantoj en ludo de Jeopardy. Buyer Kiel partoprenanto kaj sociaj retoj, mi ankaŭ sciis ke Amazon.com kaj Facebook estas grandaj rekomendojn (produkto kaj homoj) bazitaj sur datumoj de aĉetantoj. En resumo, maŝino lernado estas la komunaĵo de IT, matematiko kaj natura lingvo. Estas rilataj ĉefe al tiuj tri temoj, sed la solvo al la kliento eventuale impliki la unua du:
- Taksado. Asignu artikoloj arbitrajn predefinido kategorioj bazitaj sur aro de trejnado datumoj de similaj artikoloj
- Rekomendo. Rekomendi artikoloj bazita sur observo de similaj artikoloj
- Clustering. Identigu subgrupoj en loĝantaro de datumoj
Komprenante kio maŝino lernado, la sekva paŝo estis determini kiom apliki. Kiel la kliento sugestas, mahout estis bona deirpunkto. Mi elŝutis la kodon de Apache kaj eklernis pri maŝino lernado kun mahout kaj lia frato, Hadoop. Bedaŭrinde, mi trovis ke mahout havas krutajn lernado kurbo, eĉ por sperta Java programisto, kaj ke ne estis funkcia specimeno kodo. Estis ankaŭ ne strukturoj aŭ gemojn por Ruby-bazita maŝino lernado.
Finding Python kaj NLTK
Mi konservis serĉas solvon kaj ĉiam trovis "Python" en la rezulto aro. Kiel Rubeno programisto, mi sciis estis Python programlingvo simila (objektema, teksto-bazita, interpretita kaj dinamika), sed mi ne lernis la lingvon. Malgraŭ ĉi tiuj similecoj, mi ne tedis lerni Python tra la jaroj, kiel kvalifiko konsideras superfluaj. Python estis en mia "blinda punkto" kiel mi kredas ke devus esti por multaj kolegoj de Ruby.
Serĉante libroj sur maŝino lernado kaj profundigo mi en ĝia enhavo, mi malkovris ke granda procento de tiuj sistemoj uzas Python kiel la efektivigo lingvo kune kun biblioteko nomita Natura Lingvo Toolkit (NLTK). Aliaj serĉoj ke relevaram Python estis pli populara ol mi pensis - ekz, Google App Engine, YouTube kaj retejoj kreitaj kun la Django kadro. Do estas antaŭ-instalita sur la laborstacioj Mac OS X, kiun mi uzas ĉiutage! Cetere, Python norma biblioteko proponas interesan (ekz. NumPy kaj SciPy) por Y, la scienco kaj inĝenierado. Kiu sciis?
Mi decidis serĉi solvon en Python post trovi ekzemplojn de eleganta kodo. La sekva linio, ekzemple, estas tuta kodo bezonis legi RSS-servo per HTTP kaj presi la enhavo:
feedparser.parse print ("http://feeds.nytimes.com/nyt/rss/Technology")
|
Sciante Python
Kiam lerni novan lingvon de programado, la facila parto estas kutime lernas la lingvon mem. La malmola parto lernas lia ekosistemo - kiel instali, inkluzive bibliotekoj, skribi kodon, strukturigi vian kodo dosieroj, kuri, debug, kaj skribu unueco provoj. Tiu sekcio enhavas mallongan enkondukon al tiuj temoj. Kontrolu Rimedoj por ligiloj al pli da informoj.
Pip
La Python Pako Indekso (
pip
) estas la defaŭlta pakaĵa administrilo por Pitono. Ĝi estas la programo uzita por inkluzivi bibliotekoj en la sistemo. Ĝi estas analoga al la gemoj de Ruby bibliotekoj. Por inkludi la NLTK biblioteko en la sistemo, la uzanto enigas la sekva komando: $ Pip instalon nltk
|
Por vidi liston de Python bibliotekoj instalitaj en via sistemo, kuri jena ordono:
$ Pip freeze
|
Kurante programoj
Kuri Python programo estas same simpla. Donita programo nomata locomotive_main.py kaj tri argumentojn, ni kompilos kaj ekzekuti la programon kun
python
: $ Python locomotive_main.py arg1 arg2 arg3
|
Pitono uzas la sintakson
if __name__ == "__main__":
en kantoj 1 determini se la dosiero estas kurante en la komanda linio aŭ esti importitaj de aliaj kodo. Fari plenumebla dosiero, inkluzive de la detekto de "__main__"
. Kantoj 1. Detekto de ĉefaj
importado sys importado tempo importado lokomotivo se __ name__ == "__main__": start_time = time.time () se len (sys.argv)> 1: locomotive.app.Application programo = () ... pliaj logiko ... |
virtualenv
Plej Rubeno programistoj konas la temon de sistemo bibliotekoj aŭ gemoj. Aro de bibliotekoj por la tuta sistemo ne estas ideala, ĉar unu el la projektoj povas dependi de la versio 1.0.0 de iu biblioteko, dum alia projekto dependas versio 1.2.7. Simile, Java programistoj konata problemo kun ĉi tiu sistemo Classpath. Kiel la Rubeno komunumo kun la ilo
rvm
, la komunumo uzas la Python ilo virtualenv
(vidu Rimedoj por ligilon) por krei apartajn ekzekuto medioj, inkludante specifaj versioj de Python kaj aro de bibliotekoj. La komandoj en Listing 2 montras kiel krei virtualan medion nomis p1_env p1 por la projekto, kiu enhavas la bibliotekojn feedparser
, numpy
, scipy
kaj nltk
. Kantoj 2. Komandoj por krei virtualan medion kun virtualenv
$ Ŝvitas Pip instali virtualenv $ Cd ~ $ Mkdir p1 $ Cd p1 P1_env $ virtualenv - distribui $ Fonto p1_env/bin/activate (P1_env) [~ / p1] $ Pip instali feedparser (P1_env) [~ / p1] $ Pip instali numpy (P1_env) [~ / p1] $ Pip instalon scipy (P1_env) [~ / p1] $ Pip instalon nltk (P1_env) [~ / p1] $ Pip freeze |
Vi devas reakiri la skripto aktivigo de la virtuala medio vojo "fonto" ĉiufoje kiam vi laboras kun la projekto en ŝela fenestro. Notu ke la komand-linio shell script ŝanĝas kiam la aktivigo estas restaŭrita. Por krei kaj uzi fenestroj konko en la sistemo por pli facile navigi al via projekto dosierujon kaj aktivigi la virtuala medio, ĝi povas esti utila por inkludi eniro kiel la sekva en via ~ /. Bash_profile dosiero:
Alias $ p1 = "cd ~ / p1 fonto p1_env/bin/activate"
|
La strukturo de la kodo bazo
Post pasi programoj per simpla "Saluton Mondo" unu linio de Python programistoj bezonas por kompreni kiel bone strukturigi vian kodo bazon rilate dosierujoj kaj dosierujaj nomoj. Java kaj Ruby havas siajn proprajn kondiĉojn por tio, kaj Python estas malsama. Mallonge, Python uzas la koncepton de pakoj kolekti rilatantaj kodo kaj krei nomspacoj senduba. Por pruvo intencoj en ĉi tiu artikolo, la kodo estas en la radiko de iu projekto, kiel ~ / p1. En tiu ĉi dosierujo ekzistas dosierujo lokomotivo por la Python pako de la sama nomo. Listing 3 montras ĉi dosierujo strukturo.
Kantoj 3. Directory strukturo ekzemplo
locomotive_main.py locomotive_tests.py lokomotivo / __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 |
Rimarku la dosierojn kun la stranga nomo de __ init__.py. Tiuj dosieroj diru la Python ŝarĝi la necesajn bibliotekojn por la pako dosierojn kaj apliko kodo kiu estas specifa al la sama dosierujo. Listing 4 montras la enhavon de la lokomotivo / __ init__.py.
Kantoj 4. lokomotivo / __ init__.py
# Sistemo importoj; ŝarĝoj instalita pakoj importado codecs importado locale importado sys # Apliko importoj; tiuj specifaj ŝarĝo vian *. Py dosieroj importado programo importi kapti importado category_associations klasifiki importado importado rss importado novaĵoj importi rekomendas |
Kun la lokomotivo pako strukturita kiel en Listing 4 , la ĉefaj programoj en la radika dosierujo de la projekto povas importi ĝin kaj uzi ĝin. Ekzemple, la dosiero locomotive_main.py enhavas la sekvajn importoj:
importado sys #> - sistemo biblioteko importado tempo #> - sistemo biblioteko importi lokomotivo #> - kutimo apliko kodo biblioteko en la "lokomotivo" dosierujon |
Testo
La norma biblioteko
unittest
Python estas bona solvo por testado. Por Java programistoj konas JUnit kaj Ruby programistoj konas Testo :: Unueco kadro, kodo unittest
Python en Listing 5 estos pli facile legi. Kantoj 5. Pitono unittest
AppTest klaso (unittest.TestCase): def instalinstrukciojn (self): self.app locomotive.app.Application = () def tearDown (self): pasas test_development_feeds_list def (self): feeds_list self.app.development_feeds_list = () self.assertTrue (len (feeds_list) == 15) self.assertTrue ('feed :/ / news.yahoo.com / rss / stock-merkatoj' en feeds_list) |
La kodo en Listing 5 ankaŭ evidentigas diferencante karakterizaĵo de Python: ĉiuj kodo devus esti dentado konsekvence, aŭ ne kompili sukcese. La metodo
tearDown(self)
povas simili iom stranga, unue. Vi devas esti demandante kial la provo agordi por ĉiam pasos. Vere, ne estis. Tiel estas kiel oni kreas malplenajn metodo en Python. Ilo kit
Kion mi vere bezonis estis integrita disvolviĝo medio (IDE) kun sintaksa kolorigo, kodo finaĵon kaj depuración funcionalidad Haltpunkto helpi en lerni Python. Kiel uzanto de la Eklipso IDE por Java disvolviĝo, la plug-in
pyeclipse
estis la unua ilo kiu mi ekzamenis. Bone funkcias, kvankam malrapida foje. Mi finis renversi en PyCharm IDE, kiu havas ĉion, kion mi bezonas. Kun bazaj scioj de Python kaj lia ekosistemo, estis tempo por komenci realiganta la solvo de maŝino lernado.
Implementando categorización kun Python kaj NLTK
Apliki la solvon, oni devis kapti RSS simulita, pura teksto, uzu
NaiveBayesClassifier
kaj klasifiki kategorioj kun la kNN algoritmo. Ĉiu de ĉi tiuj agoj estas priskribita tie. Kaptante kaj analizi feeds
La projekto havis specialan defio: la kliento ankoraux ne starigis liston de RSS kiu estus celoj. Sekve, ne estis "trejnado datumoj". Sekve, la nutrado kaj la trejnado datumoj devis esti simulita dum frua evoluo.
La unua alproksimiĝo mi uzis por akiri specimenon datumoj simple serĉas liston de RSS nutras precizigita en teksta dosiero. Pitono biblioteko proponas bonan analizon de RSS, nomita
feedparser
, kiu Abstracts la diferencoj inter RSS kaj Atom formatoj. Alia utila biblioteko por objekto serialización teksto bazita havas la komika nomo pickle
. Ambaŭ bibliotekoj estas uzataj en la kodo en Listing 6 , kiu kaptas ĉiu RSS kiel encurtido objekto dosierojn por posta uzo. Kiel vi povas vidi, Python estas konciza kaj efika. Kantoj 6. La klaso CaptureFeeds
importado feedparser importi encurtido CaptureFeeds klaso: def __ init__ (self): por (i, url) en _enumerate_ (self.rss_feeds_list ()); self.capture_as_pickled_feed (url.strip (), i) rss_feeds_list def (self): f = open ('feeds_list.txt', 'r') f.readlines listo = () f.close revenu listo capture_as_pickled_feed def (Vin mem, url, feed_index): feed = feedparser.parse (url) f = open ('data / feed_' + str (feed_index) + '. pkl', 'w') pickle.dump (feed, f) f.close () se __ name__ == "__main__": CaptureFeeds = cf () |
La sekva paŝo estis surprize defia. Nun mi nutros datumoj specimeno, estis necese klasifiki ilin por uzo kiel trejnado datumoj. Datumoj de la trejnado datuma aro estas donita al la categorización algoritmo por ke ĝi povu lerni.
Ekzemple, la specimeno nutras ke mi uzis inkludis ESPN, la Sports Reto. Unu el flueroj parolis pri la transigo de Tim Tebow, la teamo de futbalo Denver Malafablaj, la New York Jetoj dum la Malafablaj estis dungita Peyton Manning esti lia nova antaŭa. Alia listero pri la rezultoj de la nutrado estis pri la entrepreno kaj lia nova Boeing jeto. La demando estas: kio specifa kategorio valoro devas esti atribuita al la unua artikolo? La valoroj
tebow
, broncos
, manning
, jets
, quarterback
, trade
kaj nfl
estas ĉiuj taŭgaj. Sed nur unu valoro povas esti precizigita en la trejnado datumoj kiel lia kategorio. Simile la dua artikolo estas la kategorio boeing
aŭ jet
? La problemo estas tiuj detaloj. La manlibro categorización bezonas grandan aron de trejnado datumoj estas esenca por la algoritmo produktas precizaj rezultoj. La tempo bezonata por fari ĉi ne estu subtaksata. Ĝi baldaŭ evidentiĝis, ke mi bezonis pli datumojn por labori, kaj oni devis jam esti _categorized_ - kaj precizeco. Kie mi trovas ĉi datumoj? Jen venas la Python NLTK. Krom esti bonega biblioteko por vorto prilaborado, ĝi eĉ venas kun specimeno datenaroj por malŝarĝi, aŭ korpuso en lia terminologio, kaj apliko programado interfaco por facile aliri la elŝutitaj datumoj. Por instali la Reuters korpuso, ruli la komandojn sube. Super 10.000 gazetaro artikoloj estos kopiitaj al la dosierujo ~ / nltk_data / korpusoj / Reuters /. Ĝuste kiel la RSS-flueroj, ĉiu Reuters artikolo enhavas titolo kaj korpo, tiel ke datumoj antaŭ-_categorized_ NLTK estas bonegaj kampoj por simuli RSS.
$ Python # eniri interaga Python konko # >>> Importi nltk importi la nltk biblioteko Nltk.download >>> () # ruli la NLTK Downloader, skribu 'd' Elŝuti Ensalutilo> # Specifu la Reuters 'Reuters' corpus |
De aparta intereso estas la dosiero ~ / nltk_data / korpusoj / Reuters / cats.txt. Ĝi enhavas liston de nomoj de arkivoj kaj eron kategorio atribuita al ĉiu el ili. La dosiero havas la jena formato, do la artikolo sur dosiero en la subdosierujo testo 14828 temo apartenas al la
grain
. test/14826 komerco test/14828 greno |
Naturaj lingvoj estas malklara
La kruda enigo algoritmo categorización de RSS estas evidente skribita teksto en la angla. Estas vere malpura.
Angla, aŭ iu ajn alia natura lingvo (te lingvoj parolataj aŭ komuna) estas tre malregula kaj malpreciza el la vidpunkto de komputila prilaborado. Unue, tie estas la demando de la distingo inter majuskloj kaj minuskla. La vorto egalas Malafabla Malafabla? La respondo estas eble. Tiam estas la problemo de interpunkcio kaj spacoj. La termino Malafabla. Egalas Malafabla aŭ Malafabla,? Pli aŭ malpli. Plie, estas pluralo kaj similaj vortoj. Kuru, kurante, kaj kuris ekvivalento? Nu, tio dependas. La tri vortoj havas komunan radikon. Kaj se ni havas naturan lingvon estas integritaj en markado lingvo kiel HTML? En ĉi tiu kazo, estus necesa por manipuli tekston
<strong>bronco</strong>
. Fine, estas la problemo de esence sensignifa vortoj, sed ofte uzata kiel, e kaj o. Tiaj "stopwords" nur malhelpas. Naturaj lingvoj estas malklara. Vi devas liberigi antaux prilaborado. Feliĉe, Python kaj NLTK permesi purigi ĉi salato. La metodo
normalized_words
klaso RssItem
en Listing 7 , prizorgas tiujn temojn. Notu, precipe, kiel NLTK forigas HTML markado integrita krudan tekston de la artikolo en nur unu linion de kodo! Regula esprimo estas uzata por forigi la partituro, kaj tiam la individuaj vortoj estas dividita kaj ununormigita al minuskla. Kantoj 7. La klaso RssItem
RssItem klaso: ... regex = re.compile ('[% s]'% re.escape (string.punctuation)) ... normalized_words def (Vin mem, article_text): vortoj = [] article_text.replace oneline = ('\ n','') = Nltk.clean_html purigis (oneline.strip ()) toks1 cleaned.split = () T1 estas en toks1: Tradukis self.regex.sub = ('', T1) toks2 translated.split = () T2 estas en toks2: t2s t2.strip = (). malsupreniri () se self.stop_words.has_key (t2s): pasas alie: words.append (t2s) revenu vortoj |
La listo de stopwords venis de NLTK kun jena linio de kodo. Estas apogo por aliaj naturaj lingvoj:
nltk.corpus.stopwords.words ('english')
|
NLTK ankaŭ ofertas plurajn klasojn "lematizadoras" por normaligi eĉ pli vortoj. Vidu la dokumentado sur la NLTK devenaj, frazo strukturo kaj gramatiko por pli informo.
Klasifiko kun Naiva Bayes algoritmo
Naiva Bayes algoritmo estas larĝe uzata kaj implementado en NLTK kun klaso
nltk.NaiveBayesClassifier
. La Bayes algoritmo klasifikas erojn laŭ la ĉeesto aŭ foresto de karakterizaĵoj en la datumoj aroj. En la kazo de artikoloj de RSS nutras ĉiu trajto estas donita vorto (pura) natura lingvo. La algoritmo estas "naiva" ĉar ĝi supozas ke ne ekzistas rilato inter la trajtojn (en tiu kazo, vortoj). Tamen, la angla enhavas pli ol 250.000 vortojn. Mi certe ne volas devi krei Bulea objekto enhavas 250.000 por ĉiu RSS ero pasi al la algoritmo. Do kio vortoj mi uzas? Mallonge, la respondo estas la plej uzataj vortoj en la loĝantaro de la trejnado datumoj kiuj ne stopwords. NLTK havigas klaso excepciona,
nltk.probability.FreqDist
kiu povas esti uzata por identigi tiujn vortojn plej ofte uzata. En Listing 8 , la metodo collect_all_words
revenas tabelo de ĉiuj vortoj de ĉiuj artikoloj de trejnado. Tiu tabelo estas pasita al la metodo
identify_top_words
identigi la plej oftaj vortoj. Utila karakterizaĵo de la klaso nltk.FreqDist
estas kiu estas esence hash, sed lia klavoj estas stokitaj en konsento kun la respondaj valoroj, aŭ interpunkcioj. Tial, estas facile atingi la 1.000 plej ofte uzataj vortoj kun la sintakso [:1000]
Python . Kantoj 8. Uzante la klaso nltk.FreqDist
collect_all_words def (Vin mem, artikoloj): all_words = [] por artikolo en artikoloj: w estas en item.all_words: words.append (c) revenu all_words identify_top_words def (Vin mem, all_words): freq_dist = nltk.FreqDist (w.lower () estas en all_words w) freq_dist.keys reveno () [: 1000] |
Por RSS feed items kun simulita datumoj de la NLTK artikoloj de Reuters, mi bezonas por identigi la kategorioj de ĉiu ero. Por tio, mi legis la dosieron ~ / nltk_data / korpusoj / Reuters / cats.txt menciita antaŭe. Legante dosieron kun Python estas simpla:
read_reuters_metadata def (Vin mem, cats_file): f = open (cats_file, 'r') f.readlines linioj = () f.close () reveno linioj |
La sekva paŝo estas akiri la rimedojn por ĉiu ero de RSS. La metodo
features
la klaso RssItem
, montrita sube, tion faras. En ĉi tiu metodo, la tabelo all_words
Artikolo estas unue reduktas al celo set
malgranda forigi duplikatajn vortoj. Tiam top_words
estas ripetita kaj komparis ĉi grupo por kontroli lian ĉeesto aŭ foresto. Al hash de 1.000 Bulea estas revenis, kun la ŝlosilo w_
sekvita de la vorto mem. Ĉi Python estas vere konciza. def trajtoj (Vin mem, top_words): word_set = aro (self.all_words) karakterizaĵoj = {} w estas en top_words: trajtoj ["w_% s"% c] = (w en word_set) revenu trajtoj |
Tiam mi enspezi trejnado aro de eroj de RSS kaj iliaj individuaj trajtoj kaj paŝo al la algoritmo. La kodo en Listing 9 montras tiun taskon. Notu ke la imposto estas trejnita en akurate unu linio de kodo.
Kantoj 9. Trejnado nltk.NaiveBayesClassifier
classify_reuters def (self): ... training_set = [] por artikolo en rss_items: karakterizaĵoj item.features = (top_words) tup = (funkciojn, item.category) # tup estas 2-elemento opo featuresets.append (tup) clasificador = nltk.NaiveBayesClassifier.train (training_set) |
La
NaiveBayesClassifier
, en memoro de la Python programo, estas trejnitaj. Nun nur persisti la aro de eroj de RSS feeds kiu bezonas esti ordo kaj peti la clasificador diveni la kategorio de ĉiu. Simpla. por artikolo en rss_items_to_classify: karakterizaĵoj item.features = (top_words) kategorio = classifier.classify (heroaĵo) |
Getting malpli naiva
Kiel deklaris antaŭe, la algoritmo supozas ke ne ekzistas rilato inter la individuaj rimedoj. Do frazoj kiel "maŝina lerno" kaj "lerni maŝino" aŭ "Nova Jorko Jeto" kaj "jeto al Nov-Jorko," estas ekvivalento (al estas stopword). En la kunteksto de natura lingvo, estas evidenta rilato inter tiuj vortoj. Do kiel mi povas instrui la algoritmo esti "malpli naiva" kaj rekoni tiujn rilatojn inter vortoj?
Unu tekniko estas por inkludi la komuna bigrams (du grupoj de vortoj) kaj trigrams (grupoj de tri vortoj) en la aro de trajtoj. Ne surprize, la NLTK havas subtenon por tio en la formo de la funkcioj
nltk.bigrams(...)
kaj nltk.trigrams(...)
. Ĝuste kiel la unua n
vortoj estis kolektita en la loĝantaro de vortoj de trejnado datumoj,
la bigrams kaj trigrams komune uzita povas identigi kaj uzita kiel
karakterizaĵoj. La rezultoj varias
Rafini datumojn kaj la algoritmo estas arto. Ni cetere normaligi la aro de vortoj, eble kun devenaj? Aŭ inkluzivas pli ol 1.000 ŝlosilaj vortoj? Malpli? Aŭ uzas aron de trejnado datumoj pli? Inkludi pli stopwords aŭ "ĉesi-gramoj"? Ĉi tiuj estas ĉiuj validaj demandoj. Eksperimento kun ili kaj, tra provo kaj eraro, vi atingos la plej bona algoritmo por viaj datumoj. Mi rimarkis, ke 85% estas bona kurzo de sukcesa categorización.
Rekomendo kun la k-proksima Najbaroj
La kliento volis montri erojn de RSS en selektita kategorio aŭ similaj kategorioj. Nun ke la eroj estis klasifikitaj kun Naiva Bayes algoritmo, la unua parto de la postulo estis donacita. La plej malfacila parto estis realigi la postulo "aŭ similaj kategorioj." Tie estas kie la sistemoj rekomendoj de maŝino lernado. Sistemoj rekomendi artikolon rekomendoj bazitaj sur simileco inter aliaj celoj. La produkto rekomendoj de Amazon.com kaj amikoj en Facebook estas bonaj ekzemploj de ĉi funkciojn.
k-proksima Najbaroj (kNN) algoritmo estas la plej komuna rekomendo. La ideo estas proponi aron de etiketoj (tio, kategorioj) kaj aro de datumoj responda al ĉiu el ili. Tiam, la algoritmo komparas datenaroj identigi similajn objektojn. La datumoj aro konsistas tabeloj de nombraj valoroj, kutime en ununormigita limigo 0 al 1. Ĝi povas tial identigi simila etiketoj en aroj. Kontraste naiva Bayes, kiu produktas nur rezulto, kNN povas produkti ordo listo de rekomendoj (te, la valoro de k).
Mi pensis la rekomendo algoritmoj simple kompreni kaj apliki la algoritmoj por la klasifiko, kvankam la kodo kaj lia matematika komplekseco estas tro granda por inkludi tie. Vidu la bonegan novan libron de Manning, Maŝino Lernado en aktivo, por vidi specimenon kodo kNN (vidu Rimedoj por ligilon). En la kazo de la efektivigo de RSS feed items, valoroj estis etikedita ero kategorioj kaj la datuma aro estis tabelo kun la valoroj de ĉiu de la 1.000 ŝlosilaj vortoj. Denove, kreante ke tabelo engaĝas scienco, matematikoj kaj arto. La valoroj de ĉiu vorto en la tabelo povas esti nulo aŭ simpla bulea, procentoj de spritaĵoj de vortoj en la artikolo, eksponenta valoro de ĉi tiu procento aŭ alian valoron.
Konkludo
Discover Python, NLTK kaj maŝina lerno estis interesa kaj agrabla sperto. La Python lingvo estas efika kaj konciza kaj estas parto de mia ilaro programisto nun. Ĝi taŭgas por aplikoj de maŝina lerno, natura lingvo math / scienco. Kvankam ne estas menciita en tiu artikolo, ankaŭ trovos ĝin utila por grafikaĵoj kaj konspiras. Se Python estis ankaŭ en via blinda makulo, mi sugestas ke vi rigardu en tiu lingvo.
Signifas
Lernu
- Lernu pli pri maŝino lernado en Vikipedio.
- Legu la oficialan Python retejo .
- Legu Maŝino Lernado en Ago de Peter Harrington (Manning, 2012).
- Check out Naturaj Lingvoj kun Python de Steven Birdo, Ewan Klein kaj Edward Loper (O'Reilly, 2009).
- Kontrolu apliki Konkludo de Bayes uzante PHP (Paul Meagher, developerWorks, marto-majo 2009).
Tiu tri partoj serio diskutas interesaj aplikoj por helpi kompreni la
efikecon kaj potencialo de la konceptoj de Konkludo de Bayes.
- En Get Free Software, developerWorks
, trovi ampleksan instrua informo, iloj, kaj projekto ĝisdatigojn por
helpi vin disvolvi kun malfermita fontokodo teknologioj kaj uzi ilin kun
IBM produktoj.
- Restu fluo kun developerWorks teknika eventoj kaj webcasts de teknika eventoj kaj webcasts centris en vario de IBM produktoj kaj IT merkato temoj.
- Aliĝu resumon de instrukcioj en libera konsigni vivi libera developerWorks Live! rapide ĝisdatigi en IBM produktoj kaj ilojn kaj tendencoj de la IT merkato segmento.
- Aŭskultu developerWorks podkastojn por interesaj intervjuoj kaj diskutoj por programistoj.
- Sekvu la tweets de developerWorks en Twitter .
- Aŭtoveturejo donu developerWorks iras de produkto instalado kaj instalinstrukciojn por komencantoj al antaŭita funcionalidad por spertaj programistoj.
- Esplori la retejo NLTK Python kaj la kreo de programoj por labori kun datumoj de homa lingvo.
- Elŝutu la Pip kaj lerni pli pri ĉi tiu ilo por instali kaj administri Python pakoj.
- Lernu pli pri
virtualenv
, ilo por krei izolitan Python medioj. - Rigardu la norma biblioteko
unittest
, a Python versio de JUnit. - Kontrolu la plug-in
pyeclipse
por Eklipso. - Kontrolu la IDE PyCharm por kompleta aro de iloj de disvolviĝo por plani kun Python kaj Django trajtoj de la strukturo.
- Uzu IBM juĝo programaro
(elŝutebla aŭ DVD) kaj novigi en via venonta disvolviĝo projekto uzanta
propran programaron libera programaro speciale por programistoj.
- Konekti kun aliaj uzantoj developerWorks dum esplori la blogoj, forumoj, grupoj, kaj vikioj alfrontas programistoj. Helpo disvolvi la libera programaro grupo en la developerWorks komunumo.
Chris Joakim é Senior Software Engineer na Primedia Inc. Chris
desenvolve software há mais de 25 anos em várias linguagens, incluindo
Clojure, Ruby, Java, Objective-C, JavaScript, CoffeeScript, Flex,
Smalltalk, COBOL e agora Python. Ele mora em Davidson, Carolina do Norte, EUA. Em suas horas de lazer, ele corre em maratonas e escreve
código. O email de Chris é cjoakim@bellsouth.net.