質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

170閲覧

機械学習についての質問

mimami

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/11/10 04:29

「敬語リスト」の修正

漢字の使用率に関する関数、カギカッコの使用率を計算する関数は正常に動作するのですが、「#敬語リストの読み込み」から「#予測と精度の評価」を入れるとうまく動作しません。修正する方法を教えていただきたいです。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))
"""

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiroki-o

2024/11/10 06:41

Pythonでインデント不明は致命的です。```で括ってください。(Markdown記法)
meg_

2024/11/10 07:07

・コードが非常に読みにくいです。ヘルプを参考に修正してください。 https://teratail.com/help/question-tips#questionTips37 ・「うまく動作しません。」では状況が分かりません。エラーが出たのか期待した結果と異なる出力となったのかなど説明を追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問