自然言語処理モジュール
自然言語処理
self_NL.py
レポートやノートの分析の基礎となる「分かち書き」や「文書ベクトル」の計算をします。また、文書ベクトルから文書間の一致度を計算する「cos類似度」を計算したり、csvファイルに保存されているレポート(フィールド名「loginid」に学籍番号、フィールド名「tassei」に計算対象の文章)間の一致度を計算します。
from janome.tokenizer import Tokenizer
t = Tokenizer()
import pandas as pd
import numpy as np
#わかち書き関数
def wakachi(text):
tokens = t.tokenize(text)
docs=[]
for token in tokens:
docs.append(token.surface)
return docs
#わかち書き関数(品詞付き)
def wakachi_part(text,parts):
tokens = t.tokenize(text)
docs=[]
docp=[]
for token in tokens:
if parts in token.part_of_speech:
docs.append(token.surface)
docp.append(token.part_of_speech)
return docs,docp
#文書ベクトル
def docs_vec(documents):
from sklearn.feature_extraction.text import TfidfVectorizer
docs = np.array(documents)
vectorizer = TfidfVectorizer(analyzer=wakachi)
vecs = vectorizer.fit_transform(docs)
return vecs.toarray()
#文書ベクトル(単語を含む)
def docs_vec2(documents):
from sklearn.feature_extraction.text import TfidfVectorizer
docs = np.array(documents)
vectorizer = TfidfVectorizer(analyzer=wakachi)
vecs = vectorizer.fit_transform(docs)
return vecs.toarray(),pd.DataFrame(vecs.toarray(), columns=vectorizer.get_feature_names())
def docs_cos(docs):
from sklearn.metrics.pairwise import cosine_similarity
cs_array = np.round(cosine_similarity(docs_vec(docs), docs_vec(docs)),2)
return cs_array
def docs_ittido(docs):
df=docs_cos(docs)
kekka=[]
for x in df:
kekka.append((np.sum(x)-1)/(len(x)-1))
return kekka
def wordkumokaki(df):
from wordcloud import WordCloud
import matplotlib.pyplot as plt
fpath = '************.ttc'#フォントファイル
words_wakati=" ".join(df)
wordcloud = WordCloud(
font_path=fpath,
background_color="white", # default=”black”/"white"
contour_width=3, contour_color='steelblue',
max_words=100, # default=200
min_font_size=4, #default=4
collocations = False #default = True
).generate(words_wakati)
plt.figure()
plt.imshow(wordcloud)
plt.show()
def csv_ittido(s_f,s_name,s_text):
fileCSV="c:/*********/"+s_f #CSVファイルの保存場所
docs=pd.read_csv(fileCSV)
ittido_id=[]
ittido_value=[]
ittido_volume=[]
for i_t in docs[s_text]:
ittido_value.append(i_t)
ittido_volume.append(len(i_t))
ittido_value=docs_ittido(ittido_value)
for i_i in docs[s_name]:
ittido_id.append(i_i)
ittido=[]
for i in range(0,len(ittido_id)):
retu=[]
retu.append(ittido_id[i])
retu.append(ittido_value[i])
retu.append(ittido_volume[i])
ittido.append(retu)
return np.array(ittido)
#return ittido #npにしない場合
if __name__ == '__main__':
#文字列の初期値
text1="すもももももももものうち"
text2="すももはももの1つです"
text3="すももはももです"
docs=[]
docs.append(text1)
docs.append(text2)
docs.append(text3)
print('単語の分かち書き')
df=wakachi(text1)
print(df)
print('ワードクラウド')
wordkumokaki(df)
print('単語の分かち書き(品詞付き)')
df=wakachi_part(text3,"名詞") #"動詞"、指定なしは""
print("単語:",df[0])
print("品詞:",df[1])
print('文書ベクトル')
print('1:',docs_vec(docs))
print('文書ベクトル(単語含む) ')
print('2:',docs_vec2(docs))
print('docsリストに対するcos類似度')
df=docs_cos(docs)
print(df)
print('docsリストに対する一致度(1:nのcos類似度の平均値)')
df=docs_ittido(docs)
print(df)
print('csvファイルに対する一致度(id,一致度、文字数をnumpyで返す)')
s_f='samplecsv.csv'
s_name="loginid" #フィールド名「loginid」に学籍番号
s_text="tassei" #フィールド名「tassei」に計算対象の文章
df=csv_ittido(s_f,s_name,s_text)
print(df)
北海道医療大学・情報センター