文章を分類⑥:9種類の文章のカテゴリー分類

ldcc-20140209.tar.gzの全てのカテゴリーのファイルを対象にカテゴリー分類してみます。ここまでを踏まえて実効性を出せるよう、以下の対策をします。
①9個のカテゴリー群を扱うので、データをミスせず簡単に作れるよう、数個のプログラム実行で処理できるようにします。
②テキストを、句点(‘。’)で区切った分割「text.split(‘。’)」から、改行コード(\r\n)での分割「text.split(‘\r\n’)」に変えます。改行までが、ひと塊の文章で、途中に’。’が含まれる場合があります。
③「model」の「min_count=3」を「min_count=1」にして、出現が一度だけの単語も取り込みます。出現が一回だけでカテゴリー分類に重要な単語があるはずです。
④1つのファイルから取り出す単語が少なすぎるので、単語数8から、単語数18に増やします。
⑤word2vecが吐き出すデータが毎回異ならないよう、PYTHONHASHSEED=0でword2vecで使う乱数を固定します。

まず「ldcc-20140209.tar.gz」を適当なフォルダに解凍して、9個のカテゴリーフォルダを用意します。カテゴリーフォルダから「LICENSE.txt」を削除します。カテゴリーフォルダの親フォルダに「make.bat」と「gensim2.py」をセットして「make.bat」をダブルクリックで実行します。
子フォルダの「.txt」ファイルがまとめて全て、word2vecで使うデジタルデータになります。
make.bat

set PYTHONHASHSEED=0
gensim2.py

gensim2.py

import re
import csv
import glob
import os
from janome.tokenizer import Tokenizer
from gensim.models import word2vec
os.environ['PYTHONHASHSEED'] = '0'

# テキストを引数として、形態素解析の結果、名詞・動詞原型のみを配列で抽出する関数を定義 
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()
file_list = glob.glob('./*/' + '*.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('\r\n')
    # それぞれの文章を単語リストに変換(処理に数分かかります)
    word_list = [extract_words(sentence) for sentence in sentences]
    model = word2vec.Word2Vec(word_list, size=100,min_count=1,window=5,iter=100)

    with open(filename + '.tsv', '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)

file_list = glob.glob('./*/' + '*.tsv')

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'\.tsv',"",filename) + '.csv','a',newline='') as fw:
       writer = csv.writer(fw)

       for row in reader:
          if count < 18:
            writer.writerow(row)
            count = count+1
    if count < 18:
         os.remove(re.sub(r'\.tsv',"",filename) + '.csv')

file_list = glob.glob('./*/' + '*.txt')
for filename in file_list:
   os.remove(filename)

file_list = glob.glob('./*/' + '*.tsv')
for filename in file_list:
   os.remove(filename)

デジタルデータになった9個のカテゴリーフォルダを、Neural Network Consoleの「DATA SET」にするフォルダにコピーします。デジタルデータになった9個のカテゴリーフォルダの親フォルダに並べて、もう一組、9個の空のカテゴリー名のフォルダを作り、各カテゴリーフォルダから25個づつファイルを切り取って来ます。
両方の親フォルダに「shuffle9.py」をセットして実行します。
shuffle9.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:
     fp.write("x:image,y:label")
     fp.write("\n")
     for file in files:
       if re.search('dokujo-tsushin',file):
          fp.write(file+',0')
          fp.write("\n")
       if re.search('it-life-hack',file):
          fp.write(file+',1')
          fp.write("\n")
       if re.search('kaden-channel',file):
          fp.write(file+',2')
          fp.write("\n")
       if re.search('livedoor-homme',file):
          fp.write(file+',3')
          fp.write("\n")
       if re.search('movie-enter',file):
          fp.write(file+',4')
          fp.write("\n")
       if re.search('peachy',file):
          fp.write(file+',5')
          fp.write("\n")
       if re.search('smax',file):
          fp.write(file+',6')
          fp.write("\n")
       if re.search('sports-watch',file):
          fp.write(file+',7')
          fp.write("\n")
       if re.search('topic-news',file):
          fp.write(file+',8')
          fp.write("\n")

切り取られた側のフォルダに出来た「text_train.csv」を「text9_train.csv」にリネームしてDATA SET」にするフォルダに移動します。切り取った側のフォルダに出来た「text_train.csv」を「text9_test.csv」にリネームしてDATA SET」にするフォルダに移動します。これで準備完了です。

「3種の画像認識No2」と同じように「binary_connect_mnist_MLP.sdcproj」を参考にします。
Input Sizeには、各データの下のサイズ18. 100を確認して18,100と入力。

CONFIGは「Structure Search:Enable」をセットしました。

Trainingを実行。
三回目はComponentsの一部が自動で変更されました。

Evalutionを実行。

Accuracyは、51.11%です。

もう少しAccuracyを上げたいので、Projectを変更します。

Trainingを実行。

Evalutionを実行。

Accuracyは、53.77%です。9の内の1ですから有効性ありです。結果を見ると「y’_5」と「y’_8」がダメです。すなわちカテゴリー「peachy」とカテゴリー「topic-news」ですが、人間が見ても分類出来る単語が分かりません。

 

コメントを残す

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