Автор оригинала: Mathias Gatti.
Вступление
Основываясь на подсчете результатов Google, мы можем вывести популярность слова. Также взаимосвязь между частотой двух слов вместе с уважением к своей индивидуальной частоте является полезной мерой того, насколько связаны два слова.
На основании этих идей определяется Нормализовано расстояние Google В этом посте я покажу, как реализовать его в Python, используя основные инструменты Scraping Web. Окончательный код можно найти здесь Отказ
Код
Импорт библиотек
import requests from bs4 import BeautifulSoup import math import sys
Делать поиск и получить счет
Здесь я реализую эту функцию, которая делает GOO 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("https://www.google.com/search?q="+text.replace(" ","+"),params={"gl":"us"},headers=headers)
Затем красивая конструкция используется для извлечения 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")
Вычислить формулу
Здесь мы реализуем формулу, указанную в Wikipedia
# 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)