私は、nグラムでテキストをトークン化することにより、NLPにしようとしてきました。私はラベルであり、どのように多くの各nグラムの出現カウントする必要がありA
、およびB
それぞれ。
しかし、私は非常に長いデータフレームを取得し、私は他よりも優れている構造はよく分からないVSの列に長いリストを置くことを選択する必要があります。
私の知る限りでは、あなたがほとんど複数のリスト内だ項目の頻度(出現)を得るようなもの、パンダの操作を使用して任意の有用な情報を得ることができないため、データフレームの列内のリストを持っていることは悪い構造です。また、それはそれが可能だ場合でも、いずれかのタスクを実行するために多くの計算を必要とします。
しかし、私は、データフレームが長すぎるRAMの多くを食べ、さらにはおそらくデータがRAMに収まるように大きくなりすぎた場合、他のプロセスを殺すことがわかっています。それは一種私は確かにしたくない状況であります。
だから今、私は選択をしなければなりません。私は何をしたいのラベルによって、各nグラム項目の発生をカウントしています。
例えば、(データフレームは以下の通りです)
{
{ngram: hey, occurence_A: 2, occurence_B: 0},
{ngram: python, occurence_A: 2, occurence_B: 1},
...
}
私は私のコンピュータの仕様を述べることが適切であると思います。
CPU:i3-6100
RAM:16ギガバイト
GPU:N / A
データフレーム1:
+------------+-------------------------------------------+-------+
| DATE | NGRAM | LABEL |
+------------+-------------------------------------------+-------+
| 2019-02-01 | [hey, hey, reddit, reddit, learn, python] | A |
| 2019-02-02 | [python, reddit, pandas, dataframe] | B |
| 2019-02-03 | [python, reddit, ask, learn] | A |
+------------+-------------------------------------------+-------+
データフレーム2:
+------------+-----------+-------+
| DATE | NGRAM | LABEL |
+------------+-----------+-------+
| 2019-02-01 | hey | A |
| 2019-02-01 | hey | A |
| 2019-02-01 | reddit | A |
| 2019-02-01 | reddit | A |
| 2019-02-01 | learn | A |
| 2019-02-01 | python | A |
| 2019-02-02 | python | B |
| 2019-02-02 | reddit | B |
| 2019-02-02 | pandas | B |
| 2019-02-02 | dataframe | B |
| 2019-02-03 | python | A |
| 2019-02-03 | reddit | A |
| 2019-02-03 | ask | A |
| 2019-02-03 | learn | A |
+------------+-----------+-------+
あなたが言及するように、データフレームの列内のリストを持つことは悪い構造であり、かつ長い形式のデータフレームが好ましいです。私はいくつかの側面からの質問に答えるためにしようとしてみましょう:
- データ操作&リストのような列のネイティブサポート機能の欠如のための追加された複雑さ
リストのような列を使用すると、容易にパンダの機能を利用することができません。
たとえば、あなたが興味を持っている言及したNGRAM
ことによってLABEL
。dataframe1(DF1)を使用すると、dataframe2(DF2)のためにあなたがする必要がありながら、あなたは、シンプルGROUPBYカウント機能により容易に必要なものを得ることができますexplode
あなたがそれらに取り組むことができる前にリストリスト列:
df1.groupby(['LABEL','NGRAM']).count().unstack(-1).fillna(0)
df2.explode(column='NGRAM').groupby(['LABEL','NGRAM']).count().unstack(-1).fillna(0)
どちらも、あなたに同じことを与えます:
また、多くのネイティブのパンダ機能(例えば私のお気に入りはvalue_counts
)直接リストに作業することはできませんので、explode
ほとんど常に必要です。
- リストのようなデータよりも長いデータの下の計算時間は、(我々がする必要はありませんので、一般的に言えば、
explode
最初の列)
あなたを活用することを決めたと想像NGRAM
しますが、それぞれ以下を行うだろう、とあなたはDF2の実行に長い時間がかかることがわかります:
df1['NGRAM'] = df1['NGRAM'].str.capitalize()
# 1000 loops, best of 5: 1.49 ms per loop
df2['NGRAM'] = df2['NGRAM'].explode().str.capitalize().groupby(level=0).apply(list)
# 1000 loops, best of 5: 246 µs per loop
メモリはあなたのために問題がある場合は、(むしろどちらかDF1またはDF2としてそれらを保存するよりも、上の画像のデータ構造)ラベルを直接あたりNGRAMカウントでの作業を検討またはパンダのオーバーヘッドがやや減少した(numpyのアレイを使用することもできます)別途NGRAM辞書ファイルを維持しながら。