テキスト分析の大通り#20: 形態素解析をループで実行と
補記その1。形態素解析を行う際、ときに処理対象となる文章の件数が多くなり、ローカルのPython環境で一括実行しようとするとキャパオーバーになってしまうこと、また将来的に処理をバッチ化することを考えた場合、どの程度のデータ長が最大になるか判断がつかないなという悩みがありました。そのため、形態素解析した結果として得られた文書内における複数単語が、1行に収まったそのままでデータベースに上げるのではなく、単語ごとに行分解してからデータベースに上げること検討しました。また、すでにデータベース上に蓄積している文書データを、遡及して形態素解析する際にまあまあ膨大になるときのため、一括で実施してローカルのデータフレームに追記していくのではなく、ある程度の件数毎に分割し、処理した結果は都度データベース側に追記していくことをやってみました。
上記がそのスクリプトで、対比となる元のスクリプトが以下です。
利用データは元と同じですが、grid (group id)という処理単位を作成しています。gridが同じであれば一緒にダウンロードして、処理を行うことにします。例えばdocidがユニークであればそれに対して行番号を振り、それを処理単位の対象件数で割って整数部分を取得すればgridを作成できます。20件の文書があるケースで10件ずつ処理することを仮定すると、1から20までのデータそれぞれに、1引いてから10で割り、整数部分を取得すれば0,1の10件ずつ2つに分割できます。そしてこのgridごとにダウンロードすれば10件ずつ処理できるという次第です。実際にスクリプトではこのgridごとにダウンロード、形態素解析、結果をデータベースにアップロード・インサート ..という繰り返しを行っています。これにより、Pythonを実行する環境側のリソース制約が許容できるデータ量に限定した処理ができるようになります。1件あたりの文章量にもよりますが、通常のパソコンであれば1万件程度に分割して処理すれば許容範囲かと思います。
また、もともとは形態素解析して分解、品詞付与したデータを単一のカラムに入れて、まずはデータベースにアップロードしてから個別の単語に分解していましたが、今回は縦と横に分解するのをPython側で行ってから、データベースにアップロードしています。元の処理単位を上述のgridで絞っているのもあり、またどの程度の文章の長さが来るか将来的にわからない前提に立つと、単語に分解して長さを短くしておいた方が良いなと思ったためです。Mecabの形態素解析結果は、同一文書内の単語を、発生順に改行コードで区切っています。Excelでいうところのセルの中に、単語、改行コード、単語、改行コードとデータが入っている状態です。そのため、これをいったん配列にし、explodeという関数でこれを行に分解しています。これは元スクリプトのSQLでいうところのregexp_split_to_table関数に相当します。その後はそれぞれの行にseqno (sequential numero)を振ったり、単語として保持している表層形、品詞、正規形などを取り出した横に分解したりもしています。データベーステーブルではなく、データフレームに処理結果を貯めていくのであれば、コメントアウトした部分の感じになるかと思います。以上です。
(TeradataやPython、およびPythonライブラリのインストールや環境構築、辞書登録、参考にしたページ等は以下にまとめています)
///
#analytics #pyhon #mecab #形態素解析 #text #nlp #データ #分析 #teradata #sql