質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

336閲覧

可変長データの分割について

hayata-yamamto

総合スコア31

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/08/29 14:17

編集2018/08/29 15:02

疑問点

自然言語処理の文章分類問題を考える際に、訓練データとテストデータを分けると思いますが、多くの場合固定長になりません。
分けずにやればめちゃくちゃ簡単ですが、確実にリーケージが発生するので少なくとも辞書を作成する前にはデータを分けておく必要があると思います。
みなさんはどのように可変長のインプットデータを分けていますか?

固定長なら、sklearnのtrain_test_splitですぐなので、
かんたんに思いつくところだとリストに変換して一番長いデータに合わせてなんかしらの文字を追加して固定長に仕立てる方法かなあと思っています。
これが効率的だというやり方があったら教えて欲しいです。

具体的には、

python

1text = [ 2['aaa' 'bbb' 'cccc'], 3['xx'], 4['xxxx', 'bb', 'eeee', 'bbbb'], 5]

のようなデータに対して、ラベルが与えられているとしてどのように処理を書くかお聞きしたいです。

ふんわりしていますが、疑問点あればお答えしますのでよろしくお願いします

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

あまり文書の長さは関係ないのでは。

どんな手法を使うのかにもよります。One-Hot表現やBag of Words、n-gram、トピックモデルや分散表現だったり、そもそもLSTMで処理するとか。

教師なしの特徴抽出手法でまるごと変換してからtrain_test_split等で分けるというのが一つの方法論で、大抵それで十分です。

ある程度複雑な特徴抽出を行うので、その段階で微妙にleakageが起きる可能性がある、ということを嫌うのであれば、何も処理しない段階で学習データとテストデータに分け、学習データだけ用いてモデルを構築することも可能です。

投稿2018/08/29 17:50

編集2018/08/29 17:51
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayata-yamamto

2018/08/30 00:35

ありがとうございます!確かにおっしゃる通りで、テキストをベクトル化してそれを分けるというのは、私もよくやる方法でした。ただ、一度立ち止まって考えてみたときに、テストデータにはあって、訓練データにはない単語が存在した場合、「例えば、辞書をつかってBoWする際に、そもそも新規のデータがきた際には知らないはずの単語を知っている状態は適切なのか」とふと思ってしまい、ありゃどうするのが適切だったっけと思ったという流れでした。 このふわっとした質問で、この回答をいただけて助かりました!
hayataka2049

2018/08/30 01:45 編集

>テストデータにはあって、訓練データにはない単語 訓練データにない単語なら、学習には意味のある影響はないのでかなりどうでも良いのでは また、よほどテストデータと訓練データの分割に偏りがない限り、そういう単語は相当の低頻度ですから、前処理で落としてから機械学習モデルに入れるかと思います。やっぱりどうでも良いような
guest

0

やりたいことによるかもしれませんが、全データをOne-Hot表現に変換してからtrain_test_splitを実行してはいかがでしょう。これなら、固定長データに変換してからの処理になるので希望に沿っていると思います

投稿2018/08/29 15:25

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayata-yamamto

2018/08/30 00:36

確かに、これも良い方法ですね!質問に的確に答えていただけてよかったです!ありがとうございます
guest

0

試してないのであれですが、固定長でなくてもsplitできませんか?

ダメなら、サンプル数分のインデックス配列を用意して、それを分割すれば良いのでは?

投稿2018/08/29 15:11

編集2018/08/29 15:31
mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayata-yamamto

2018/08/30 00:38

そうですね、indexを作って処理をするのもありだと思いました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問