Je souhaite connaître les caractéristiques des titres des 10 meilleurs sites recherchés par Google avec un certain mot-clé.
Cette fois, j'écrirai avec le notebook Jupyter, il doit donc être installé.
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.
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
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.
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.
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
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.
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)
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.
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.
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