Skocz do zawartości

Miernik zgodności tematycznej stron internetowych


blebleble

Rekomendowane odpowiedzi

Witam! Jestem nowy na forum i nie jestem specjalistą SEO (zacząłem interesować się tym tematem kilka dni temu :D), więc proszę o pewną wyrozumiałość ;).

W każdym razie, moją uwagę zwróciło przekonanie niektórych osób, że Google bierze pod uwagę zgodność tematyczną stron, pomiędzy którymi znajduje się link. Napisałem więc prościuteńki napisany skrypt sprawdzający na ile strony są ze sobą tematycznie powiązane. Na razie jest on bardzo prymitywny, jeśli waszym zdaniem jest szansa, że lepsza wersja byłaby do czegokolwiek przydatna, to mogę go ulepszyć.

Na potrzeby testu porównamy, na ile strony:

1) lexy.com.pl/blog

2) sbart.pl

3) dziennikarstwo-obywatelskie.pl

4) alejaartykulow.pl/

5) oniczym.net

6) blog.gdaq.pl

7) blog.seo-profi.pl

są zgodne ze stroną seo.zgred.pl. Oczywiście, oczekujemy że wynik dla 1,6 i 7 będzie znacząco wyższy niż dla reszty.

Użycie:

python ztsi.py 250 < strony.txt

(250 to liczba stron które ściągamy, strony.txt zawiera bezpośrednie linki do sitemap w xmlu oddzielone znakiem nowej lini)

Wyniki:

(trzeba na nie długo poczekać, w końcu ściągamy strony)

https://seo.zgred.pl/sitemap.xml
100.00
=======
https://www.lexy.com.pl/blog/sitemap.xml
38.75
=======
https://sbart.pl/sitemap.xml
29.86
=======
https://dziennikarstwo-obywatelskie.pl/sitemap
23.60
=======
https://www.alejaartykulow.pl/sitemap.xml
27.00
=======
https://oniczym.net/sitemap.xml
15.50
=======
https://www.blog.gdaq.pl/sitemap.xml
37.46
=======
https://blog.seo-profi.pl/sitemap.xml
55.16

Wniosek: da się łatwo i szybko rozpoznawać strony o podobnej tematyce :).

Kod skryptu:

import urllib.request
import re
import sys
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

stopwords = [
'ach', 'aj', 'albo', 'bardzo', 'bez', 'bo',
'być', 'ci', 'cię', 'ciebie', 'co', 'czy','daleko', 'dla', 'dlaczego', 'dlatego',
'do', 'dobrze', 'dokąd', 'dość', 'dużo','dwa', 'dwaj', 'dwie', 'dwoje', 'dziś',
'dzisiaj', 'gdyby', 'gdzie', 'go','ich', 'ile', 'im', 'inny', 'ja',
'ją', 'jak', 'jakby', 'jaki','je', 'jeden', 'jedna', 'jedno',
'jego', 'jej', 'jemu', 'jeśli', 'jest', 'jestem', 'jeżeli',
'już', 'każdy', 'kiedy', 'kierunku', 'kto', 'ku', 'lub', 'ma', 'mają',
'mam', 'mi', 'mną', 'mnie', 'moi', 'mój', 'moja', 'moje', 'może',
'mu', 'my', 'na', 'nam', 'nami', 'nas', 'nasi', 'nasz', 'nasza',
'nasze', 'natychmiast', 'nią','nic', 'nich', 'nie', 'niego',
'niej', 'niemu', 'nigdy', 'nim','nimi', 'niż', 'obok', 'od',
'około', 'on', 'ona', 'one', 'oni', 'ono', 'owszem', 'po',
'pod','ponieważ', 'przed', 'przedtem', 'są', 'sam',
'sama', 'się', 'skąd','tak','taki', 'tam', 'ten',
'to', 'tobą', 'tobie', 'tu','tutaj', 'twoi', 'twój','twoja',
'twoje', 'ty','wam','wami','was','wasi',
'wasz','wasza', 'wasze','we','więc','wszystko',
'wtedy','wy','żaden', 'zawsze','że'
]

stopre = re.compile(r'\b(' + r'|'.join(stopwords) + r')\b\s*')

def clean_html(html):
   cleaned = re.sub(r"(?is)<(script|style).*?>.*?(</\1>)", "", html.strip())
   cleaned = re.sub(r"(?s)<!--(.*?)-->[\n]?", "", cleaned)
   cleaned = re.sub(r"(?s)<.*?>", " ", cleaned)
   cleaned = re.sub(r" ", " ", cleaned)
   cleaned = re.sub(r"  ", " ", cleaned)
   cleaned = re.sub(r"  ", " ", cleaned)
   return cleaned.strip()

def get_site_text(url, limit):  
   response = urllib.request.urlopen(url)
   data = response.read()	  # a `bytes` object
   text = data.decode('utf-8') # a `str`; this step can't be used if data is binary
   links = []
   for d in text.split('\n'):
  data = re.findall('<loc>(https:\/\/.+)<\/loc>',d)
  for i in data:
    links.append(i)
   corpus = ""
   counter = 0
   for link in links:
    try:
	    if counter < limit:
		    res = urllib.request.urlopen(link)
		    html = res.read().decode('utf-8')
		    corpus += clean_html(html)
		    counter += 1
    except:
	    pass
   downloaded = counter*100/limit
   print ("Pobrano {0} procent żądanych podstron z {1}.".format (downloaded, url).rstrip())
   corpus = re.sub(' +', " ", corpus)
   corpus = re.sub ('\n|\r|\t|\.|\,|\?|\!|\:|(\d)+|;', '', corpus)
   corpus = corpus.lower()
   corpus = stopre.sub('', corpus)
   corpus_list = corpus.split(" ")
   intab = "ąćęóźżł"
   outtab = "aceozzl"
   trantab = str.maketrans(intab, outtab)

   wordlist = []
   for word in corpus_list:
    if len(word)> 6:
	    wordlist.append(word[0:6])
    else:
	    wordlist.append(word)
   corpus = " ".join(wordlist).translate(trantab)
   return corpus

docs = []
urls = []

if len(sys.argv) > 1:
   limit = int(sys.argv[1])
else:
   limit = 100

for line in sys.stdin:
   docs.append(get_site_text(line.rstrip(), limit))
   urls.append(line.rstrip())
documents = tuple (docs)

tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
cs = cosine_similarity(tfidf_matrix[0], tfidf_matrix)

print ("=======")
for i in range(0, len(urls)):
   print(urls[i])
   print ("{0:.2f}".format(cs[0][i]*100))
   print ("=======")

Do odpalenia potrzebny jest Python 3 i moduły numpy, scipy i scikit-learn.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności