Реализация нормализованного расстояния Google на Python (пример простого веб-скрейпинга)

Введение

Основываясь на подсчете результатов Google, мы можем сделать вывод о популярности слова. Кроме того, отношение между частотой двух слов вместе по отношению к их индивидуальной частоте является полезной мерой того, насколько два слова связаны между собой.

Изображение WhatsApp 2019-06-09 на 13.58.03.jpeg

На основе этих представлений определяется Нормализованное расстояние 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")

Вычислите формулу

Здесь мы реализуем формулу, указанную в википедии
Изображение WhatsApp 2019-06-09 в 14.12.48 (1).jpeg

# 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)

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *