Seuraava artikkeli auttaa sinua: Suositusjärjestelmän rakentaminen TF-IDF:llä ja NMF:llä (Python)
Aiheklusterit ja suositusjärjestelmät voivat auttaa SEO-asiantuntijoita rakentamaan skaalautuvan sisäisen linkitysarkkitehtuurin.
Ja kuten tiedämme, sisäinen linkittäminen voi vaikuttaa sekä käyttökokemukseen että hakutuloksiin. Se on alue, jonka haluamme saada kuntoon.
Tässä artikkelissa käytämme Wikipedia-tietoja aiheklustereiden ja suositusjärjestelmien rakentamiseen Pythonilla ja Pandas-dataanalyysityökalulla.
Tämän saavuttamiseksi käytämme Scikit-learn-kirjastoa, Pythonin ilmaista koneoppimiskirjastoa, jossa on kaksi pääalgoritmia:
- TF-IDF: Termitaajuus-käänteinen asiakirjataajuus.
- NMF: Ei-negatiivinen matriisifaktorointi, joka on ryhmä monimuuttujaanalyysin ja lineaarisen algebran algoritmeja, joita voidaan käyttää mittatietojen analysointiin.
Erityisesti teemme:
- Poimi kaikki linkit Wikipedia-artikkelista.
- Lue tekstiä Wikipedian artikkeleista.
- Luo TF-IDF-kartta.
- Jaa kyselyt klustereihin.
- Rakenna suositusjärjestelmä.
Tässä on esimerkki aiheklustereista, joita voit rakentaa:
Lisäksi tässä on yleiskatsaus suositusjärjestelmästä, jonka voit luoda uudelleen.
Valmis? Katsotaanpa muutamia määritelmiä ja käsitteitä, jotka haluat tietää ensin tieltä.
Ero aiheklustereiden ja suositusjärjestelmien välillä
Aiheklustereita ja suositusjärjestelmiä voidaan rakentaa eri tavoin.
Tässä tapauksessa ensimmäinen on ryhmitelty IDF-painojen mukaan ja jälkimmäinen kosinin samankaltaisuuden mukaan.
Yksinkertaisesti sanottuna SEO:
- Aiheklusterit voi auttaa luomaan arkkitehtuurin, johon kaikki artikkelit on linkitetty.
- Recommender-järjestelmät voi auttaa luomaan arkkitehtuurin, jossa tärkeimmät sivut on linkitetty.
Mikä on TF-IDF?
TF-IDF tai termi Frequency-Inverse Document Frequency on luku, joka ilmaisee minkä tahansa sanan tilastollisen merkityksen asiakirjakokoelmalle kokonaisuutena.
TF-IDF lasketaan kertomalla termitaajuus ja käänteinen asiakirjan tiheys.
TF-IDF = TF * IDF
- TF: kuinka monta kertaa sana esiintyy asiakirjassa / sanojen määrä asiakirjassa.
- IDF: loki(asiakirjojen määrä / sanan sisältävien asiakirjojen lukumäärä).
Tämän havainnollistamiseksi tarkastellaan tätä tilannetta Koneoppiminen kohdesanana:
- Asiakirja A sisältää kohdesanan 10 kertaa 100 sanasta.
- Koko korpuksessa 30 asiakirjaa 200 dokumentista sisältää myös kohdesanan.
Sitten kaava olisi:
TF-IDF = (10/100) * log(200/30)
Mitä TF-IDF ei ole
TF-IDF ei ole uusi asia. Se ei ole asia, jota varten sinun tarvitsee optimoida.
John Muellerin mukaan se on vanha tiedonhakukonsepti, johon ei kannata keskittyä hakukoneoptimoinnissa.
Siinä ei ole mitään, mikä auttaisi sinua ylittämään kilpailijasi.
Silti TF-IDF voi olla hyödyllinen hakukoneoptimoijille.
TF-IDF:n toiminnan oppiminen antaa käsityksen siitä, kuinka tietokone voi tulkita ihmisen kieltä.
Näin ollen tätä ymmärrystä voidaan hyödyntää sisällön osuvuuden parantamiseksi vastaavilla tekniikoilla.
Mikä on ei-negatiivinen matriisifaktorointi (NMF)?
Ei-negatiivinen matriisifaktorointi eli NMF on dimensiovähennystekniikka, jota käytetään usein ohjaamattomassa oppimisessa ja joka yhdistää ei-negatiivisten ominaisuuksien tuotteen yhdeksi.
Tässä artikkelissa NMF:ää käytetään määrittämään niiden aiheiden lukumäärä, joiden alle haluamme ryhmitellä kaikki artikkelit.
Aiheklustereiden määritelmä
Aiheklusterit ovat toisiinsa liittyvien termien ryhmiä, joiden avulla voit luoda arkkitehtuurin, jossa kaikki artikkelit on linkitetty toisiinsa tai sisäisten linkkien vastaanottavassa päässä.
Recommender-järjestelmien määritelmä
Recommender-järjestelmät voivat auttaa luomaan arkkitehtuurin, jossa tärkeimmät sivut on linkitetty.
Aiheklusterin rakentaminen
Aiheklustereita ja suositusjärjestelmiä voidaan rakentaa eri tavoin.
Tässä tapauksessa aiheklusterit ryhmitellään IDF-painojen mukaan ja Recommender-järjestelmät kosinin samankaltaisuuden mukaan.
Poimi kaikki linkit tietystä Wikipedia-artikkelista
Linkkien purkaminen Wikipedia-sivulta tapahtuu kahdessa vaiheessa.
Valitse ensin tietty aihe. Tässä tapauksessa käytämme Wikipedian artikkeli koneoppimisesta.
Toiseksi, käytä Wikipedia APIa löytääksesi kaikki artikkelin sisäiset linkit.
Näin voit tehdä kyselyn Wikipedia API:sta Python-pyyntökirjaston avulla.
tuontipyynnöt main_subject=”Machine learning” url=”https://en.wikipedia.org/w/api.php” params = { ‘action’: ‘query’, ‘format’: ‘json’, ‘generator’: ‘links’, ‘titles’: main_subject, ‘prop’:’pageprops’, ‘ppprop’:’wikibase_item’, ‘gpllimit’:1000, ‘redirects’:1 } r = requests.get(url, params=params) r_json = r.json() linked_pages = r_json[‘query’][‘pages’]
page_titles = [p[‘title’] p:lle linked_pages.values()]
Lopuksi tulos on luettelo kaikista alkuperäisestä artikkelista linkitetyistä sivuista.
Nämä linkit edustavat jokaista aiheklustereissa käytettyä entiteettiä.
Valitse artikkelien osajoukko
Suorituskykysyistä valitsemme vain ensimmäiset 200 artikkelia (mukaan lukien koneoppimista käsittelevä pääartikkeli).
# valitse ensimmäiset X artikkelia num_articles = 200 sivua = sivun_otsikot[:num_articles]
# muista säilyttää pääaihe luettelosivuilla += [main_subject]
# varmista, ettei luettelosivuilla ole kaksoiskappaleita = lista(set(sivut))
Lue teksti Wikipedia-artikkeleista
Nyt meidän on purettava jokaisen artikkelin sisältö suorittaaksemme laskelmat TF-IDF-analyysiä varten.
Tätä varten haemme sovellusliittymän uudelleen jokaiselle sivumuuttujaan tallennetulle sivulle.
Jokaisesta vastauksesta tallennamme sivun tekstin ja lisäämme sen luetteloon nimeltä text_db.
Huomaa, että saatat joutua asentamaan tqdm- ja lxml-paketit käyttääksesi niitä.
tuontipyynnöt lxml:stä tuo html osoitteesta tqdm.notebook tuonti tqdm text_db = []
sivulle tqdm(pages): vastaus = requests.get( ‘https://en.wikipedia.org/w/api.php’, params={ ‘action’: ‘parse’, ‘page’: page, ‘ muoto’: ‘json’, ‘prop’:’teksti’, ‘uudelleenohjaukset’:’ } ).json() raw_html = vastaus[‘parse’][‘text’][‘*’]
document = html.document_fromstring(raw_html) text=”” for p:lle document.xpath(‘//p’): text += p.text_content() text_db.append(text) print(‘Valmis’)
Tämä kysely palauttaa luettelon, jossa jokainen elementti edustaa vastaavan Wikipedia-sivun tekstiä.
## Tulosta artikkelien määrä print(‘Poimittujen artikkelien määrä: ‘, len(text_db))
Lähtö:
Poistettujen artikkeleiden määrä: 201
Kuten näemme, artikkeleita on 201.
Tämä johtuu siitä, että lisäsimme artikkelin “Koneoppiminen” kyseisen sivun 200 suosituimman linkin päälle.
Lisäksi voimme valita ensimmäisen artikkelin (indeksi 0) ja lukea ensimmäiset 300 merkkiä ymmärtääksemme paremmin.
# lue ensimmäiset 300 merkkiä 1. artikkelista text_db[0][:300]
Lähtö:
‘\nBiologia on tieteellinen tutkimus elämästä.[1][2][3] Se on luonnontiede, jolla on laaja ulottuvuus, mutta sillä on useita yhdistäviä teemoja, jotka yhdistävät sen yhdeksi yhtenäiseksi alaksi.[1][2][3] Esimerkiksi kaikki organismit koostuvat soluista, jotka käsittelevät geeneihin koodattua perinnöllistä tietoa, joka voi
Luo TF-IDF-kartta
Tässä osiossa luotamme pandoihin ja TfidfVectorizeriin tietokehyksen, joka sisältää kunkin artikkelin bigrammit (kaksi peräkkäistä sanaa).
Tässä käytämme TfidfVectorizeria.
Tämä vastaa CountVectorizerin käyttöä ja sen jälkeen TfidfTransformeria, jonka saatat nähdä muissa opetusohjelmissa.
Lisäksi meidän on poistettava “melu”. Luonnollisen kielenkäsittelyn alalla sanoja, kuten “the”, “a”, “minä”, “me” kutsutaan “pysäytyssanoiksi”.
Englannin kielellä pysäytyssanoilla on alhainen merkitys hakukoneoptimoijille, ja ne ovat yliedustettuina asiakirjoissa.
Siksi lisäämme nltk:n avulla luettelon englanninkielisistä pysäytyssanoista TfidfVectorizer-luokkaan.
tuo pandat pd:nä osoitteesta sklearn.feature_extraction.text tuonti TfidfVectorizer osoitteesta nltk.corpus import stopwords
# Luo luettelo englanninkielisistä pysäytyssanoista stop_words = stopwords.words(‘english’)
# Esitä luokka vec = TfidfVectorizer( stop_words=stop_words, ngram_range=(2,2), # bigs use_idf=True )
# Harjoittele malli ja muunna tiedot tf_idf = vec.fit_transform(text_db)
# Luo pandas DataFrame df = pd.DataFrame( tf_idf.toarray(), columns=vec.get_feature_names(), index=pages )
# Näytä DataFramen df.head() ensimmäiset rivit
Yllä olevassa DataFramessa:
- Rivit ovat asiakirjoja.
- Sarakkeet ovat bigrammeja (kaksi peräkkäistä sanaa).
- Arvot ovat sanan taajuudet (tf-idf).
Lajittele IDF-vektorit
Alla lajittelemme käänteiset asiakirjan taajuusvektorit osuvuuden mukaan.
idf_df = pd.DataFrame( vec.idf_, index=vec.get_feature_names(), sarakkeet=[‘idf_weigths’]
) idf_df.sort_values(by=[‘idf_weigths’]).head(10)
Tarkemmin sanottuna IDF-vektorit lasketaan artikkelien lukumäärän lokista jaettuna kunkin sanan sisältävien artikkelien lukumäärällä.
Mitä suurempi IDF, sitä merkityksellisempi se on artikkelin kannalta.
Mitä pienempi IDF, sitä yleisempi se on kaikissa artikkeleissa.
- 1 maininta 1 artikkelista = log(1/1) = 0,0
- 1 maininta 2 artikkelista = log(2/1) = 0,69
- 1 maininta 10 artikkelista = log(10/1) = 2,30
- 1 maininta 100 artikkelista = log(100/1) = 4,61
Jaa kyselyt klustereihin NMF:n avulla
tf_idf-matriisin avulla jaamme kyselyt aiheryhmiin.
Jokainen klusteri sisältää läheisesti toisiinsa liittyviä bigrammeja.
Ensinnäkin käytämme NMF:ää pienentämään matriisin ulottuvuudet aiheiksi.
Yksinkertaisesti sanottuna ryhmittelemme 201 artikkelia 25 aiheeseen.
osoitteesta sklearn.decomposition import NMF kohteesta sklearn.preprocessing tuonti normalisoida # (valinnainen) Poista Scikit-learn from varoitusten tulevaisuusvaroitus käytöstä import simplefilter simplefilter(action=’ignore’, category=FutureWarning) # valitse aiheryhmien määrä n_topics = 25 # Luo NMF-instanssi nmf = NMF(n_komponentit=n_aiheet) # Sovita malli tf_idf:ään nmf_features = nmf.fit_transform(tf_idf) # normalisoi ominaisuudet norm_features = normalize(nmf_features)
Voimme nähdä, että bigmien määrä pysyy samana, mutta artikkelit on ryhmitelty aiheisiin.
# Vertaa käsiteltyjä VS-prosessoimattomia datakehyksiä print(‘Alkuperäinen df:’, df.shape) print(‘NMF Processed df:’, nmf.components_.shape)
Toiseksi annamme jokaiselle 25 klusterille kyselysuosituksia.
# Luo klusteroitu tietokehys NMF-klusteroidut df-komponentit = pd.DataFrame(nmf.components_, columns=[df.columns]
) clusters = {} # Näytä 25 suosituinta kyselyä jokaiselle klusterille kohteelle i alueella(len(komponentit)): klusterit[i] = []
loop = dict(komponentit.loc[i,:].nlargest(25)).items() for k,v silmukassa: klusterit[i].append({‘q’:k[0],’sim_score’: v})
Kolmanneksi luomme tietokehyksen, joka näyttää suositukset.
# Luo tietokehys käyttämällä klusteroitua sanakirjaryhmittelyä = pd.DataFrame(clusters).T grouping[‘topic’] = ryhmittely[0].apply(lambda x: x[‘q’]) grouping.drop(0, axis=1, inplace=True) grouping.set_index(‘aihe’, inplace=True) def show_queries(df): sarakkeelle df.columnsissa: df[col] = df[col].apply(lambda x: x[‘q’]) return df # Näytä kysely vain datakehyksessä clustered_queries = show_queries(grouping) clustered_queries.head()
Lopuksi tuloksena on DataFrame, joka näyttää 25 aihetta sekä kunkin aiheen 25 parasta.
Suositusjärjestelmän rakentaminen
Aiheklustereiden rakentamisen sijaan rakennamme nyt suositusjärjestelmän käyttämällä samoja normalisoituja ominaisuuksia kuin edellisessä vaiheessa.
Normalisoidut ominaisuudet tallennetaan norm_features-muuttujaan.
# laske kunkin klusterin tietojen kosinin yhtäläisyydet = {} # luo datakehys norm_df = pd.DataFrame(norm_features, index=pages) sivuille: # valitse sivusuositukset = norm_df.loc[page,:]
# Laske kosinin samankaltaisuus = norm_df.dot(recommendations) data[page] = []
silmukka = dict(samankalaisuudet.nlargest(20)).kohteet() k:lle, v silmukassa: if k != sivu: data[page].append({‘q’:k,’sim_score’: v})
Mitä yllä oleva koodi tekee:
- Selaa jokaisen alussa valitun sivun läpi.
- Valitsee vastaavan rivin normalisoidusta tietokehyksestä.
- Laskee kaikkien biggram-kyselyiden kosinin samankaltaisuuden.
- Valitsee 20 suosituinta kyselyä samankaltaisuuspisteiden mukaan lajiteltuina.
Suorituksen jälkeen meille jää sanakirja sivuista, jotka sisältävät samankaltaisuuspisteiden mukaan lajiteltuja suositusluetteloita.
Seuraava vaihe on muuntaa sanakirja DataFrame-kehykseksi.
# muunna sanakirja datakehykseksi suositteleja = pd.DataFrame(data).T def show_queries(df): df.columns-sarakkeelle: df[col] = df[col].apply(lambda x: x[‘q’]) return df show_queries(recommender).head()
Tuloksena oleva DataFrame näyttää pääkyselyn sekä lajitellut suositellut aiheet kussakin sarakkeessa.
Voilà!
Olemme rakentaneet oman suositusjärjestelmän ja aiheklusterin.
Mielenkiintoisia kommentteja SEO-yhteisöltä
Olen suuri Daniel Heredian fani, joka on myös pelannut TF-IDF by:n kanssa sopivien sanojen löytäminen TF IDF:llä, textblobilla ja Pythonilla.
Python-opetusohjelmat voivat olla pelottavia.
Yksi artikkeli ei välttämättä riitä.
Jos näin on, kehotan sinua lukemaan Koray Tuğberk GÜBÜRin opetusohjelmajoka paljastaa samanlaisen tavan käyttää TF-IDF:ää.
Billy Bonaros keksi myös luovan TF-IDF-sovelluksen Pythonissa ja näytti kuinka luodaan TF-IDF-avainsanatutkimustyökalu.
Johtopäätös
Lopulta toivon, että olet oppinut tästä logiikan, joka voidaan mukauttaa mille tahansa verkkosivustolle.
Sen ymmärtäminen, kuinka aiheklusterit ja suositusjärjestelmät voivat auttaa parantamaan verkkosivuston arkkitehtuuria, on arvokas taito jokaiselle SEO-ammattilaiselle, joka haluaa skaalata työtäsi.
Pythonin ja Scikit-learnin avulla olet oppinut rakentamaan omasi – ja oppinut TF-IDF:n ja ei-negatiivisen matriisin faktoroinnin perusteet prosessin aikana.
Lisää resursseja: