[PYTHON] Racler votre article Qiita pour créer un nuage de mots

introduction

Cela fait six mois que je suis devenu ingénieur, donc pour regarder en arrière, j'ai essayé de créer un nuage de mots en grattant les données textuelles des articles que j'ai publiés jusqu'à présent. Je voudrais quitter la procédure à ce moment-là.

Formulaire rempli

J'ai pu faire quelque chose comme ça. スクリーンショット 2020-05-08 10.43.08.png Le grand mot "composant" est probablement dû au fait que Vue.js "Introduction au" composant " parle des composants des composants. Après cela, il y a eu beaucoup de choses comme heroku, Docker, Flask, etc., et j'ai écrit des articles, ce qui m'a rendu nostalgique. Il existe de nombreux mots à usage général tels que «changement» et «addition», vous pouvez donc définir un mot vide si vous le souhaitez. Au fait, My Hatena Blog a également gratté de la même manière pour créer un nuage de mots. Ceci est l'image d'en-tête de Twitter, alors jetez un œil. (C'est intéressant parce que ça dit quelque chose de complètement différent.)

environnement

Je vais le créer en utilisant.

Procédure approximative

  1. Scraping pour obtenir des données textuelles
  2. Divisez en mots grâce à un analyseur morphologique (MeCab)
  3. Créez un nuage de mots

Je vais poursuivre la procédure.

Grattage

Utilisez get items dans Qiita API. La syntaxe de RequestURL est la suivante.

https://qiita.com/api/v2/items?page={{numéro de page}}&per_page={{Nombre d'articles par page}}&query=user%3A{{Identifiant d'utilisateur}}

Par exemple, si vous souhaitez obtenir 100 articles de moi (kiyokiyo_kzsby), vous pouvez envoyer la demande suivante.

https://qiita.com/api/v2/items?page=1&per_page=100&query=user%3Akiyokiyo_kzsby

La réponse sera renvoyée au format JSON.

[
  {
    "rendered_body": "<h1>Example1</h1>",
    (Abréviation)
    "title": "Example title 1",
    (Abréviation)
  },
  {
    "rendered_body": "<h1>Example2</h1>",
    (Abréviation)
    "title": "Example title 2",
    (Abréviation)
  },
・ ・ ・
]

Extrayez «rendu_body» et «titre» de ceci et utilisez-les pour le nuage de mots.

Si vous mettez le code ci-dessus dans du code Python, cela ressemble à ceci.

qiita_scraper.py


import requests
import json
from bs4 import BeautifulSoup

def scrape_all(user_id):
    text = ""
    r = requests.get("https://qiita.com/api/v2/items?page=1&per_page=100&query=user%3A" + user_id)
    json_list = json.loads(r.text)
    for article in json_list:
        print("scrape " + article["title"])
        text += article["title"]
        content = article["rendered_body"]
        soup = BeautifulSoup(content, "html.parser")
        for valid_tag in soup.find_all(["p","li","h1","h2","h3","h4","table"]):
            text += valid_tag.text
    return text

requests est une bibliothèque qui exécute des requêtes HTTP, json est une bibliothèque qui gère JSON et BeautifulSoup est une bibliothèque qui gère le HTML. Mettons chacun dans pip install. (Pour Beautiful Soup, cet article est bon.)

$ pip install requests
$ pip install json
$ pip install beautifulsoup4

Spécifiez la balise html à lire avec soup.find_all ([" p "," li "," h1 "," h2 "," h3 "," h4 "," table "]) sur la troisième ligne à partir du bas. Je suis. Au début, j'ai essayé de lire tout le texte, mais le code intégré était également inclus, et le nuage de mots résultant est devenu uniquement des mots qui apparaissent souvent dans le code comme pour et si, donc seule la partie de texte Ceci est spécifié pour extraire. Veuillez ajuster cette zone à votre convenance.

Analyse morphologique

Contrairement à l'anglais, le texte japonais gratté n'est pas divisé en mots, donc si vous vous contentez de fouiller dans la bibliothèque de génération de nuage de mots, cela ne fonctionnera pas. Par conséquent, une analyse morphologique est effectuée pour diviser (séparer) en mots. Cette fois, nous utiliserons un analyseur morphologique appelé Mecab. J'ai beaucoup parlé de cet article.

Tout d'abord, installez les bibliothèques requises pour installer Mecab.

brew install mecab mecab-ipadic git curl xz

