「敬語リスト」の修正
漢字の使用率に関する関数、カギカッコの使用率を計算する関数は正常に動作するのですが、「#敬語リストの読み込み」から「#予測と精度の評価」を入れるとうまく動作しません。修正する方法を教えていただきたいです。gogole colabでPythonを使用しております。
以下がコードです
MeCabの初期化。MeCabは日本語の形態素解析器で、テキストを形態素に分割するのに使用。
mecab = MeCab.Tagger("-Owakati")
def load_data(folder_path):
texts = []
labels = []
# 指定されたフォルダ内のすべてのファイルを走る。
for epoch in os.listdir(folder_path):
epoch_path = os.path.join(folder_path, epoch)
# ディレクトリ内のファイルをチェックします。
if os.path.isdir(epoch_path):
for filename in os.listdir(epoch_path):
file_path = os.path.join(epoch_path, filename)
with open(file_path, 'r', encoding='utf-8') as file:
text = file.read()
# 空白文字(スペース、タブ、改行など)を正規化します。
text = re.sub(r'\s+', ' ', text)
# MeCabを使用してテキストを形態素に分割し、処理しやすい形にします。ただし、形態素に分解してもしなくても、SVMではそれほど精度に影響しなかった。 morphemes = mecab.parse(text) texts.append(morphemes) # 形態素に分割されたテキストをリストに追加 labels.append(epoch) # ファイルが属するディレクトリ名(ラベルとして使用)を追加(つまり、各テキストの時代名) return texts, labels
texts, labels = load_data(folder_path)
#漢字の使用率を計算する関数(漢字の使用率を特徴量として入力しても、TF-IDFのみの場合と比較して精度は向上しない。)
def kanji_usage_rate(texts):
kanji_usage = []
for text in texts:
# 正規表現を使用して、漢字の数をカウントします。
kanji_count = len(re.findall(r'[\u4e00-\u9fff]', text))
total_count = len(text)
# 漢字の使用率を計算します。テキストが空の場合はゼロとします。
rate = kanji_count / total_count if total_count > 0 else 0
kanji_usage.append(rate)
return np.array(kanji_usage).reshape(-1, 1)
#カギカッコの使用率を計算する関数(カギカッコの使用率を特徴量として入力しても、TF-IDFのみの場合と比較して精度は向上しない。)
def bracket_usage_rate(texts):
bracket_usage = []
for text in texts:
# 正規表現を使用して、括弧の数をカウントします。
bracket_count = len(re.findall(r'[「」『』【】〈〉〔〕〘〙〚〛]', text))
total_count = len(text)
# 括弧の使用率を計算します。テキストが空の場合はゼロとします。
rate = bracket_count / total_count if total_count > 0 else 0
bracket_usage.append(rate)
return np.array(bracket_usage).reshape(-1, 1)
****# 敬語リストの読み込み
with open('/mnt/data/敬語リスト.txt', 'r', encoding='utf-8') as f:
keigo_list = [line.strip() for line in f.readlines()]
敬語リストを使って特徴量を追加
for keigo in keigo_list:
df[keigo] = df['text'].apply(lambda x: 1 if keigo in x else 0)
敬語リストの説明変数を作成
X_keigo_features = df[keigo_list]
テキストデータをベクトル化
vectorizer = CountVectorizer()
X_text = vectorizer.fit_transform(df['text'])
敬語の特徴量を追加
X_keigo = df[keigo_list].values
最終的な説明変数としてテキストベクトルと敬語特徴量を結合
import scipy.sparse
X = scipy.sparse.hstack((X_text, X_keigo))
y = df['label']
データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
SVM モデルの学習
model = svm.SVC()
model.fit(X_train, y_train)
予測と精度の評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'機械学習の精度: {accuracy:.2f}')
ストップワード(分析に不要な一般的な単語)のリストを定義します。(ストップワードを除去した結果、かえって性能が悪くなる。古文特有のストップワードが必要な可能性がある。)
stop_words = [
"の", "に", "は", "を", "た", "が", "て", "と", "し", "れ",
"さ", "ある", "も", "から", "な", "こと", "いる", "ない", "その",
"ため", "され", "あり", "これ", "られ", "など", "ど", "う", "ぬ",
"ず", "けり", "き", "かし", "しも", "せ", "そ", "なり", "べし", "まし",
"や", "やら", "より", "らし", "れば", "らむ", "む"
]
特徴量抽出器の定義
combined_features = FeatureUnion([
("tfidf", TfidfVectorizer(ngram_range=(1, 2), stop_words=stop_words)), # ユニグラムとバイグラムを使用(トライグラムまで使用しても精度は向上しない。) また、適当なストップワードであれば入れない方が精度が高い。
("kanji_usage", FunctionTransformer(kanji_usage_rate, validate=False)), #さほど精度に影響しない
("bracket_usage", FunctionTransformer(bracket_usage_rate, validate=False)) #さほど精度に影響しない
])
パイプラインの作成
pipeline = Pipeline([
("features", combined_features),
("classifier", SVC(kernel='poly', degree=4, coef0=1, C=1)) #多項式カーネルを使用、次数は2~4で精度に大きな差は存在しない。ガウスカーネルを使用すると逆に精度が低い。線形SVMでもある程度の精度はでる。
])
"""
データを訓練セットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(texts, labels, test_size=0.3, random_state=42) #テストサイズを0.3に設定。
モデルを訓練
pipeline.fit(X_train, y_train)
モデルの評価
y_pred = pipeline.predict(X_test)
print(classification_report(y_test, y_pred))
"""
あなたの回答
tips
プレビュー