Cette fois, nous parlerons de créer un modèle qui prédit le nombre de vues à partir du titre de la vidéo de Jar Jal. Puisque la PNL est un amateur complet, j'ai essayé de l'imiter en me référant aux articles d'autres personnes.
Jar Jar est une ** combinaison riante la plus vigoureuse ** composée de Junpei Goto et Shusuke Fukutoku, qui appartiennent au siège de Yoshimoto Kogyo Tokyo. Actuellement, je publie des actualités quotidiennes sur le projet JARUJARU TOWER sur la chaîne YouTube officielle de Jarjaru. Je vais.
Il est très coûteux de vérifier chaque jour le matériel publié sur Youtube. De plus, les vidéos de Jar Jal ont tendance à se développer plus facilement avec des titres peu clairs (très subjectifs). Par exemple, "Le gars qui a été fait un mauvais client par un mauvais employé" "[Le gars aux œufs du dictateur](https: // www. youtube.com/watch?v=RPXFYBRJVMw) ". Si le titre contient des mots tels que "Dangereux, fou", j'estime que le nombre de vues est généralement élevé. En revanche, l'histoire "Le gars qui voit l'histoire de Chara Man Bancho" a tendance à être jouée moins fréquemment, et tout le monde dans la vidéo avec ce titre * C'est un événement annuel pour donner une note basse ** sans se poser de questions.
Cette fois, nous utiliserons l'API Youtube Data pour collecter les titres vidéo et les vues sous forme d'ensemble. L'article "Utilisation de l'api YouTube Data v3 de Python pour obtenir des vidéos d'une chaîne spécifique [^ 1]" et "Utilisation de l'api YouTube Data v3 de Python pour obtenir le nombre de vidéos visionnées doucement [^ 2]" J'ai fait référence à l'article. De plus, comme la clé API est requise pour utiliser l'API Youtube, "Comment obtenir la clé API de l'API YouTube [^ 3]", j'ai obtenu la clé en me référant à cet article. Tout d'abord, collectez le titre et l'ID vidéo du code vidéo ci-dessous (requis pour obtenir le nombre de vues de la vidéo).
jarujaru_scraping1.py
import os
import time
import requests
import pandas as pd
API_KEY = os.environ['API_KEY']#Apportez l'ID ajouté à la variable d'environnement
CHANNEL_ID = 'UChwgNUWPM-ksOP3BbfQHS5Q'
base_url = 'https://www.googleapis.com/youtube/v3'
url = base_url + '/search?key=%s&channelId=%s&part=snippet,id&maxResults=50&order=date'
infos = []
while True:
time.sleep(30)
response = requests.get(url % (API_KEY, CHANNEL_ID))
if response.status_code != 200:
print('Se termine par une erreur')
print(response)
break
result = response.json()
infos.extend([
[item['id']['videoId'], item['snippet']['title'], item['snippet']['description'], item['snippet']['publishedAt']]
for item in result['items'] if item['id']['kind'] == 'youtube#video'
])
if 'nextPageToken' in result.keys():
if 'pageToken' in url:
url = url.split('&pageToken')[0]
url += f'&pageToken={result["nextPageToken"]}'
else:
print('Réussite')
break
videos = pd.DataFrame(infos, columns=['videoId', 'title', 'description', 'publishedAt'])
videos.to_csv('data/video1.csv', index=None)
Après avoir collecté les titres et identifiants vidéo, utilisez le code ci-dessous pour collecter le nombre de vues.
jarujaru_scraping2.py
import os
import time
import requests
import pandas as pd
API_KEY = os.environ['API_KEY']
videos = pd.read_csv('videos.csv')
base_url = 'https://www.googleapis.com/youtube/v3'
stat_url = base_url + '/videos?key=%s&id=%s&part=statistics'
len_block = 50
video_ids_per_block = []
video_ids = videos.videoId.values
count = 0
end_flag = False
while not end_flag:
start = count * len_block
end = (count + 1) * len_block
if end >= len(video_ids):
end = len(video_ids)
end_flag = True
video_ids_per_block.append(','.join(video_ids[start:end]))
count += 1
stats = []
for block in video_ids_per_block:
time.sleep(30)
response = requests.get(stat_url % (API_KEY, block))
if response.status_code != 200:
print('error')
break
result = response.json()
stats.extend([item['statistics'] for item in result['items']])
pd.DataFrame(stats).to_csv('data/stats.csv', index=None)
videos = pd.read_csv('videos.csv')
stasas = pd.read_csv('stats.csv')
pd.merge(videos, stasas, left_index=True, right_index=True).to_csv('data/jarujaru_data.csv')
Les données suivantes sont enregistrées.
Cette fois, je vais diviser le nombre de vues en trois étapes et en faire un problème de classification. L'histogramme du nombre de lectures est le suivant. À partir du graphique ci-dessous, nous allons étiqueter avec une subjectivité écrasante. Le nombre de vues est inférieur à 100 000, 100 000 ou plus et inférieur à 250 000 et 250 000 ou plus.
Le code ci-dessous est un code qui ne prend que le nom du contrôle de l'étiquetage et du titre de la vidéo. La vidéo conte de Jar Jal utilise toujours le nom du conte entre "".
jarujaru_scraping3.py
import re
import pandas as pd
info = []
df = pd.read_csv('data/jarujaru_data.csv')
for row, item in df.iterrows():
if '『' in item['title']:
title = 'x' + item['title']
title = re.split('[『』]', title)[1]
if item['viewCount'] >= 250000:
label = 2
elif 100000 <= item['viewCount'] < 250000:
label = 1
elif item['viewCount'] < 100000:
label = 0
info.extend([[title, item['viewCount'], item['likeCount'], item['dislikeCount'], item['commentCount'], label]])
pd.DataFrame(info, columns=['title', 'viewCount', 'likeCount', 'dislikeCount', 'commentCount', 'label']).to_csv('data/jarujaru_norm.csv')
Reportez-vous à cet article [^ 4] pour analyser morphologiquement le titre du champ et convertir le titre en vecteur de caractéristiques (format Bag-of-words). Ci-dessous se trouve une partie du code. Toutes les implémentations seront publiées sur GitHub [^ 5].
jarujaru.py
import analysis #Je le publierai sur mon propre code, GitHub.
import pandas as pd
from gensim import corpora
from gensim import matutils
def vec2dense(vec, num_terms):
return list(matutils.corpus2dense([vec], num_terms=num_terms).T[0])
df = pd.read_csv('data/jarujaru_norm.csv')
words = analysis.get_words(df['title']) #Entrez ici le titre analysé morphologiquement
#Faire un dictionnaire
dictionary = corpora.Dictionary(words)
dictionary.filter_extremes(no_below=2, keep_tokens=['Chara','Homme','Bancho'])
dictionary.save('data/jarujaru.dict')
courpus = [dictionary.doc2bow(word) for word in words]
# Bag-of-Convertir au format de mots
data_all = [vec2dense(dictionary.doc2bow(words[i]),len(dictionary)) for i in range(len(words))]
Cette fois, nous avons adopté SVM comme modèle car le nombre de données est petit. Divisez les données en données d'entraînement et données de test et plongez-vous dans le modèle.
jarujaru.py
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
#Définition des données de test d'entraînement
train_data = data_all
X_train, X_test, y_train, y_test = train_test_split(train_data, df['label'], test_size=0.2, random_state=1)
#Standardisation des données
sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)
#Créer un modèle d'apprentissage
clf = SVC(C = 1, kernel = 'rbf')
clf.fit(X_train_std, y_train)
import pickle
with open('data/model.pickle', mode='wb') as fp:
pickle.dump(clf, fp)
Évaluons le modèle.
jarujaru.py
score = clf.score(X_test_std, y_test)
print("{:.3g}".format(score))
predicted = clf.predict(X_test_std)
La précision était de 53%. C'est 33%, donc je suis capable d'apprendre (même si c'est terrible). Regardons également le processus de confusion. Il semble que la plupart des vidéos soient un modèle robuste qui prédit plus de 100 000 lectures.
Cette fois, j'ai réalisé un modèle qui prédit le nombre de vues à partir du titre de la vidéo de Jar Jal. Étant amateur de PNL, je ne connaissais pas grand-chose à la vectorisation de phrases, mais j'ai pu créer un modèle jusqu'à la fin. Toutes les implémentations seront publiées sur GitHub [^ 5]. La prochaine fois, j'utiliserai ce modèle pour développer un "bot LINE qui vous avertira si cela vaut la peine de regarder une vidéo Jar Jal". Je souhaite également étudier la méthode de vectorisation des phrases et des modèles qui gèrent les données de séries temporelles (LSTM, etc.).
[^ 1]: Obtenez des vidéos pour une chaîne spécifique à l'aide de l'API YouTube Data v3 de Python [^ 2]: Utilisez l'API YouTube Data v3 de Python pour obtenir en douceur le nombre de vues de la vidéo [^ 3]: Comment obtenir la clé API de l'API YouTube [^ 4]: Prédire la classification des articles de presse par apprentissage automatique [^ 5]: Code source de cette époque
Recommended Posts