メモ > 技術 > プログラミング言語: Python > scikit-learn(機械学習)で言語を判定
scikit-learn(機械学習)で言語を判定
利用されている文字コードが異なる言語を判定。
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
# Unicodeのコードポイント頻度測定
def count_codePoint(str):
# Unicodeのコードポイントをアドレスとする配列を用意
counter = np.zeros(65535)
for i in range(len(str)):
# 各文字をUnicodeのコードポイントに変換
code_point = ord(str[i])
if code_point > 65535 :
continue
# 対応するアドレスの出現回数をインクリメント
counter[code_point] += 1
# 各要素を文字数で割って正規化
counter = counter/len(str)
return counter
# 学習用データの準備
ja_str = 'これは日本語の文章です。'
en_str = 'This is English Sentences.'
th_str = '(タイ語の文章)'
x_train = [count_codePoint(ja_str),count_codePoint(en_str),count_codePoint(th_str)]
y_train = ['ja','en','th']
# 学習する
clf = GaussianNB()
clf.fit(x_train, y_train)
# 評価用データの準備
ja_test_str = 'こんにちは'
en_test_str = 'Hello'
th_test_str = '(タイ語の文章)'
x_test = [count_codePoint(en_test_str),count_codePoint(th_test_str),count_codePoint(ja_test_str)]
y_test = ['en', 'th', 'ja']
# 評価する
y_pred = clf.predict(x_test)
print(y_pred)
print("正解率 = " , accuracy_score(y_test, y_pred))
利用されている文字コードが同じ言語を判定。
あらかじめ以下のファイルを用意しておく。
de, en , es からはじまるファイルの内容は、それぞれドイツ語、英語、スペイン語の内容にしておく。
train/de_cat.txt
train/de_dog.txt
train/de_elephant.txt
train/en_cat.txt
train/en_dog.txt
train/en_elephant.txt
train/es_cat.txt
train/es_dog.txt
train/es_elephant.txt
test/de_lion.txt
test/en_lion.txt
test/es_lion.txt
import numpy as np
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score
import glob
# Unicodeのコードポイント頻度測定
def count_codePoint(str):
# Unicodeのコードポイントをアドレスとする配列を用意
counter = np.zeros(65535)
for i in range(len(str)):
# 各文字をUnicodeのコードポイントに変換
code_point = ord(str[i])
if code_point > 65535 :
continue
# 対応するアドレスの出現回数をインクリメント
counter[code_point] += 1
# 各要素を文字数で割って正規化
counter = counter/len(str)
return counter
# 学習データの準備
index = 0
x_train = []
y_train = []
for file in glob.glob('./train/*.txt'):
# 言語情報の取得し、ラベルに設定
y_train.append(file[8:10])
# ファイル内の文字列を連結後、Unicodeのコードポイント頻度測定し、入力データに設定
file_str = ''
for line in open(file, 'r'):
file_str = file_str + line
x_train.append(count_codePoint(file_str))
# 学習する
clf = GaussianNB()
clf.fit(x_train, y_train)
# 評価データの準備
index = 0
x_test = []
y_test = []
for file in glob.glob('./test/*.txt'):
# 言語情報の取得し、ラベルに設定
y_test.append(file[7:9])
# ファイル内の文字列を連結後、Unicodeのコードポイント頻度測定し、入力データに設定
file_str = ''
for line in open(file, 'r'):
file_str = file_str + line
x_test.append(count_codePoint(file_str))
# 評価する
y_pred = clf.predict(x_test)
print(y_pred)
print("正解率 = " , accuracy_score(y_test, y_pred))