文章を分類⑦:Neural Network Librariesによる分類No2

「ldcc-20140209.tar.gz」の全てのカテゴリーのファイルを対象に、Neural Network Librariesでの推論を行います。「文章を分類⑥」では、Accuracyが53.77%だったので、もう少しAccuracyを上げてから推論を行います。
変更点
①形態素解析に、名詞、動詞に加えて、形容詞を加えます。
②1つのファイルから取り出す単語を、単語数18から、単語数70に増やします。
③binaryConnectAffineの値を1024にして、CONFIGを「Structure Search:Enable」にします。
各カテゴリーについて、Trainingデータから25ファイルづつValidationに移動して検証用にしました。
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 < 70:
            writer.writerow(row)
            count = count+1
    if count < 70:
         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)

Neural Network Consoleで学習します。

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


Accuracy58.22%です。これで推論をします。

フォルダ「Letter9_dataset」に、フォルダ「result」、フォルダ「sampledata」及びletter9.bat、settext.py、texttest.pyをセット。フォルダ「sampledata」にTrainingとして学習に使ったファイルを各カテゴリー4個づつコピーしてletter9.batを実行。
letter9.bat

set PYTHONHASHSEED=0
python settext.py
python texttest.py
python "C:\tool\neural_network_console_120\libs\nnabla\python\src\nnabla\utils\cli\cli.py" forward -c "C:\tool\neural_network_console_120\samples\Letter9_dataset\letter9.files\20180907_145643\net.nntxt" -p "C:\tool\neural_network_console_120\samples\Letter9_dataset\letter9.files\20180907_145643\parameters.h5" -d "C:\tool\Download\Letter9_dataset\text9_test.csv" -o "C:\tool\Download\Letter9_dataset\result"

settext.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('./sampledata/' + '*.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('./sampledata/' + '*.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 < 70:
            writer.writerow(row)
            count = count+1
       while count < 70:
            writer.writerow([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])
            count = count +1

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

texttest.py

import glob
import re
import random

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

with open('text9_test.csv',encoding="UTF-8", mode='w') as fp:
     fp.write('x:image')
     fp.write("\n")
     for file in files:
          fp.write(file)
          fp.write("\n")

ss


学習に使ったファイルでテストしたので、間違いは一つだけです。

しかしながら、Yahoo!の記事などを試してみると、全く分類出来ません。なるべく直近のデータを使って、繰り返し学習すれば、分類可能になるでしょう。

コメントを残す

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