2018年09月17日

言語処理100本ノックでPython入門 #70 - 機械学習、データの入手・整形

  

今日から言語処理100本ノック 2015の第8章・機械学習に突入です。scikit-learnを使って解いていく予定ですが、1問目はscikit-learnとは直接は関係ない問題です。いわゆる前処理ってやつですね。

■ 問題
本章では,Bo Pang氏とLillian Lee氏が公開しているMovie Review Dataのsentence polarity dataset v1.0を用い,文を肯定的(ポジティブ)もしくは否定的(ネガティブ)に分類するタスク(極性分析)に取り組む.

70. データの入手・整形
文に関する極性分析の正解データを用い,以下の要領で正解データ(sentiment.txt)を作成せよ.
  1. rt-polarity.posの各行の先頭に"+1 "という文字列を追加する(極性ラベル"+1"とスペースに続けて肯定的な文の内容が続く)
  2. rt-polarity.negの各行の先頭に"-1 "という文字列を追加する(極性ラベル"-1"とスペースに続けて否定的な文の内容が続く)
  3. 上述1と2の内容を結合(concatenate)し,行をランダムに並び替える
sentiment.txtを作成したら,正例(肯定的な文)の数と負例(否定的な文)の数を確認せよ.

■ どうやって解くか

どうしようか悩みましたが、入力ファイルは極性ラベルを付けていったんリストに格納します。 AddPlus, AddMinus がそのメソッドです。

で、この2つをさらに + 演算子で結合し、そのあと、random.shiftでランダムに並び替えます。 これを、sentiment.txtに出力します。

今回のトピックは、+ 演算子でのリストの連結と、random.shiftによるランダムな並び替えの2つ。 第8章: 機械学習の1問目は、今までの延長でなんとかなりました。

それと、入力ファイルが、UTF-8ではありませんでした。なので、encoding='cp1252' のオプションを付けて読み込んでいます。

■ Pythonのソース

import random

def AddPlus():
    lines = []
    with open('rt-polarity.pos', 'r', encoding='cp1252') as fin:
        for line in fin:
            lines.append('+1 ' + line)
    return lines

def AddMinus():
    lines = []
    with open('rt-polarity.neg', 'r', encoding='cp1252') as fin:
        for line in fin:
            lines.append('-1 ' + line)
    return lines

def CreateText():
    lines = AddPlus() + AddMinus()
    random.shuffle(lines)
    with open('sentiment.txt', 'w') as fout:
        fout.writelines(lines)


def main():
    CreateText()

if __name__ == '__main__':
    main()

■ 結果

出力ファイルの先頭8行を載せます。

+1 a wonderful character-based comedy . 
-1 a ragbag of cliches . 
+1 gently humorous and touching . 
-1 the first fatal attraction was vile enough . do we really need the tiger beat version ? 
-1 shafer's feature doesn't offer much in terms of plot or acting . 
-1 the material and the production itself are little more than routine . 
+1 it's a beautifully accomplished lyrical meditation on a bunch of despondent and vulnerable characters living in the renown chelsea hotel . . . 
+1 captivates and shows how a skillful filmmaker can impart a message without bludgeoning the audience over the head .