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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

717閲覧

Python テキスト分類・カテゴリーを自動化する方法

fideo

総合スコア55

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2023/02/01 04:19

編集2023/02/01 04:20

やりたいこと
事前に指定したカテゴリーを下記のテキストデータから分類したいです。

テキストファイル

家で仕事中にパソコンのネットが切れました。 LANケーブルを確認したところ抜けていました。 電車で東京に向かっている時に人身事故に遭ってしまった。 yahooニュースは毎日を見ています。

実現結果
テキストファイルをMeCabで解析後
出力されたカテゴリーをスコアごとでカウント
スコアが高い方のカテゴリーを判定し、カテゴリーとして表示させたいです。

分類されたカテゴリー:インターネット、ナビゲーション

試したこと
現状は下記のコードでやってみましたが、カテゴリーを表示させることできないです。
一番高いスコアを表示させることできますが、
どのようにテキストで分類されたカテゴリーを表示させることできますか。
スコアを判断させる時にリスト化して判断するようにしました。
コードの原因と解決策を教えていただけると嬉しいです。
また別の方法がありましたら、教えていただければ幸いです。

こちらのサイト参考しながら、テキスト分類を行いました。
ディープラーニングで文章・テキスト分類を自動化する方法

コード

import MeCab #天気の関連語をまとめたgazetteer weather_set = set(['晴れ','天気','雨','曇り']) #ナビゲーションの関連語をまとめたgazetteer navi_set = set(['渋谷','東京','電車','地図']) #インターネットの関連語をまとめたgazetteer internet_set = set(['ネット','パソコン','LANケーブル','yahooサイト']) mecab = MeCab.Tagger("-Ochasen") #MeCabの取得 #textファイルの読み込み #****には保存したtxtファイルのパス名を入れてください f= open(r"C:\Users\bunseki.txt", 'r', encoding='shift-jis') text=f.read() f.close() def classify_category(text): tokens = mecab.parse(text) #分かち書きを行う #print(tokens) token = tokens.split("\n") #print(token) weather_score = 0 #天気である可能性のスコア #print(weather_score) navi_score = 0 #ナビゲーションである可能性のスコア #print(navi_score) internet_score=0 #以下、分かち書き後の単語を抽出 for ele in token: element = ele.split("\t") #print(element) if element[0] == "EOS": break # 単語の表層を取得 surface = element[0] print(surface) #天気の関連語に含んでいたら1プラス if surface in weather_set: weather_score += 1 print(weather_score) #ナビゲーションの関連語に含んでいたら1プラス if surface in navi_set: navi_score += 1 print(navi_score) #インターネットの関連語に含んでいたら1プラス if surface in internet_set: internet_score += 1 print(internet_score) #関連用語をリスト化 list = [weather_score,navi_score,internet_score] #用語降順並び替え new_list=sorted(list, reverse=True) print(new_list) #ヒット用語のスコア高いカテゴリーを出力 list_max = max(list) print(list_max) #if分岐で分類されたカテゴリーを出力 # if weather_score > navi_score: # print("天気") # else: # print("ナビゲーション") classify_category(text)

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

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

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

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

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

jbpb0

2023/02/01 05:21

#if分岐で分類されたカテゴリーを出力 # if weather_score > navi_score: # print("天気") # else: # print("ナビゲーション") ↓ 変更 cat_list = ["天気", "ナビゲーション", "インターネット"] maxIndex = [i for i, x in enumerate(list) if x == max(list)] print("分類されたカテゴリー: ", end="") for num in range(len(maxIndex)): print(cat_list[maxIndex[num]], end="") if num != len(maxIndex) - 1: print(", ", end="") else: print("") で、どうでしょうか? (インデント付けてください)
guest

回答1

0

ベストアンサー

たんじゅんな方法としてはリストの要素にカテゴリ名も一緒にいれてやればよいです。
同点ならカテゴリ名の辞書順に並びます。

Python

1 #関連用語をリスト化 2 list = [(weather_score,'天気'), (navi_score,'ナビ'),(internet_score,'ネット')] 3 #用語降順並び替え 4 new_list=sorted(list, reverse=True) 5 print(new_list) # [(2, 'ネット'), (2, 'ナビ'), (0, '天気')]

また、カテゴリを適切なデータ構造にまとめておけば、以下のような感じでループで処理できます。

Python

1gazets = [ {'name':'天気', 'val':set(['晴れ','天気','雨','曇り'])}, 2 {'name':'ナビ', 'val':set(['渋谷','東京','電車','地図'])}, 3 {'name':'ネット', 'val':set(['ネット','パソコン','LANケーブル','yahooサイト'])}] 4 5# 名詞のみ抽出済みのテストデータ 6words = ['家', '仕事', '中', 'パソコン', 'ネット', 'LAN', 'ケーブル', '確認', 'ところ', 7 '電車', '東京', '時', '人身', '事故', 'yahoo', 'ニュース', '毎日'] 8 9counts = [[0,gazets[i]['name']] for i in range(len(gazets))] 10for word in words: 11 for i in range(len(gazets)): 12 if word in gazets[i]['val']: 13 counts[i][0] += 1 14 15counts = sorted(counts, reverse=True) 16print(counts) # [[2, 'ネット'], [2, 'ナビ'], [0, '天気']]

投稿2023/02/01 05:24

can110

総合スコア38266

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

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

fideo

2023/02/01 08:14

丁寧に教えてくれてありがとうございます。 すいません、0以外のスコアで表示させたいですが可能でしょうか。 下記のように行いましたが、上手く行きませんでした。 #関連用語をリスト化 list = [('天気',weather_score), ('ナビ',navi_score),('ネット',internet_score)] #list = [weather_score, navi_score,internet_score] #用語降順並び替え new_list=sorted(list, reverse=False) print(new_list) # [(2, 'ネット'), (2, 'ナビ'), (0, '天気')] a=np.nonzero(new_list) print(a[0])  [#('ナビ', 2), ('ネット', 2), ('天気', 0)]  #[0 0 1 1 2 2] 実現したい結果 #ネット、ナビ
can110

2023/02/01 08:20

nonzero関数の使い方は覚えていませんが、単純に以下のようなリスト内包表記でよいと思います。 print([e[1] for e in new_list if e[0] != 0]) # ['ネット', 'ナビ']
fideo

2023/02/02 00:44

ありがとうございます。勉強になりました。 やりたいこと問題なくできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問