文章を分類③:2種類の文章のカテゴリー分類

「文章を分類②:日本語の形態素解析、word2vecを試す」の続きです。gensimはインストールしてある前提です。「文章を分類②」sample5.pyでセーブしたldcc-20140209.tar.gzのフォルダ「movie-enter」のファイルは、「TSV file」でNeural Network Consoleでは読めません。「CSV file」の単語リストに書き出せるように直します。
gensim.py

import re
import csv
import glob
from janome.tokenizer import Tokenizer
from gensim.models import word2vec

# テキストを引数として、形態素解析の結果、名詞・動詞原型のみを配列で抽出する関数を定義 
def extract_words(text):
    tokens = t.tokenize(text)
    return [token.base_form for token in tokens
        if token.part_of_speech.split(',')[0] in['名詞', '動詞']]

t = Tokenizer()
path = "./test"
file_list = glob.glob(path + '/' + '*.txt')

for filename in file_list:
  with open(filename,encoding="UTF-8",mode='r',errors="ignore") as input:
    textorg = input.read()
    data2 = re.sub(r'[\s ]',"",textorg)
    data3 = re.sub(r'http.+0900',"",data2)
    text = re.sub('【[^】]*】',"",data3)

    # 全体のテキストを句点('。')で区切った配列にする。 
    sentences = text.split('。')
    # それぞれの文章を単語リストに変換(処理に数分かかります)
    word_list = [extract_words(sentence) for sentence in sentences]

    model = word2vec.Word2Vec(word_list, size=100,min_count=3,window=5,iter=100)

    with open(filename + '.csv', 'w', encoding='utf-8') as f:

       for word in model.wv.vocab.keys():
           embedding = model.wv[word]

           writer = csv.writer(f, lineterminator='\n')
           writer.writerow(embedding)

同じフォルダに、gensim.pyとフォルダ「movie-enter」を置き、「movie-enter」を「test」にリネームしてgensim.pyを実行。エラーになる小さすぎるファイルは、削除します。フォルダ「test」に.csvファイルが出来ます。元の.txtファイルを削除します。

続けて、エクスプローラーでフォルダ「test」を開き「検索ツール検索」でサイズ▼非常に小さい(0-10KB)で単語数が8未満のファイルを削除します。

フォルダ「test」の親フォルダでcut.pyを実行します。
cut.py

import glob
import csv
import os
import re

file_list = glob.glob('./test/' + '*.csv')

for filename in file_list:
  count = 0 
  # ファイルを読み込みモードでオープン
  with open(filename,encoding="UTF-8",mode='r') as f:

    reader = csv.reader(f)
    with open(re.sub(r'test\\',"",filename),'a',newline='') as fw:
       writer = csv.writer(fw)

       for row in reader:
          if count < 8:
            writer.writerow(row)
            count = count+1

親フォルダに単語数8のcsvファイルが出来ます。フォルダ「movie-enter」を作成して、そこに出来たcsvファイルを移します。同様の処理をフォルダ「sports-watch」についても行います。Neural Network ConsoleのDATASETにするフォルダに単語数8になったフォルダ「movie-enter」とフォルダ「sports-watch」をコピーしておきます。これがDATASETの実際のデータです。
次に、行列データのCSVファイルを作ります。
適当なフォルダを作り、フォルダ「movie-enter」とフォルダ「sports-watch」をコピーします。両方のフォルダから1割程度のファイルを切り取ります。もう一つ適当なフォルダと、空の「movie-enter」と「sports-watch」を作ります。そこに切り取ったファイルをペーストします。作った二つのフォルダでshuffle.pyを実行します。
shuffle.py

import glob
import re
import random

# 指定したパス内の全てのファイルとディレクトリを要素とするリストを返す
files = glob.glob("./*/*")
random.shuffle(files)

with open('text_train.csv',encoding="UTF-8", mode='w') as fp:

     for file in files:
       if re.search('movie-enter',file):
          fp.write(file+',0')
          #fp.write(re.sub(r'movie-enter\\',"",file)+',0')
          fp.write("\n")
       if re.search('sports-watch',file):
          fp.write(file+',1')
          #fp.write(re.sub(r'sports-watch\\',"",file)+',1')
          fp.write("\n")

出来た「text_train.csv」をリネームして、train用の.csvとtest用の.csvにします。両方のCSVファイルの一行目にセルを挿入して「x:image」「y:label」と入力します。これらをNeural Network ConsoleのDATASETにするフォルダに移動します。これで、準備完了です。

Neural Network Consoleを起動します。
Open datasetで「Training」に「text_train.csv」をセット。Image Normalizationのチェックは外します。

Open datasetで「Validation」に「text_test.csv」をセット。Image Normalizationのチェックは外します。

EDITタブ左のComponentsにて、Input、Affine、Sigmoid、BinaryCrossEntropyを順にダブルクリックしてレイヤーを追加します。Input Sizeには、各データの下のサイズ8. 100を確認して8,100と入力。Affineには、2種類の分類なので1と入力。

CONFIGは元のまま。

Trainingを実行。

Evalutionを実行。Accuracyは、90%です。

CONFIGの「Max Epoch:」を100から2000に変更します。

Trainingを実行。

Evalutionを実行。Accuracyは、99.28%まで上がりました。

機械が見る単語情報と人間が見る単語を比べると、8語でもなんとか分類出来る事がわかります。
gensim_word.py

import re
import csv
import glob
from janome.tokenizer import Tokenizer
from gensim.models import word2vec

# テキストを引数として、形態素解析の結果、名詞・動詞原型のみを配列で抽出する関数を定義 
def extract_words(text):
    tokens = t.tokenize(text)
    return [token.base_form for token in tokens
        if token.part_of_speech.split(',')[0] in['名詞', '動詞']]

t = Tokenizer()
path = "./test"
file_list = glob.glob(path + '/' + '*.txt')

for filename in file_list:
  with open(filename,encoding="UTF-8",mode='r',errors="ignore") as input:
    textorg = input.read()
    data2 = re.sub(r'[\s ]',"",textorg)
    data3 = re.sub(r'http.+0900',"",data2)
    text = re.sub('【[^】]*】',"",data3)

    # 全体のテキストを句点('。')で区切った配列にする。 
    sentences = text.split('。')
    # それぞれの文章を単語リストに変換(処理に数分かかります)
    word_list = [extract_words(sentence) for sentence in sentences]

    model = word2vec.Word2Vec(word_list, size=100,min_count=3,window=5,iter=100)

    with open(filename + '.csv', 'w', encoding='utf-8') as f, \
     open(filename + 'word.csv', 'w', encoding='utf-8') as g:

       for word in model.wv.vocab.keys():
           embedding = model.wv[word]

           writer = csv.writer(f, lineterminator='\n')
           writer.writerow(embedding)

           # Save metadata TSV file
           g.write(word + '\n')

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です