日本語のオノマトペを3000個あつめてGAE/GoとFirebaseでサービスを作る

logo_full_fill.png
https://matopee.com

Firebaseを管理画面側に、GAEを公開側に使って、日本語のオノマトペを集めて辞典などとして公開するサービスを作っています。まだまだ不足だらけですが、まずは3200件ちょっと集めたオノマトペの五十音別全一覧を中心に公開しています。

"五十音全一覧のスクリーンショット。「あ」から「お」までのオノマトペの一部を抜粋している。"

オノマトペにも過不足がありますし、古語や方言はまだほぼ手つかずです。今後は地道に語義を増やし、分類し、論文や書籍、Webなどの参考情報を集め、幾つか毛色の違うコンテンツの準備をしよう、という状況です。

オノマトペとは

サクサク、ぺったん、ガクブル、もちもち、どんより、ぐわーっ、ピシッなどは、すべてオノマトペです。

これらは"擬音語・擬態語・擬声語の総称"などと簡単に説明されていることが多いですが、定義は曖昧で、確立したものがありません。恣意性や音象徴性に着目しても一長一短で、合意を得られるような定義には至っていないようです。

サービスを作った動機の一つが、この定義を考える材料とすることでした。そのため、集めておきながら未だ定義がありません。ひとまず個人的な感覚を基準にしていますが、これを眺め、語義を考え、分類するなかで見出していこうと考えています。

日本語凄い論とオノマトペ

日本語はオノマトペが豊富な言語です。ただし世界の言語と比較すると、語数では上位グループの中位程度。オノマトペは決して日本語だけの特徴ではありませんし、際立って多くもありません。

しばしば「こんなにたくさんのオノマトペは日本語だけ! 特別! すごい!」という主張を見かけますが、明らかな間違いです(「日本だけで特別」という例, 「日本語以外では重要でない、擬態語は日本語だけ」という例)。
日本語が特別であってほしいという願望からなのか、単に英仏独辺り以外の言語を存在しないと思ってるのか、何にせよ誤りです。

オノマトペの位置づけ

日本語のオノマトペの豊富さは特別ではありませんが、特徴のひとつではあります。また重要なのも確かで、現代では特に個人的感覚の表現において、用いないと困難だったり冗長だったりするほどです。

言語学では古くから扱われてはきたようですが、日本語で本格的な研究が盛んになったのは戦後しばらくしてからです。
通常公文書等には登場しませんが、報道や医療などでも活用されるケースがあります。いずれも感覚に訴えたりそれを受け取ったりという、曖昧だが重要な個人的な感覚の共有が、以前より重視されてきたことによると考えられます。

とはいえ厳密さが求められる場では、やはりオノマトペは排除されます。また幼稚だと毛嫌いされるなど、詩歌や文学などで一段落ちる扱いもしばしばされます。こうした扱いの原因はオノマトペの曖昧さにあると考えています。

個人的主観的で、非定量的で、多義的ゆえに、論理の伝達からは除かれる。あるいは、露骨で幼児的で、生々しく、変化しやすいゆえに、格調や洗練の表現からは除かれる。一方で、日常的には欠かせない言語要素であり、また漫画に於いては会話以上に重要な役割がある。

こうしたオノマトペの性質は、学術研究などでは進んでいても、広く一般にはあまり露出していません。そこでオノマトペの収集や分類、論文の紹介、用例の蓄積、またいずれはコーパスとしての提供など、諸々を扱う場がほしいと考えました。そしてどうせなら、そろそろ辞典を作りたいという欲求も合わせて、まずはオノマトペの辞典を作ることにしました。

オノマトペの収集

集め始めた当時は収集をある程度仲間に任せ、Google Spreadsheetで管理していました。その時点で集めたのが700件強。ここで一旦企画は休止し、日本語のオノマトペ一覧(暫定703件)として公開しました。

その後仕切り直し、ひとりで登録することにしてからはFileMakerでの管理に切り替えました。
FileMakerは癖も強く古臭い所も多いですが、あまりに手に馴染んでいて、こうした用途には欠かせません。数十万件程度までは特に考えずに全文検索できますし、独特のリレーションシップさえ押さえれば、素早くロジック込みのフォームがよういできます。
今回の用途ではオノマトペの登録をブロックなく連続して行え、重複を防ぎ、表記ゆれや語長や文字種、語形などの確認をする、というフォームをFileMakerで作りました。実作業は15分程度。

