Páginas

segunda-feira, 1 de abril de 2013

Masxina Lernado de Davison

Esplori Python, Maŝino Lernado Biblioteko kaj NLTK

Disvolvi apliko categorizar RSS uzante Python, NLTK kaj maŝina lerno
Chris Joakim , Senior Programaro Inĝeniero, Primedia Inc
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)

Komencanto en Python

Ĉi tiu artikolo estas por programistoj - precipe tiuj kun fono en Java aŭ Rubeno - kiu alfrontas siajn unuajn deplojon de maŝino lernado.
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:
  • 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
Devioj kun mahout kaj Ruby
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 boeingjet ? 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 MalafablaMalafabla,? 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
Get produktoj kaj teknologioj
  • 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.
Diskuti
Pri la Aŭtoro
Foto de Chris Joakim 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.


5 estrelas