Uppörvun sölu með vélanámi

Hvernig við notum náttúrulega málvinnslu til að fá hæfi

Í þessari bloggfærslu mun ég útskýra hvernig við erum að gera söluferlið okkar á Xeneta skilvirkara með því að þjálfa vélanámsalgrím til að spá fyrir um gæði leiða okkar byggða á lýsingum fyrirtækisins.

Farðu yfir á GitHub ef þú vilt skoða handritið strax og ekki hika við að benda á úrbætur þar sem það er í stöðugri þróun.

Vandamálið

Þetta byrjaði með beiðni frá atvinnuþróunarfulltrúa Edvard, sem var þreyttur á því að framkvæma leiðinlegt verkefni að fara í gegnum stór excelblöð fyllt með fyrirtækjanöfnum og reyna að bera kennsl á þau sem við ættum að hafa samband við.

Dæmi um lista yfir möguleg fyrirtæki til að hafa samband, dregið frá sec.gov

Þess konar fyrirfram hæfi söluliða getur tekið tíma, þar sem það neyðir sölumanninn til að átta sig á því hvað hvert einasta fyrirtæki gerir (td í gegnum að lesa um þau á LinkedIn) svo að hann / hún geti gert hæfur gisk á hvort ekki fyrirtækið hentar SaaS appinu okkar vel.

Og hvernig gerirðu þér hæfa ágiskun? Til að skilja það þarftu fyrst að vita hvað við gerum:

Í meginatriðum hjálpar Xeneta fyrirtækjum sem senda gámum að uppgötva sparnaðarmöguleika með því að bjóða upp á upplýsingaöflun á sjóflutningum.
Þessi viðskiptavinur var með 748K dala sparnaðarmöguleika niður í markaðsmeðaltal í útgjöldum til sjóflutninga.

Nánar tiltekið, ef fyrirtæki þitt sendir yfir 500 gáma á ári, þá ertu líklegur til að uppgötva verulega sparnaðarmöguleika með því að nota Xeneta, þar sem við getum sagt þér nákvæmlega hvar þú borgar yfir markaðsmeðaltali.

Þessi búnaður ber saman dregið hlutfall viðskiptavina (fjólublá lína) við meðaltal markaðarins (grænt línurit) fyrir 20 feta gáma frá Kína til Norður-Evrópu.

Þetta þýðir að viðskiptavini okkar eru mjög frábrugðin hvert öðru, þar sem eini samnefnari þeirra er að þeir taka nokkuð þátt í flutningum á sjó. Hér eru nokkur dæmi um fyrirtækjaflokka sem við miðum við:

  • Bifreiðar
  • Vöruflutningar
  • Efni
  • Neytandi og smásala
  • Láglaunavörur

Tilgátan

Þó að breitt úrval viðskiptavina sé áskorun þegar þeir finna leiðir, þá erum við venjulega fær um að segja til um hvort fyrirtæki hafi áhuga fyrir Xeneta með því að lesa fyrirtækjalýsingu þeirra, þar sem það inniheldur oft vísbendingar um hvort þeir séu þátttakendur í að senda efni eða ekki um allan heim.

Þetta fékk okkur til að hugsa:

Gefum við fyrirtækislýsingu, getum við þjálfað reiknirit til að spá fyrir um hvort það sé hugsanlegur Xeneta viðskiptavinur eða ekki?

Ef svo er gæti þetta reiknirit reynst sölusveitinni gríðarlegur tími bjargvættur þar sem það gæti nokkurn veginn flokkað framúrskarandi blöðin áður en þeir byrja að öðlast forskriftirnar handvirkt.

Þróunin

Þegar ég byrjaði að vinna í þessu varð mér fljótt ljóst að hlutinn að læra vélina var ekki eina vandamálið. Okkur vantaði líka leið til að ná í lýsingar fyrirtækisins.

Við íhuguðum að skríða á vefsíður fyrirtækjanna og ná í hlutann Um okkur. En þetta lyktaði eins og sóðalegur, ófyrirsjáanlegur og tímafrekt virkni, svo við fórum að leita að API til að nota í staðinn. Eftir nokkra leit uppgötvuðum við FullContact, sem hafa API fyrir fyrirtæki sem veitir þér lýsingar á milljónum fyrirtækja.

