[PYTHON] "Le gars qui prédit le nombre de vues à partir du titre de la vidéo de Jar Jal"

introduction

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.

Qu'est-ce que Jar Jal

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. 01d318f64a7d2aec966c8def02c80acc2b69fcd3.jpg

Contexte

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. スクリーンショット 2019-12-20 13.51.23.png

Environnement de développement

Collecte de données

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. スクリーンショット 2019-12-20 14.43.11.png

Modèle de prédiction de lecture

Étiquetage

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. image.png

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

Solution morphologique, etc.

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

Apprentissage de modèle

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. image.png

À la fin

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

"Le gars qui prédit le nombre de vues à partir du titre de la vidéo de Jar Jal"
Obtenez le nombre de vues de Qiita
Obtenez le titre de la chanson à partir du titre de la vidéo que vous avez chanté
Le gars qui télécharge de l'audio à partir de listes de lecture YouTube
Une introduction à l'analyse de données à l'aide de Python - Pour augmenter le nombre de vues vidéo -
Le gars qui obtient les données Fitbit du serveur
Calcul du nombre minimum de voix requis à partir du taux de vote
Le gars qui génère la démarque pour Hugo de Qiita
[Python] Obtenez le nombre de vues de tous les articles publiés
Visualisez le nombre de plaintes des compagnies d'assurance-vie
Examiner la plage d'erreur dans le nombre de décès dus à la pneumonie
10. Compter le nombre de lignes
Obtenez le nombre de chiffres
Calculez le nombre de changements