TF-IDF+ janome で、類似文章の抽出。 自然言語処理(3)
index:
処理
・前処理、学習
# encoding: utf-8 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity import numpy as np from janome.tokenizer import Tokenizer # def get_token(text): t = Tokenizer() tokens = t.tokenize(text) word = "" for token in tokens: part_of_speech = token.part_of_speech.split(",")[0] if part_of_speech == "名詞": word +=token.surface + " " if part_of_speech == "動詞": word +=token.base_form+ " " if part_of_speech == "形容詞": word +=token.base_form+ " " if part_of_speech == "形容動詞": word +=token.base_form+ " " return word words1="利用人数は何人ですか?" words2="契約期間は、ありますか?" words3="オープンソースですか?" words4="オンライン決済は、可能ですか?" words5="製品価格、値段はいくらですか?" #words= get_token(words1 ) #print(words ) #quit() words =[] words.append(words1 ) words.append(words2 ) words.append(words3 ) words.append(words4 ) words.append(words5 ) #print(words ) tokens=[] for item in words: token=get_token(item) tokens.append(token) # #print(tokens ) docs = np.array(tokens) vectorizer = TfidfVectorizer(use_idf=True, token_pattern=u'(?u)\\b\\w+\\b') print(tokens) #quit() vecs = vectorizer.fit_transform(docs )
・評価
fit_transformで、学習した結果を。
適当な、文章で cos類似度の計算
類似度の高い、文章を抽出
入力配列から、index 番号を出力
類似度の高い、文章の出力
str="利用人数は?" #str="契約期間" #str="価格は?" instr = get_token(str ).strip() print("instr=", instr ) x= vectorizer.transform( [ instr ]) #print( "x=",x) num_sim=cosine_similarity(x , vecs) print(num_sim ) index = np.argmax( num_sim ) print("word=", words[index]) print()
テスト
['利用 人数 何 人 ', '契約 期間 ある ', 'オープン ソース ', 'オンライン 決済 可能 ? ', '製品 価格 値段 いくら '] instr= 利用 人数 [[ 0.70710678 0. 0. 0. 0. ]] word= 利用人数は何人ですか?
=> 正しく、抽出できました。
追加している。
文章の数が少ないですが、ある程度。判定処理は
正しいようです。
データセットに、応答分を追加しておくと
会話の応答出力も、出力できそうですね。