このフォームに、過去に集めた700件強を取り込み、そこへ手入力でオノマトペを追加しました。ライセンスに縛られないデータとしたかったため、極力他の文献等は参照せず自分の記憶から入力。2000件程度までは順調でしたが、そこから3000件超えるまではやや苦しみました。3000件近く集まった辺りで、Firebaseによる管理に切り替えました。

FirebaseとVue + Vuetifyで管理画面

backstage.jpg

管理画面側にFirebaseを採用したのは、次の理由からです。

  1. Google App EngineのDatastoreがFirestoreベースとなった
  2. Authentication, Firestore, Hosting, Functionsと揃っている
  3. ゲームやアプリのバックエンド用に練習しておきたい

色々思い違いもありましたが、結果的にいい経験となり、今後もWebベースの管理画面付きのサービスは同じ構成で行こうと考えています。ただしなんとなくVueExなしのJavaScriptではじめてしまったのは後悔していて、次は必ずTSの、最初にVueEx導入を検討します。

管理画面フルスクラッチ病とVuetify

昔から自前のサービスでは特に、毎回管理画面をフルスクラッチしたくなる病にかかっています。優れたライブラリがあっても、些細な点が気に入らずに「自分でライブラリ書くんだ!」と、中途半端なモジュールを書き散らかし、時間を無駄にしてきました。

自分のサービスの管理画面という、ほぼ自分がユーザーだから起きるだめな繰り返しですが、今回はいい加減この状況も変えようと、なんでもいいので一通り揃ったGUIのライブラリを採用すると決めました。「なんとなくVue.jsのUIフレームワークを紹介する」などを見ながら、コンポーネントの豊富さと、Vue本体への追従が早そうなVuetifyを選択。

途中Vuetifyのメジャーバージョンが上がって手直しがありましたが、結果は満足しています。vue cliのおかげで、セットアップから開発サーバーまで一式揃いますし、Vuetifyのコンポーネントも色々活用できました。slotを使ったカスタマイズなども比較的柔軟で、特にData Tablesはごりごり使ってます。

管理画面の認証

以前のGoogle App Engineには、プロジェクトに管理者指定したGoogleアカウントしかアクセスできないapp.yamlのlogin: adminオプションが使えました。これはGoogleに全部投げられる手軽な管理者用認証でしたが、GAE独自のAPIが非推奨となっていき、最新のランタイムでは使えなくなりました。

当初、FirebaseのAuthenticationで、この代わりができそうだと誤解してしまいました。しかしFirebaseで用意されているGoogleアカウントのログインプロバイダは、GAEでいうUser API相当のもので、管理者アクセスの管理には使えませんでした。

結局カスタム クレームとセキュリティ ルールによるアクセスの制御を参考に、Firestore, Functionsを組み合わせて実現しています。認証の流れは、Vueで未ログイン時用のAppを作り、そこでログインボタンとfirebase.auth().signInWithPopup(provider)による認証を行う、としています。管理者の追加にUIDが必要な点は少し面倒ですが、これで login: admin に近い管理ができています。

ただしVueアプリケーションをHostingで提供しているため、管理者のみがアクセスできるはずの静的なリソースに、認証せずアクセスできてしまいます。全てのリクエストをFunctions経由にする方法もありますが、それならGAEでホストした方がよっぽど手軽です。

もちろんFirestoreのrulesでは管理者のみ読み書きを許可していますし、パブリック側はGAEのサービスアカウントでFirestoreに触るため、Firestoreのデータにアクセスされる可能性はありません。それでも静的なリソースへのアクセスの可能性は残るため、この点が課題です。

Firestoreのオフライン永続性とVuetifyのData Table

オノマトペは初期でも3000件程度あり、最大で数万件を想定しています。これをFirestoreのような従量制のDBで扱うと、readだけでもなかなかのコストが生じます。かといって、詳細なキャッシュの仕組みを時前で作りたくありません。

またFirestoreはクエリが貧弱というか、おまけのようなものなので、「"くに"を含んだ登録済みのオノマトペをざくっと見たい」「"◯る◯る"に該当するのは何件?」といった要求にも応えにくいです。

この問題を、Firestoreのオフライン永続性とVuetifyのData Tableを組み合わせて解決しました。

