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à.
J'ai pu faire quelque chose comme ça. 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.)
Je vais le créer en utilisant.
Je vais poursuivre la procédure.
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.
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.
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! !!
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.
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