[Python] Explorez les caractéristiques des titres des meilleurs sites dans les résultats de recherche Google

Chose que tu veux faire

Je souhaite connaître les caractéristiques des titres des 10 meilleurs sites recherchés par Google avec un certain mot-clé.

Bibliothèque

supposition

Cette fois, j'écrirai avec le notebook Jupyter, il doit donc être installé.

la mise en oeuvre

J'écrirai le code réel, mais comme j'ai peu d'expérience avec lui, je l'écrirai peut-être de manière inefficace. Notez s'il vous plaît.

Importer la bibliothèque

Cette fois, nous n'utiliserons que cette bibliothèque, alors importez-la au début.

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd
from math import log
from janome.tokenizer import Tokenizer
from janome.analyzer import Analyzer
from janome.tokenfilter import POSStopFilter
from sklearn.feature_extraction.text import CountVectorizer
import numpy as np

Obtenez le titre du résultat de la recherche

Utilisez BeautifulSoup pour récupérer les résultats de recherche Google.

#En-tête de la demande
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"}
list_keywd = ['Mot clé 1','Mot clé 2']
input_num = 10
url = 'https://www.google.co.jp/search?num={}&q='.format(input_num) + ' '.join(list_keywd)

#Lien
response = requests.get(url, headers=headers)

#Vérifier le code d'état HTTP (gestion des exceptions sauf 200)
response.raise_for_status()

#Analyser le HTML récupéré
soup = bs(response.content, 'html.parser')

#Obtenez les titres et les liens des résultats de recherche
ret_link = soup.select('.r > a')
#Pour éviter d'enlever les restes de pain
ret_link2 = soup.select('.r > a > h3')

title_list = []
url_list = []
leng = len(ret_link)
r_list = []
cols = ['title','url']

for i in range(len(ret_link)):
    #Récupérer la partie texte du titre
    title_txt = ret_link2[i].get_text()

    #Obtenez uniquement le lien et supprimez la partie supplémentaire
    url_txt = ret_link[i].get('href').replace('/url?q=','')

    title_list.append(title_txt)
    url_list.append(url_txt)
 
    tmp = []
    tmp = [title_txt,url_txt]
    r_list.append(tmp)

#Afficher les résultats de la recherche
df = pd.DataFrame(r_list,columns=cols)
df

Les 10 meilleurs sites dans les résultats de recherche Google pour un certain mot-clé étaient les suivants.

01.png

Analyse morphologique de l'écriture distincte du titre

Maintenant que nous avons obtenu les titres des 10 meilleurs sites, nous allons tout faire de l'analyse morphologique à la division. Janome a été utilisé pour l'analyse morphologique.

#Enregistrez séparément la nomenclature de chaque blog
work = []
WAKATI = []
for i in BLOG.keys():
    texts_flat = "".join(BLOG[i]["title"])
    tokens = a.analyze(texts_flat)
    work.append(' '.join([t.surface for t in tokens]))
    WAKATI.append(work[i].lower().split())
#Vérification
for i in BLOG.keys():
    print("■WAKATI[{}]: {}".format(i,WAKATI[i]))

#scikit-Calculez la fréquence d'occurrence des mots avec learn
vectorizer = CountVectorizer()

#Calcul de l'arc
X = vectorizer.fit_transform([work[i] for i in range(len(work))])
WORDS = vectorizer.get_feature_names()
WORDS.sort()
print('=========================================')
print('Tous les mots')
print('=========================================')
print(WORDS)

Il a été analysé de cette manière. 02.png

Définition des fonctions

Cette fois, j'ai écrit une fonction pour trouver la valeur tf, la valeur idf et la valeur tf-idf.

#Définition des fonctions
def tf(t, d):
  return d.count(t)/len(d)

def idf(t):
  df = 0
  for wak in WAKATI:
    df += t in wak
  
  #return log(N/df) + 1
  return log(N/np.array(df)) + 1

def tfidf(t,d):
  return tf(t,d) * idf(t)

def highlight_negative(val):
    if val > 0:
        return 'color: {0}; font-weight: bold'.format('red')
    else:
        return 'color: {0}'.format('black')
#Fin de la définition de fonction

Regardons la valeur tf

Tout d'abord, regardons la valeur tf.