Ensuite, nous installerons le corps principal de Mecab.

brew install mecab mecab-ipadic

Tapez «mecab» sur le terminal et entrez une phrase pour effectuer une analyse morphologique. (La fin est Contrôle + C)

$ mecab
Des cuisses et des cuisses
Sumomo substantif,Général,*,*,*,*,Sumomo,Sumomo,Sumomo
Aussi assistant,Assistance,*,*,*,*,Aussi,Mo,Mo
Cuisse substantif,Général,*,*,*,*,Les pêches,pêche,pêche
Aussi assistant,Assistance,*,*,*,*,Aussi,Mo,Mo
Cuisse substantif,Général,*,*,*,*,Les pêches,pêche,pêche
Mots auxiliaires,syndicat,*,*,*,*,de,Non,Non
Dont nomenclature,Non indépendant,Avocat possible,*,*,*,domicile,Uchi,Uchi
EOS

Maintenant, vous êtes prêt à partir. Écrivons maintenant le code pour effectuer une analyse morphologique en Python. Pour le code Python, j'ai fait référence à cet article.

mecab.py


import MeCab as mc

def mecab_analysis(text):
    print("start mecab analysis")
    t = mc.Tagger('-Ochasen')
    node = t.parseToNode(text)
    output = []
    while(node):
        if node.surface != "":
            word_type = node.feature.split(",")[0]
            if word_type in ["adjectif","nom"]:
                output.append(node.surface)
        node = node.next
    print("end mecab analysis")
    return output

Nous allons utiliser la bibliothèque MeCab, alors faisons pip install.

$ pip install mecab-python3

