みなさんいかがお過ごしでしょうか。もうすぐ引きこもり生活6か月目であることに気づいたぴのです。そろそろ引きこもりすぎて喋り方を忘れそうです。
引きこもり生活のお供に、国と大学からもらった給付金で大量に書籍を買いました。最近は管理人の中で、紙媒体のコレクション性よりも電子書籍の利便性が勝り、普通の漫画や小説は電子書籍で買うようになりました。やはり買いに行く手間がいらず、場所も取らないのがすごくいいです。
さて、みなさんは「なろう系小説」というものをご存じでしょうか。「小説家になろう」という小説投稿サイトによく投稿されるタイプの小説で、「なろうテンプレ」などといった言葉も存在するくらい異世界に転生したりチートスキルで無双したりするアレです。
今回は「小説家になろう」に投稿されている小説のタイトルから、頻出する単語を抽出してみようと思います。これを知っておけば、タイトルだけで「なろう系小説」を見分けられるようになる!…かもしれないぞ!
やりかた
「ウェブスクレイピング」という技術を使って、特定のウェブサイトから欲しい情報を抽出します。今回の場合は、「小説を読もう!」という「小説家になろう」に投稿された小説を検索できるサイトから、各小説のタイトル情報を抜き出していきます。
ウェブスクレイピング
開発環境
「Google Colaboratory」というPythonが便利に書けるクラウド上の開発環境を使用します。グーグルドライブと連携できて便利です。
処理のイメージ
- 「小説を読もう」の検索ページにアクセスする(20タイトル/1ページ)
- HTMLのコードを抽出する
- タイトルを囲っているタグ(<a class=”tl” …>)の条件を指定し、タイトル部分を抽出する
- タイトルをトークン(単語)ごとに分解し、それぞれに対し名詞なら辞書に追加するor値を1増やす
- 1-4を任意の回数繰り返す
- 辞書を降順にソートする
なお、今回は「総合ポイント」の高い順から2000タイトルを抽出しました。
ソースコード
#ライブラリのインストール&インポート
!pip install requests
!pip install beautifulsoup4
!pip3 install janome
import requests
from bs4 import BeautifulSoup
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()
dic = {}
#ウェブスクレイピング
for i in range(100): #20title/page
url = 'https://yomou.syosetu.com/search.php?&order_former=search&order=hyoka¬nizi=1&p=' + str(i+1) #検索対象のURL
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'} #ブラウザ情報
response = requests.get(url, headers = headers)
soup = BeautifulSoup(response.text, "html.parser")
elems = soup.find_all('a', class_ = 'tl') #タイトル部抽出
for elem in elems:
for token in tokenizer.tokenize(elem.contents[0]): #品詞分解
if token.part_of_speech[0] == '名':
dic[token.surface] = dic[token.surface] + 1 if token.surface in dic else 1
#頻出順にソート
dic_sorted = sorted(dic.items(), key=lambda x:-x[1])
dic_sorted[:30]
これがなろう頻出単語TOP30だ!
[('~', 479),
('世界', 450),
('最強', 240),
('転生', 222),
('俺', 174),
('者', 162),
('令嬢', 160),
('\u3000~', 140),
('勇者', 112),
('版', 95),
('スキル', 94),
('冒険', 89),
('魔法', 87),
('悪役', 84),
('師', 81),
('魔王', 68),
('追放', 65),
('チート', 63),
('私', 60),
('ライフ', 60),
('生活', 57),
('ダンジョン', 57),
('無双', 56),
('英雄', 56),
('婚約', 56),
('魔', 55),
('記', 54),
('聖女', 52),
('人', 52),
('魔術', 51)]
「転生者の俺、チートスキルで世界最強」みたいなタイトルはなろう頻出単語役満ってことが良くわかる結果になりましたね!
「\u3000~」というのはおそらく全角空白がうまく単語分解できなかったものと思われます。「~」と合わせてサブタイトルがつくタイトルが多いことが伺えます。
おわりに
晩御飯を食べながら思いついたネタでしたが、きちんと動作してよかったです。
最初は全タイトル(約750000件)抽出しようかと思ったのですが、DoS攻撃(サイトに大量にアクセスしてサーバーに過負荷をかけるサイバー攻撃)になりそうで怖かったので止めました。たぶん時間も相当かかるしね。
【2020/7/23訂正】DDoS攻撃は複数のサーバーからのDoS攻撃という意味なので、今回の場合はDoS攻撃
見直してみるとやっぱりどこかで見たことある単語が大量ですね…これでいつ隠れなろう小説に出会っても見抜けますね!やったぜ!
コメント