Firestoreには、PWAなどで使えるオフラインデータ永続性の機能が用意されています(オフラインでデータにアクセスする)。本来は名称の通りオフライン用の機能ですが、オンライン時にも手動で使えます。これにより一旦キャッシュに全件取得してしまえば、複雑なクエリに相当する問い合わせが、全てローカルで行えます。

取得したオノマトペは、VuetifyのData Tablesで扱います。その名の通りデータ表示用の高機能なテーブルコンポーネントで、カスタムのフィルタやソートも柔軟に指定できるため、ややこしい要求にも応えられ、手抜きっぽくない見た目や基本機能が付いてきます。

Google App Engine / Go でパブリック

管理画面はFirebaseを使いますが、パブリック側は使い慣れたGAE/Goを使っています。

SPAである必要性も薄く、readのみをサービスアカウントで実行するのでFirestoreのルールもadminのみ読み書きなシンプルな状態にできます。結果は全てCloudflareを通し、

Go 1.12のGAE/Go

Google App Engineは以前にまとめた状況(2016年半ば現在のGoogle App Engine)から、大きく変わりました。

最新のランタイムでは、もはやAppengine独自のAPIが使えません。詳しくは「App EngineアプリをGo 1.12に移行する」などにありますが、もはや我々の愛した閉じたGAEは死に、GCPの一員として、迅速なスケールとトラフィックの制御、バージョニングなどを特徴とした、コンピューティングの選択肢に過ぎなくなりました。

とはいえ移行してしまえば便利なもので、特にこれまで制約のあったインスタンスが一般的なLinuxに近い状態となったことで、ポータビリティは格段に上がっています。どこで実行しても動くGoのアプリケーションを作れば、app.yamlを足すだけでGAEでも動くのです。dev_appserver.pyは懐かしいですが、戻りたくはありません。

今後

足りないものを追加したり、統合すべき表記揺れや誤りの削除などしつつ、語義をどんどん追加していきます。まずは辞典として充実させつつ、分類や論文などを増やしていきます。

もしオノマトペの過不足や、その他ご指摘があれば、ぜひ@matopeejaまでください。


https---qiita-image-store.s3.amazonaws.com-0-56480-833eda6a-d997-fdfd-036f-ca7a549b84f6.png

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
問題のあるコメントを報告する

オノマトペ大好きなので,技術面よりコンテンツのほうに反応しちゃいます。
日本語を「世界の中で特異な言語」と捉える傾向って戦前からあるみたいですね。
私も若い頃は,日本語のオノマトペの豊富さは世界トップ,というような印象を持っていました。大学に入って韓国語をちょっと知ったら,あっちのほうがもっとシステマティックでもっと豊かだと分かって,へーと思いました。閉音節を持っているぶん有利ってこともあるかも?

Qiita 上では技術の話をすべきかもしれませんが,Twitter アカウントも持ってないし,このコメント欄で少しだけ,載ってない語を書かせてください。
原典の表記に関わらず平仮名で記します。

  • かっこーん,かこーん(銭湯で桶を返す音が反響;マンガでよく出てくる)
  • ぐすぐす(鼻が詰まった;痛みの表現)
  • ざんぶ(太宰治『走れメロス』でメロスが川に入るとき)
  • しがしが(噛む)
  • しみじみ(八代亜紀「舟唄」で酒を飲むとき)
  • じゃらん,じゃらーん(鐘の音など)
  • しゃらん,しゃりん(細かい金属を連ねた紐が束になったようなものを揺らすときなど)
  • すぼっ(佐々木倫子『動物のお医者さん』でシベリアンハスキーのチョビがハムテルの脇の間から顔を出すとき)
  • ちんちくりん(「つんつるてん」と同義)
  • てれてれ
  • どっか
  • どっこいせ
  • どっこらせ
  • どっしゃーっ(この手の叫び声はいくらでも:っしゃあー,うぴょー,みぎゃー)
  • どわっはっは の類
  • にひにひ(原ゆたか『かいけつゾロリ』でゾロリがほくそえむとき)
  • ぬぼっ
  • ぱさり(軽めの束が落ちるなど)
  • はっし
  • ぱったり(途絶える)
  • ぱつんぱつん(ズボンなどの衣類がきつい;仕事の予定が詰まっていて余裕が無い)
  • ふうわり(雁屋哲 作・花咲アキラ 画『美味しんぼ』で食感を表す)
  • ぶえっくし(くしゃみ)
  • ぶじゅ
  • ぶじゅぶじゅ
  • ぺたしぺたし(谷岡ヤスジのマンガに出てくるキャラクター「ペタシ」が歩くとき)
  • ろっぱー(誌名も作者も忘れましたが,何かのマンガ雑誌に連載してた四コマで,突然の激しい嘔吐に使われてました)