La cinquième ligne à partir du bas, ʻif word_type in ["advocate", "noun"]: `, limite les mots inclus dans la sortie à" adjective "et" noun ". Si vous souhaitez inclure des adjoints et des verbes, vous pouvez les ajouter à ce tableau.

Créer un nuage de mots

Maintenant que nous avons divisé le texte gratté en mots jusqu'à l'étape précédente, plongeons enfin dans la bibliothèque de nuages de mots pour le compléter. Tout d'abord, suivez le LISEZMOI de la bibliothèque Word Cloud pour pip install. Installez également la bibliothèque de dessins d'écran matplotlib.

$ pip install wordcloud
$ pip install matplotlib

Ensuite, écrivez le code Python comme suit. Pour le code Python, j'ai fait référence à cet article.

word_cloud.py


import matplotlib.pyplot as plt
from wordcloud import WordCloud

def create_wordcloud(text):
    print("start create wordcloud")

    #Spécifiez le chemin de police en fonction de l'environnement.
    fpath = "/System/Library/Fonts/Hiragino Mincho ProN.ttc"

    #Arrêter le réglage du mot
    stop_words = [ u'Teru', u'Est', u'Devenir', u'Être', u'Faire', u'y a-t-il', u'chose', u'cette', u'M.', u'fais le', \
             u'Donnez-moi', u'faire', u'Donnez-moi', u'alors', u'Laisser', u'fait',  u'pense',  \
             u'Il', u'ici', u'Chan', u'Kun', u'', u'main',u'À',u'À',u'Est',u'de', u'Mais', u'Quand', u'Ta', u'Shi', u'alors', \
             u'Absent', u'Aussi', u'Nana', u'je', u'Ou', u'Alors', u'Yo', u'', u'Aussiの', u'cette semaine', u'Résumé',u'Pour', \
             u'La désignation', u'Si', u'Moins que', u'Créer', u'Yo', u'partie', u'Fichier', u'Utilisation', u'utilisation']

    wordcloud = WordCloud(background_color="white",font_path=fpath, width=800, height=500, \
                          stopwords=set(stop_words)).generate(text)
    print("end create wordcloud")

    print("now showing")
    plt.figure(figsize=(15,12))
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()

Le chemin de la police est spécifié dans la partie de fpath =" / System / Library / Fonts / Hiragino Mincho ProN.ttc " sur la 6ème ligne à partir du haut. Le chemin et le nom de la police peuvent différer selon le PC que vous utilisez, alors ajustez en conséquence. Les mots vides sont spécifiés après stop_words = sur la 8ème ligne à partir du haut. Les mots listés ici ne seront plus affichés sur le nuage de mots. Précisons des mots tels que «choses» et «choses» qui n'ont pas de sens mais qui sont fréquemment affichés comme de grandes déca.

Enfin, créons un fichier qui les traite collectivement, du scraping à la génération de nuage de mots.

main.py


from qiita_scraper import scrape_all
from mecab import mecab_analysis
from word_cloud import create_wordcloud

text = scrape_all("kiyokiyo_kzsby")
wordlist = mecab_analysis(text)
create_wordcloud(" ".join(wordlist))

User_id de Qiita est passé à l'argument de scrape_all sur la 4ème ligne. Vous pouvez également créer un nuage de mots pour un autre utilisateur en le modifiant.

Lorsque vous exécutez main.py, l'écran du nuage de mots s'ouvre après qu'un message comme celui-ci est craché dans le journal.

Étudiez les modèles de conception du GoF
Comprenez en quelque sorte les termes fréquemment utilisés de scrape DDD
(Omission)
scrape Résumé de l'algorithme AtCoder 400 points(Édition Java)
gratter AWS Solution Architect-Je veux trouver un associé
start mecab analysis
end mecab analysis
start create wordcloud
end create wordcloud
now showing

Oui! !! スクリーンショット 2020-05-08 10.43.08.png

En fait, je pense que cela sera complété en ajustant les paroles de la partie et les mots d'arrêt à partir d'ici. C'est amusant, alors jouez avec.

en conclusion

C'est bien parce que vous pouvez comprendre visuellement le type de sortie que vous avez créé lorsque vous essayez de créer un nuage de mots. Je pense qu'il est intéressant de voir des résultats différents même si vous changez la cible de scraping en Hatena Blog ou Twitter.

Recommended Posts

Racler votre article Qiita pour créer un nuage de mots
Si vous souhaitez créer Word Cloud.
J'ai créé un outil pour créer un nuage de mots à partir de wikipedia
Créer un nuage de mots à partir de programmes académiques
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
Migrer les articles Qiita vers GitHub
Migrer les articles Qiita vers WordPress
Créez le nuage de mots de Qiita à partir de l'historique de votre navigateur
Étapes pour créer un projet Django
Comment créer un package Conda
Créez un nuage de mots avec uniquement des mots positifs / négatifs sur Twitter
Comment créer un pont virtuel
J'ai essayé de résumer ce qui était sorti avec Qiita avec Word cloud
Comment créer un Dockerfile (basique)
5 façons de créer un chatbot Python
Comment créer un fichier de configuration
Essayez de créer un article de Qiita avec l'API REST [Préparation environnementale]
Créez des raccourcis pour exécuter des fichiers Python sur le terminal avec VScode
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
J'ai essayé de créer un linebot (implémentation)
Ajoutez une carte GPIO à votre ordinateur. (1)
Comment créer un clone depuis Github
Créer un bot pour retweeter les informations sur le virus corona
Comment créer un dossier git clone
Qiita (1) Comment écrire un nom de code
J'ai essayé de créer un linebot (préparation)
Créez un modèle pour votre planning Django
Créez un environnement python sur votre Mac
Migrer les articles Qiita vers GitHub Pages + VuePress
Créer un compteur de fréquence de mots avec Python 3.4
Différentes façons de créer un dictionnaire (mémoires)
Comment créer un référentiel à partir d'un média
Script pour créer un fichier de dictionnaire Mac
[Python] Compréhension de liste Différentes façons de créer une liste
Modifier Excel à partir de Python pour créer un tableau croisé dynamique
Je souhaite créer facilement un modèle de bruit
Comment créer un objet fonction à partir d'une chaîne
Je veux créer une fenêtre avec Python
Créer un ensemble de données en échantillonnant au hasard les données MNIST
Comment créer un fichier JSON en Python
Créez une sous-sous-commande à l'aide de la commande click --netsted sub-sub -
Étapes pour créer un bot Twitter avec Python
Comment se souvenir quand on oublie un mot
Essayez de créer une nouvelle commande sous Linux
Obtenez la liste "J'aime" de Qiita en grattant
Je souhaite créer un type d'implémentation pouvant être branché
[Note] Comment créer un environnement de développement Ruby
Comment créer une boîte de saisie Kivy 1 ligne
Procédure de création d'application multi-plateforme avec kivy
J'ai créé un outil pour obtenir de nouveaux articles
Comment créer une API Rest dans Django
Créez une roue de votre propre module OpenCV
Créez une commande pour obtenir le journal de travail
[Note] Comment créer un environnement de développement Mac
J'ai essayé de créer un cadre de données pandas en grattant les informations de rappel d'aliments avec Python