Реализация нормализованного расстояния Google на Python (пример простого веб-скрейпинга)
Введение
Основываясь на подсчете результатов Google, мы можем сделать вывод о популярности слова. Кроме того, отношение между частотой двух слов вместе по отношению к их индивидуальной частоте является полезной мерой того, насколько два слова связаны между собой.
На основе этих представлений определяется Нормализованное расстояние Google, в этом посте я покажу, как реализовать это на python, используя базовые инструменты веб-скрейпинга. Окончательный код можно найти здесь.
Код
Импорт библиотек
import requests
from bs4 import BeautifulSoup
import math
import sys
Выполнение поиска и получение счета
Здесь я реализую эту функцию, которая выполняет GET для Google, используя заголовки, указывающие, что мы находимся на настольном компьютере (а не на телефоне), я также указываю параметр gl, чтобы поиск выполнялся так, как если бы я был в США.
def number_of_results(text):
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}
r = requests.get(" ","+"),params={"gl":"us"},headers=headers)
Затем BeautifulSoup используется для извлечения html-части, где указано количество.
soup = BeautifulSoup(r.text, "lxml")
res = soup.find("div", {"id": "resultStats"})
Наконец, он просто печатает и возвращает проанализированный номер
print(res.text)
for t in res.text.split():
try:
number = float(t.replace(",",""))
print("{} results for {}".format(number,text))
return number
except:
pass
raise Exception("Couldn't find a valid number of results on Google")
Вычислите формулу
Здесь мы реализуем формулу, указанную в википедии
# N = number_of_results("the")
N = 25270000000.0
N = math.log(N,2)
def normalized_google_distance(w1, w2):
f_w1 = math.log(number_of_results(w1),2)
f_w2 = math.log(number_of_results(w2),2)
f_w1_w2 = math.log(number_of_results(w1+" "+w2),2)
return (max(f_w1,f_w2) - f_w1_w2) / (N - min(f_w1,f_w2))
Основная функция
Весь код выполняется из основной функции
def main(argv):
w1 = argv[1]
w2 = argv[2]
score = normalized_google_distance(w1,w2)
print("Score is",round(score,2))
print("W1='"+ w1+ "' W2='"+ w2+ "'")
# Usage example
# python normalized_google_distance.py shakespeare macbeth
# python normalized_google_distance.py "shakespeare " "macbeth"
main(sys.argv)