news_summarizer / tfidf_calculator.py
Kota Takahashi
説明文を修正
44bec05
import MeCab
import re
from sklearn.feature_extraction.text import TfidfVectorizer
class JapaneseTextVectorizer:
def __init__(self):
"""
MeCabのTaggerとTF-IDFベクトライザーを初期化
"""
self.mecab_tagger = MeCab.Tagger()
self.tfidf_model = TfidfVectorizer(token_pattern='(?u)\\b\\w+\\b', norm=None)
self.vocab_list = []
def _extract_nouns(self, text):
"""
テキストから名詞を抽出
Parameters:
- text (str): 名詞を抽出する対象のテキスト
Returns:
- nouns (list): 抽出された名詞リスト
"""
node = self.mecab_tagger.parseToNode(text)
nouns = []
while node:
word = node.surface
hinshi = node.feature.split(",")[0]
if hinshi == "名詞":
if (not word.isnumeric()) and (not re.match(r'^[\u3040-\u309F]+$', word)):
# 名詞が数値と平仮名のみの場合は除き、それ以外の名詞を保存
nouns.append(word)
node = node.next
return nouns
def fit_transform(self, text):
"""
テキストをTF-IDF表現に変換
Parameters:
- text (str): TF-IDF表現に変換する対象のテキスト
Returns:
- tfidf_dict (dict): 単語とそのTF-IDF値を格納した辞書
"""
nouns = self._extract_nouns(text)
self.tfidf_model.fit(nouns)
vocab_text = " ".join(nouns)
tfidf_vec = self.tfidf_model.transform([vocab_text]).toarray()[0]
tfidf_dict = dict(zip(self.tfidf_model.get_feature_names_out(), tfidf_vec))
tfidf_dict = {word: num_val for word, num_val in tfidf_dict.items() if num_val > 0}
# TF-IDF値で辞書をソートし、上位5つの要素を取得
top_tfidf = dict(sorted(tfidf_dict.items(), key=lambda x: x[1], reverse=True)[:5])
return top_tfidf