別棟備忘録4

*

Tf-idfを用いたone-hot表現のコード例

      2024/08/06

概要
pythonを使って日本語の文章に対してTf-idfを使ってみる備忘録。Tf-idfについての説明は、wikipedeiaなど他の文献をあたるとして…

対象は、要録所見文のうち、学習に関する所見文。
用いた所見文例.csvはこちらから。(zip化されています)

また、日本語文を単語に区切る分かち書きに際して、Mecabをインストールする必要あり。
インストールの方法は忘れてしまったので、他の文献をあたるとして…(2024年になってまた気が向いたので、Mecabについてはこちらhttps://bibo.capture.jp/memo/mecab
また、専門用語に関するdicファイルを作って分かち書きしたほうがいい。(たとえば、「授業」+「態度」と分かち書きされるところを「授業態度」とする。)要録所見用.dicファイルはこちらに
csvファイル→dicファイルという感じで作ったと思われるが、ずいぶん前に作ったので方法を失念。思い出したときに追記しよう。

pythonのコード

import csv
#import pprint
import numpy as np
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
#from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

with open(r"C:\Users\******\Desktop\gakusyu_shoken.csv",encoding="utf-8") as f:
    reader = csv.reader(f)
    l = [row for row in reader]
    
print(type(l))

arr = np.array(l)
print(type(arr),np.shape(arr))

arr[0,0] = 'index'
arr_1 = arr.T
print(arr_1[1])

wa  = MeCab.Tagger ("-Owakati  -u C:/Users/******/Desktop/shoken.dic")

#wakatigaki
l_2 = []
l_2.append('index')
#l_2[0] = 'wa_str'
for i in range(916):
   l_2.append(wa.parse(arr_1[1][i+1])) 

arr_waka_str = np.array(l_2)

#str_1 = wa.parse(arr_1[1][1])

print(l_2)

#tfidf
vectorizer = TfidfVectorizer(use_idf=True)
vecs = vectorizer.fit_transform(arr_waka_str)

for k,v in sorted(vectorizer.vocabulary_.items(), key=lambda x:x[1]): print(k,v)
print(vecs.toarray())

print(np.shape(vecs.toarray()))
plt.imshow(vecs.toarray())
plt.colorbar()
plt.savefig('tfidf_gakusyu.png')
plt.show()

#clusters = KMeans(n_clusters=2, random_state=0).fit_predict(vecs)
#for doc, cls in zip(arr_waka_str, clusters):
#   print(cls, doc)
np.savetxt('np_savetxt_gakusyu.csv', vecs.toarray(), fmt="%s", delimiter=",")

 

アウトプットに関して

for k,v in sorted(vectorizer.vocabulary_.items(), key=lambda x:x[1]): print(k,v)
で、作成した辞書の語彙をprintしています。

dic

1500個余りの単語を語彙として「獲得」していることがわかります。

 

print(vecs.toarray())と、そのshape
one_hot文章が917文あり、その中に1510の単語のうちどれが含まれているかがベクトル化される。二乗和が1になるように正規化されている(多分)。
図で示すと…

tfidf_gakusyu宇宙に散らばる星のように、ポツン、ポツンと単語が含まれる様子。まさに”ohe_hot”という感じ。
このベクトルの比較は、意味の類似ではなく、あくまで含まれる語の類似になる。というわけか。
したがって、大学の略称の一致をとるようなタスクに向いていた訳ですな。

 

 - Python, stringDistance