自然言語処理における言語データの保存方法をまとめてみた

# あなたの言語データ、正しく管理できてますか？
自然言語処理(NLP)で単語の頻度や埋め込みベクトルなどを扱っている皆様こんにちは！

**生テキスト**や**BoW**や**埋め込み表現**等、言語処理で使われるデータはいろいろありますがどのように管理してますか？

これらのデータの管理法についての議論が少ないように感じたので寄稿いたしました。
私がpythonをよく使うので少しpythonista寄りの記事なるかもしれませんがそこはご理解ください。
個々の方法についてはデータの構造、規模、用途により変わるため
今回は**事例紹介**にとどめておきます。

主な管理方法として以下があると思います。（他にもあればコメントお願いします！）   
管理方法一覧(サービスと保存形式がごっちゃになってますが、ここでは管理方法としてあえて一緒にしてます）
- RDBMS
- NoSQL
  - NewSQL
- 全文検索エンジン (Elasticsearch等)
- BigQuery
- CSV(Excel)
- txt
- XML
- 生json
- オントロジ(LOD)
- 生プログラミング言語の変数

また、前処理等をしてから保存するのか、保存したrawデータに対して解析時に逐次前処理するのか
という疑問もあると思います。

やっかいなのが機械学習・NLPの入門書では自分でデータを作って管理することについて
述べている書籍は少ないと感じました。（著者が読んだ本の中では）
なので、データエンジニアリング初心者の方がどのように保存していいか迷うことがあると思います。

## 前例から学ぼう
### 有名データセット編
では有名（テキスト）データセットはどのように保存されているか見ていきましょう

- [IMDB](http://ai.stanford.edu/~amaas/data/sentiment/)
皆さんおなじみの映画のレビューデータはレビュー自体は**txt**で
ボキャブラリーデータはvocabという拡張子のテキストデータでした。

-  [20 Newsgroups](http://qwone.com/~jason/20Newsgroups/)
こちらもそのままテキストでした。IMDBと違うのはvocabファイルがないためボキャブラリー数は自分でカウントする必要があります。

- [DBpedia](https://wiki.dbpedia.org/)
DBpediaというwikipeidaデータからオントロジを構築するプロジェクト
wikipediaの記事及びリンクの関係も指定して細かく取得することできる
＊wikipediaの[ダンプデータ](https://dumps.wikimedia.org/)もあるがこちらはXML
![alt](https://miro.medium.com/max/1313/1*QMgA0UViZMW7LUjRhil9yQ.jpeg)
画像引用：https://medium.com/openlink-software-blog/what-is-dbpedia-and-why-is-it-important-d306b5324f90



やはり広く公開するデータセットの特性上プラットフォームを問わず開けるtxtが多いですね

### 各企業のノウハウ編
NLP関連かつDB周りのアーキテクチャを公開している企業さんの記事を探してみました。

- **Oracle**   
当然といえば当然だがOracleDBとセットで機械学習できる**Oracle Data Miner**を推奨している。
利点はOracleDBから実行できデータの加工やパラメータ設定を自動で行ってくれるそう。

> [データベースで始める機械学習](https://www.slideshare.net/oracle4engineer/ss-94949162)

- **DATUM STUDIO**   
TECHブログの記事ではMySQLを使用しています。Tweet文書データのidをキーに文書自体を保存してます。そして分析時に前処理をしているようです。

>
 ![alt](https://datumstudio.jp/wp-content/uploads/2015/12/b6d45c777c689875875b19c7987d264a.png)

>
```サンプル
         id: 663269643650404353
   user_id: 945808578
      text: 商品が売れている証拠だ
created_at: 2015-11-08 08:19:40
```

> [【特別連載】 さぁ、自然言語処理を始めよう！（第1回： Fluentd による Tweet データ収集）](https://datumstudio.jp/blog/%E3%80%90%E7%89%B9%E5%88%A5%E9%80%A3%E8%BC%89%E3%80%91-%E3%81%95%E3%81%81%E3%80%81%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E3%82%92%E5%A7%8B%E3%82%81%E3%82%88%E3%81%86%EF%BC%81%EF%BC%88)


### 自然言語処理系の研究室
- [**長岡技術科学大学自然言語処理研究室**](http://www.jnlp.org/)


こちらでは自然言語処理の専門家である山本先生がテキストをDB化することについて述べています。
要約すると
生データだと容量がヤバイ！=> RDB使って容量と~~そこそこの~~高速化を担保

>
[言語処理でデータベース](http://www.jnlp.org/lab/graduates/kuboki/python/db)

ちなみに同研究室HPでは**NoSQL**についても述べている。
>
[NoSQL](http://www.jnlp.org/lab/graduates/anh/dokusyo/nosql)

## 方法から学ぶ編
ここではwebで見つけたNLP関連のデータ管理について方法を軸にまとめていきます。

- NoSQL
言語データとしてはメジャーなtwitterデータを例にNoSQLを使用するメリットを述べてます。
>
[非エンジニアでも知っておきたいビッグデータとデータベースの話【NoSQL解説】](https://community.mapr.jp/nosql-topic-bigdata-and-database.html)

- BigQuery
NLP界隈で多くの記事を投稿している[hirosan](https://qiita.com/Hironsan)の記事
こちらもtwitterデータを対象にしています。
>
[Tweetを定期的に取得してBigQueryに格納する](https://hironsan.hatenablog.com/entry/storing-tweets-in-bigquery)

- Elasticsearch
言語処理の観点ではTokenizationやAnalysisという機能が便利だと思います。
・**応用事例での解説**
[質問応答システムの基盤にElasticsearchを使ってみる](https://qiita.com/shin0higuchi/items/c53a2ba694a043666f23)
・**データベースとしての解説**
[データベースとしてのElasticsearch](https://qiita.com/rjkuro/items/95f71ad522226dc381c8)

## まとめ
データの管理方法にベストはありませんが、私の経験と上の事例から用途ごとおおかに分けることができます。

1. 広く多くの人に公開したい=>txt
2. **言語処理以外**も含めて様々なタスクで高頻度で利用したい=>RDB
4. 言語処理のみだが高頻度かつ高度な分析で利用したい=>NoSQL or 全文検索エンジン
5. 少量データのみで手軽に集計・分析したい=>CSV
6. 制作に時間をかけても精密な分析を行いたい=>オントロジ(LOD)