手許のメモにはまだあるんですが,いったんこのへんで。伝えるのによい手段があるとよいですが。

ところで,促音・長音の挿入はある程度自由にできるので,そういうものを徹底的に入れれば,(実際に使われているものだけでも)1〜2 割増やせそうな気がしますね。

問題のあるコメントを報告する

コメント、オノマトペ、ありがとうございます。
収集している方は少ないので実に嬉しいです。

日本語すごい!の方向の情報は、単なる勝手な想像か、日本語しか知らないか、捏造の場合が多いので、悪質なノイズになって閉口します。日本語は、オノマトペが豊富な方で、日常で多用され、漫画という他言語になかった相方がいた、という辺りは個性とできそうです。ただこれらを比較調査なしに特別と言い出したら危険ですね。

言語によってオノマトペの数がこうも極端に違うのか、定説は無いようです。タミル語のように無限に生まれるらしいものや、スワヒリ語のようにほぼ無いものまで、とても無規則に見えます。音節との単純な相関もなさそうです。

-

登録されていないたくさんのオノマトペ、ありがとうございます。
早速語義を考えながら登録していきます。

促音長音も仰る通りですし、重畳の回数(「きりきりきり」)、文字の繰り返し(「どどど」「がががが」)など、辞典として収録すべき単位は、かなり曖昧なまま来ています。一応の基準を、個別の語義を当てれるかとしていますが、それもまた境界に悩みます。

Qiita 上では技術の話をすべきかもしれませんが,Twitter アカウントも持ってないし,このコメント欄で少しだけ,載ってない語を書かせてください。
伝えるのによい手段があるとよいですが。

Qiitaに投稿したのは間口の広さを期待してで、私はこのコメントでいただけるのはむしろありがたいです。
ガイドラインには「プログラミングに関する記事を」とありますが、背景に実際のプログラミングがサービスにおけるデータ化も含めた話題ですし、コメント機能でそのサービスに登録し得る語の情報をいただくことまで規約違反としないのでは、と考えています。

いずれにせよ、今回いただいた語は大切に吟味して登録させていただきます。
ありがとうございます。

問題のあるコメントを報告する

どんぶらこどんぶらこ(川上から巨大な桃が流れてくるときの音)は入ってよいのでは?

似たコンセプトで、オノマタイプというサイトがあります。フォントとオノマトペの組み合わせなんですが、こちらも見てみると楽しいんじゃないかなと思います。
https://font-switch.jp/onomatype/

オノマトペの豊富さで言ったらエロ同人とホラー漫画はすごいですよ……下世話なので詳細はともかく、ときどきものすごいのに出会っては舌を巻きます。

問題のあるコメントを報告する

どんぶらこ、抜けていました。ありがとうございます。
用途がかなり限定されつつ、その言語ネイティブがほとんど共感できるオノマトペなのに不覚です。

オノマタイプも見落としていました。
幾つかオノマトペ関連のサービスやWeb上のリソースはメモしていて、論文などと同様に紹介する予定です。オノマタイプもそこに入れさせていただきます。
ただ、こちらに投稿されている語にはオノマトペと呼べないものや、個人的に作った共感できないものも多いようでした。書体による表現の工夫は考えているので、そちらでは参考にいたします。

官能小説や成人向けの漫画に限らず、漫画全般やライトノベルなど、オノマトペ的な表現の扱いは悩んでいるところです。
作品やシーンに合わせた創作性が強すぎて、単独で共感できないものがどうしても多い。しかし、そうした創作から広がって独自の共感を獲得しているもの、あるいは広がらずとも共感を得られる優れたものなどがある。官能的表現で多用される液体的粘膜的な表現にも、恐らくそうしたオノマトペがあるはずです。
これらをどこからどこまでどういった基準で集めるか、悩ましいです。

Sign up for free and join this conversation.
If you already have a Qiita account