#calcul tf
print('■ Valeur TF pour chaque site')
print('Fréquence d'apparition dans un document')
ret = []
for i in range(N):
    ret.append([])
    d = WAKATI[i]
    for j in range(len(WORDS)):
        t = WORDS[j]
        if len(d) > 0:
            ret[-1].append(tf(t,d))

tf_ = pd.DataFrame(ret, columns=WORDS)
tf_.style.applymap(highlight_negative)

Comme le montre la figure ci-dessous, la valeur tf a été acquise. Les mots de partie utilisés sont écrits en rouge. "Mask" et "cool" sont utilisés dans de nombreux titres. Vous pourrez peut-être trouver le mot recherché uniquement par la valeur tf.

03.png

Regardons la valeur idf

Plus la valeur idf est élevée, moins elle est susceptible d'apparaître dans d'autres titres, ce qui en fait un mot rare. Inversement, plus la valeur est petite, plus elle est utilisée.

#calcul idf
ret = []
for i in range(len(WORDS)):
  t = WORDS[i]
  ret.append(idf(t))

idf_ = pd.DataFrame(ret, index=WORDS, columns=["IDF"])
idf_s = idf_.sort_values('IDF')
idf_s.style.applymap(highlight_negative)

04.png Quant à la valeur tf, la valeur idf de "mask" et "cool" qui apparaissait souvent est naturellement petite. Dans ce résultat, la valeur 2.609438 apparaît sur 2 sites et la valeur 3.302585 apparaît sur un seul site.

Regardons la valeur tf-idf

Plus la valeur tf-idf est élevée, plus le mot est important dans le titre.

ret = []
for i in range(N):
  ret.append([])
  d = WAKATI[i]
  for j in range(len(WORDS)):
    t = WORDS[j]
    if len(d) > 0:
        ret[-1].append(tfidf(t,d))

tfidf_ = pd.DataFrame(ret,columns=WORDS)
tfidf_.style.applymap(highlight_negative)

Le résultat ressemble à ceci. La ligne est le site et la colonne contient tous les mots. La valeur des mots qui n'apparaissent pas sur le site est "0". En regardant chaque site, on peut dire qu'un mot avec une grande valeur a un grand rôle dans le titre du site. 05.png

Résumé

Vous pouvez vérifier les fonctionnalités comme celle-ci. Cela peut être utile lorsque vous trouvez un mot à insérer, tel que le titre du site.

Recommended Posts

[Python] Explorez les caractéristiques des titres des meilleurs sites dans les résultats de recherche Google
Google recherche la chaîne sur la dernière ligne du fichier en Python
À la recherche du FizzBuzz le plus rapide en Python
Gratter les résultats de recherche de Google Actualités en Python (2) Utiliser Beautiful Soup
Vérifiez le comportement du destroyer en Python
Le résultat de l'installation de python sur Anaconda
Principes de base pour exécuter NoxPlayer en Python
Le client API pour le plan du site dans la console de recherche Google est dans les webmasters au lieu de searchconsole
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Sortie du nombre de cœurs de processeur en Python
[Python] Trier la liste de pathlib.Path dans l'ordre naturel
Fonctionnement sans assistance des feuilles de calcul Google (etc.) en Python
Récupérer l'appelant d'une fonction en Python
Faites correspondre la distribution de chaque groupe en Python
Afficher le résultat du traitement de la géométrie en Python
Copiez la liste en Python
Découvrez la fraction de la valeur saisie en python
Trouvez la solution de l'équation d'ordre n avec python
L'histoire de la lecture des données HSPICE en Python
[Note] À propos du rôle du trait de soulignement "_" en Python
Résolution d'équations de mouvement en Python (odeint)
Sortie sous la forme d'un tableau python
Rechercher par la valeur de l'instance dans la liste
[Sélénium Python] Titre et URL de la sortie CSV après avoir récupéré les résultats de recherche Google
Obtenez les résultats de la recherche de balises de la vidéo Nico Nico au format XML. (Aucune connexion requise)
Une histoire sur un débutant Python essayant d'obtenir des résultats de recherche Google à l'aide de l'API
Découvrez la bonne efficacité de calcul de la vectorisation en Python
Comment obtenir le nombre de chiffres en Python
À la recherche du meilleur stéréogramme à points aléatoires (RDS).
Obtenez l'image de "Suzu Hirose" par recherche d'images Google.
Python - Explication et résumé de l'utilisation des 24 meilleurs packages
[python] Récupère la liste des classes définies dans le module
L'histoire de FileNotFound en Python open () mode = 'w'
Apprenez le modèle de conception «Chaîne de responsabilité» en Python
Implémenter la solution de l'algèbre de Riccati en Python
Obtenir la taille (nombre d'éléments) de Union Find en Python
Ne pas être conscient du contenu des données en python
Différence de résultats en fonction de l'argument du multiprocessus.
Reproduire l'exemple d'exécution du chapitre 4 de Hajipata en Python
Utilisons les données ouvertes de "Mamebus" en Python
Implémentation de l'algorithme "Algorithm Picture Book" en Python3 (Heap Sort Edition)
[Python] Affiche toutes les combinaisons d'éléments de la liste
Utiliser l'API de recherche de la Bibliothèque du Parlement national en Python
Obtenez l'URL de la destination de la redirection HTTP en Python
Un mémorandum sur la mise en œuvre des recommandations en Python
Reproduire l'exemple d'exécution du chapitre 5 de Hajipata en Python
Pour faire l'équivalent de Ruby ObjectSpace._id2ref en Python
Vérifiez la nature atrophique de la distribution de probabilité en Python
Dichotomie avec Python
le zen de Python
Recherche linéaire en Python
Recherche binaire en Python
Script Python qui va de la recherche Google à l'enregistrement de la page de résultats de recherche à la fois
J'ai vérifié le package Python pré-installé dans Google Cloud Dataflow
Découvrez la largeur apparente d'une chaîne en python
Visualisez les résultats des arbres de décision réalisés avec Python scikit-learn
Mesurons le résultat de l'exécution du programme avec C ++, Java, Python.
Vérifiez le fonctionnement de Python pour .NET dans chaque environnement
[Mémo] Le mystère des instructions d'affectation cumulative dans les fonctions Python