Samt sem áður, API þeirra samþykkir aðeins vefslóðir fyrirtækisins sem aðföng, sem sjaldan eru til staðar í excel blöðunum okkar.

Þannig að við urðum að finna leið til að fá slóðina líka sem gerði það að verkum að við lentum á eftirfarandi verkflæði:

  • Notkun Google API til að google nafn fyrirtækisins (hacky, ég veit…)
  • Farðu í gegnum leitarniðurstöðuna og finndu líklegustu réttu slóðina
  • Notaðu þessa slóð til að spyrjast fyrir um API fyrir FullContact

Það er auðvitað tap á hverju skrefi hér, svo við munum finna betri leið til að gera þetta. Þetta virkaði hins vegar nægilega vel til að prófa hugmyndina út.

Gagnapakkinn

Næsta skref var að búa til þjálfunargagnasafn með að hafa þessi forskrift á sínum stað. Það þurfti að innihalda að minnsta kosti 1000 hæf fyrirtæki og 1000 vanhæf fyrirtæki.

Fyrsti flokkurinn var auðveldur, þar sem við gátum einfaldlega flutt lista yfir 1000 Xeneta notendur frá SalesForce.

Það var svolítið erfiðara að finna 1000 vanhæfa þar sem við höldum ekki utan um fyrirtækin sem við höfum forðast að hafa samband við. Svo vantaði Edvard handvirkt 1000 fyrirtæki.

Hreinsun gagna

Með því að gera það var kominn tími til að byrja að skrifa náttúrulegt málvinnsluhandritið, þar sem skref eitt var að hreinsa upp lýsingarnar, þar sem þær eru nokkuð skítugar og innihalda mikið af óviðeigandi upplýsingum.

Í dæmunum hér að neðan mun ég fara eftir hverri hreinsitækni sem við notum núna og sýna þér hvernig hrá lýsing endar sem fjölda tölustafa.

Dæmi um hráa lýsingu.

RegExp

Það fyrsta sem við gerum er að nota venjulegar orðatiltæki til að losna við stafrófsröð, þar sem fyrirmynd okkar mun aðeins geta lært orð.

lýsing = re.sub (“[^ a-zA-Z]”, ““, lýsing)
Eftir að stafir eru ekki stafrófsröð fjarlægðir.

Stemmer

Við stemma líka orðin. Þetta þýðir að draga úr mörgum tilbrigðum af sama orði við stofn þess. Þannig að í stað þess að samþykkja orð eins og framleiðanda, framleiðslu, framleiðslu og framleiðslu, einfaldum við þau frekar til framleiðslu.

frá nltk.stem.snowball innflutningi SnowballStemmer stemmer = SnowballStemmer ('enska') lýsing = getDescription ()
lýsing = [stemmer.stem (orð) fyrir orð í lýsingu]
Eftir að hafa stafað orðin.

Stöðvaðu orð

Við fjarlægjum síðan stopp orð með því að nota Natural Language Toolkit. Stopp orð eru orð sem hafa litla þýðingu fyrir hugtakan skilning textans, svo sem er, fyrir, fyrir, ég, hann o.s.frv.

úr nltk.corpus innflutningi stopwords stopWords = setja (stopwords.words ('enska')) lýsing = getDescription ()
lýsing = [orð fyrir orð í lýsingu ef ekki orð í stopporum]
Eftir að fjarlægja stopp orð.

Umbreytir gögnunum

En að þrífa og stinga gögnin mun í raun ekki hjálpa okkur að gera neina vélanám þar sem við þurfum líka að breyta lýsingunum í eitthvað sem vélin skilur, sem er tölur.

Poki með orðum

Til þess notum við Bag of Words (BoW) nálgunina. Ef þú þekkir ekki BoW myndi ég mæla með að þú lest þetta Kaggle námskeið.

BoW er einföld aðferð til að breyta textasetningum í vektor, þar sem hvert atriði í vektorunum táknar ákveðið orð. CountVectorizer frá Scikit learning gefur þér frábær einföld leið til að gera þetta:

frá sklearn.feature_extraction.text innflutningi CountVectorizer
vektorizer = CountVectorizer (greiningartæki = 'orð', max_features = 5000) vectorizer.fit (training_data) vectorized_training_data = vectorizer.transform (training_data)

Færibreytan max_features segir vectorizer hversu mörg orð þú vilt hafa í orðaforða okkar. Í þessu dæmi mun vectorizer innihalda 5000 orð sem koma oftast fyrir í gagnapakkanum okkar og hafna afganginum af þeim.

Dæmi um mjög lítinn (35 hluti) Bag of Words vektor. (Okkar er 5K hlutir að lengd).

Umbreyting Tf-idf

Að lokum notum við einnig umbreytingu tf-idf, sem er stutt fyrir tíðni andhverfa skjalatíðni. Þetta er tækni sem lagar mikilvægi mismunandi orða í skjölunum þínum.

Nánar tiltekið mun tf-idf leggja áherslu á orð sem koma oft fyrir í lýsingu (tíðni tíðni) en af-leggja áherslu á orð sem koma oft fyrir í öllu gagnapakkanum (andhverfa skjalatíðni).

frá sklearn.feature_extraction.text import TfidfTransformer tfidf = TfidfTransformer (norm = 'l1')
tfidf.fit (vectorized_training_data) tfidf_vectorized_data = tfidf.transform (vectorized_training_data)

Aftur, scikit learning bjargar deginum með því að útvega tf-idf út úr kassanum. Passaðu líkanið einfaldlega að vectorized þjálfunargögnum þínum og notaðu síðan umbreytingaraðferðina til að umbreyta þeim.

Vigurinn eftir að hafa beitt tf-idf. (Því miður fyrir slæma snið)

Reikniritið

Eftir að öll gögnin hafa verið hreinsuð, vektorað og umbreytt getum við loksins byrjað að læra vél, sem er einn einfaldasti hlutinn í þessu verkefni.

Ég sneiddi gögnin fyrst í 70% þjálfunargögn og 30% prófunargögn og byrjaði síðan með tveimur scikit-læra reikniritum: Random Forest (RF) og K Nearest Neighbours (KNN). Það kom fljótt í ljós að RF náði betri árangri en KNN, þar sem sá fyrrnefndi náði fljótt meira en 80% nákvæmni en sá síðarnefndi var 60%.

Að passa upp á scikit learning líkan er frábær einfalt:

def runForest (X_train, X_test, Y_train, Y_test): forest = RandomForestClassifier (n_estimators = 100) forest = forest.fit (X_train, Y_train) score = forest.score (X_test, Y_test) return score
forest_score = runForest (X_train, X_test, Y_train, Y_test)

Svo ég hélt áfram með RF til að sjá hversu mikið ég gæti aukið nákvæmni með því að stilla eftirfarandi breytur:

  • Orðaforði: hversu mörg orð CountVectorizer eru með í orðaforðanum (sem stendur 5K)
  • Gram Range: stærð setningar til að taka með í Bag Of Words (sem stendur 1-3, sem þýðir allt að '3 orð' orðasambönd)
  • Matsmenn: magn áætlana sem á að fela í Random Forest (nú 90)

Með þessum breytum stillt nær reikniritið 86,4% nákvæmni á prufugagnasafninu og er í raun farið að verða gagnlegt fyrir söluteymið okkar.

Leiðin framundan

Handritið er þó alls ekki klárað. Það eru mörg leið til að bæta það. Til dæmis er reiknirit líklegt til að vera hlutdræg gagnvart því hvaða lýsingu við höfum í þjálfunargögnum okkar. Þetta gæti orðið árangursflöskuháls þegar þú prófar það á raunverulegri gögnum í heiminum.

Hér eru nokkur verkefni sem við erum að íhuga að gera í veginum framundan:

  • Fáðu fleiri gögn (skafa, önnur API, bæta gagnhreinsun)
  • Prófaðu aðrar gerðir gagnabreytinga (td word2vec)
  • Prófaðu aðrar ml reiknirit (td taugarnet)

Við munum ýta reglulega á GitHub ef þú vilt fylgjast með framvindunni. Og ekki hika við að skilja eftir athugasemd hér að neðan ef þú hefur eitthvað sem þú vilt bæta við.

Skál,

Per Harald Borgen

Takk fyrir að lesa! Við erum Xeneta - leiðandi vettvangur leyniþjónustunnar fyrir sjófrakt. Við erum alltaf að leita að björtum huga til að taka þátt í okkur, svo farið yfir á vefsíðu okkar ef þú hefur áhuga!

Þú getur fylgst með okkur á bæði Twitter og Medium.