この記事は2024年度traP新歓ブログリレー 15日目の記事です。
22Bのikura-hamuです。ブログリレーに何書けばいいかわからなかったので、ブログリレーテーマジェネレーターを作りました。
ページ: https://blog-relay-generator.trap.show/
リポジトリ: https://github.com/ikura-hamu/blog-relay-generator
できること
- テーマを生成する
- テーマをクリップボードにコピーする
- テーマに「これすき」を押す
- 他の人の「これすき」一覧を見る
しくみ
今話題の生成AIではなく、地味なことをやっています。
タイトルの抽出
traPのブログをスクレイピングして、タイトルを抜き出します。HTMLからいい感じに<title>
要素を抜き取っています。
func scrape(client *http.Client, i int) string {
req := &http.Request{
Method: http.MethodGet,
URL: &url.URL{Scheme: "https", Host: "trap.jp", Path: fmt.Sprintf("/post/%d", i)},
}
res, err := client.Do(req)
if err != nil {
log.Println(err)
}
defer res.Body.Close()
tk := html.NewTokenizer(res.Body)
var title string
for {
tokenType := tk.Next()
if tokenType == html.ErrorToken {
break
}
tagName, _ := tk.TagName()
if bytes.Equal(tagName, []byte("title")) && tokenType == html.StartTagToken {
_ = tk.Next()
title = string(bytes.TrimRight(bytes.TrimSpace(tk.Text()), "| 東京工業大学デジタル創作同好会traP"))
break
}
}
return title
}
形態素解析
あとで出てくるkagome
を使ってタイトルを単語に分割し、それぞれの品詞を調べます。例えば『【 #ISUCON 】 最近の若者は ssh しないらしいですよ』ならこんな感じです。
【 記号,括弧開,*,*,*,*,【,【,【
記号,空白,*,*,*,*,*
# 名詞,サ変接続,*,*,*,*,*
ISUCON 名詞,固有名詞,組織,*,*,*,*
記号,空白,*,*,*,*,*
】 記号,括弧閉,*,*,*,*,】,】,】
記号,空白,*,*,*,*,*
最近 名詞,副詞可能,*,*,*,*,最近,サイキン,サイキン
の 助詞,連体化,*,*,*,*,の,ノ,ノ
若者 名詞,一般,*,*,*,*,若者,ワカモノ,ワカモノ
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
記号,空白,*,*,*,*,*
ssh 名詞,固有名詞,組織,*,*,*,*
記号,空白,*,*,*,*,*
し 動詞,自立,*,*,サ変・スル,未然形,する,シ,シ
ない 助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
らしい 助動詞,*,*,*,形容詞・イ段,基本形,らしい,ラシイ,ラシイ
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
よ 助詞,終助詞,*,*,*,*,よ,ヨ,ヨ
左が単語で、右が品詞や読みなどの情報です。ハッシュタグ#
がサ変接続の名詞になっているなど完璧ではないですが、ここでは目をつむります。最初は情報の一番最初のざっくりしたくくりの品詞、「最近」であれば「名詞」だけを使おうとしましたが、精度がいまいちで意味のある文章がなかなかできなかったので、もう一つ情報を増やして、「最近」であれば「(名詞,副詞可能)」として扱うようにしました。
ここから二つの情報をデータベースに入れます。
一つ目はそれぞれの単語の品詞、もう一つはブログリレーのタイトルとして存在する品詞の並びです。この『【 #ISUCON 】 最近の若者は ssh しないらしいですよ』であれば、19個の単語・記号に分割できたので、単語と品詞の対応を19個データベースに挿入し、品詞の列の情報として、
(記号,括弧開)(記号,空白)(名詞,サ変接続)(名詞,固有名詞)(記号,空白)(記号,括弧閉)(記号,空白)(名詞,副詞可能)(助詞,連体化)(名詞,一般)(助詞,係助詞)(記号,空白)(名詞,固有)(記号,空白)(動詞,自立)(助動詞,*)(助動詞,*)(助動詞,*)(助詞,終助詞)
をデータベースに入れます。
テーマを生成する
リクエストが来たら、まずは品詞の列からランダムに一つ選びます。その後、列の先頭から順番に、その品詞を持つ単語をランダムに選び、くっつけてテーマを生成します。
これによって、「ブログリレーで過去に使われた文型」の「ブログリレーで過去に使われた単語」でできた文章が生成されます。
生成されたテーマを見てみよう
リリース時に部員がたくさん遊んでくれて大量のテーマが生成されました。こちらのページから「これすき」が押されたテーマ一覧を見ることができます。
https://blog-relay-generator.trap.show/like
僕の好きないくつかのテーマを紹介します。
Discord 綺麗に納涼許さない
納涼はさせてほしいところです。575になっているのもお気に入りです。
TypeScript確定
確かにJavaScriptよりはいいかもしれません。
AdCのネタ...の創作
「AdC」は「アドベントカレンダー」の略です。アドベントカレンダーはクリスマス前の時期にやっているブログリレーです。まさにこの記事の内容です。
私のお基本って配列かもね☆・
配列人間ってことでしょうか。それとも配列をバックエンドとしたリストなんでしょうか。最後の「☆」がいいですね。
Gitea音楽
Gitea はGitのサービス(なんていうのかよくわからない)です。どんな音が鳴るのか気になります。サウンド班の人にぜひ作曲してほしいです。
ウイルスプログラミング作り71のコト
捕まります。
the writeup人生について
writeupは競プロやCTFの大会に参加した人がどんな感じで問題を解いたかを書く記事です。人生についてのwriteupはかなり気になります。「the」がついてるのもそれっぽくていいですね。
東急についての解説
東工大に入ると東急とは切っても切れない関係になります。大岡山キャンパスの目の前に東急ストアがありますし、特に電車で通学する人は毎日東急線に乗ることになります。案外新歓ブログリレーにふさわしい内容かもしれません。
使用技術
Goです。テンプレートを使って、サーバーアプリケーションから直接HTMLを配信しています。
Webフレームワーク: labstack/echo
いつものです。HTMLテンプレートの配信ははじめて使いました。
データベース: MariaDB
いつものです。部内PaaSであるNeoShowcaseのDBがMariaDBなので自動的に。
DBライブラリ: jmoiron/sqlx
SQL書くのが好きなのと、そんなに複雑なクエリを書かないこと、さくっと作りたかったことを踏まえて、sqlxになりました。シンプルなsqlx大好き。
形態素分析: ikawaha/kagome
日本語の文章を単語に分解して、品詞とかを教えてくれるライブラリです。以前のtraPのハッカソンで使ったことがあったので、今回も使いました。このライブラリを知らなかったら今回これを作ろうと考えなかったと思うので、日ごろからいろんなライブラリとか技術を見て回るの大事ですね。
(そのハッカソンの記事はこちら https://trap.jp/post/1899/)
デプロイ: NeoShowcase
部内PaaS基盤です。部内PaaS基盤ってすごいですよね。部内PaaS基盤です。
おわり
traPに入るとこうやってプログラミングをはじめとするいろんな技術で遊べます。楽しいですよ!
最後に開発中に出てきた一番のお気に入りのテーマを紹介します。
いい型......
...幸せ。