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

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

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

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

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

1077閲覧

TF-IDFを用いた重み付けのコードのエラーに関して

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2018/09/04 11:59

編集2023/09/22 23:18

前提・実現したいこと

PythonでTF-IDFを用いた重み付けを行おうとしています。

発生している問題・エラーメッセージ

もとのコードがpython2系だったので、3系に直す部分print()などを加えて実行したところ、以下のエラーが出ました。修正方法がわからず、困っています。

もとのコードは参考ページに記載されているコードです。

python

1$ python tfidf.py 2total texts: 5 3Traceback (most recent call last): 4 File "tfidf.py", line 26, in <module> 5 node = tagger.parseToNode(txt.encode('utf-8')) 6 File "/Users/username/anaconda/lib/python3.6/site-packages/MeCab.py", line 282, in parseToNode 7 def parseToNode(self, *args): return _MeCab.Tagger_parseToNode(self, *args) 8TypeError: in method 'Tagger_parseToNode', argument 2 of type 'char const *'

該当のソースコード

tfidf.py

Python

1# -*- coding: utf-8 -*- 2 3import MeCab # 形態素解析器MeCab 4 5import math 6 7# 文書集合のサンプル 8text = ["ミニアルバム☆ 新谷良子withPBB「BANDScore」 絶賛発売chu♪ いつもと違い、「新谷良子withPBB」名義でのリリース!! 全5曲で全曲新録!とてもとても濃い1枚になりましたっ。 PBBメンバーと作り上げた、新たなバンビポップ。 今回も、こだわり抜いて", "2012年11月24日 – 2012年11月24日(土)/12:30に行われる、新谷良子が出演するイベント詳細情報です。", "単語記事: 新谷良子. 編集 Tweet. 概要; 人物像; 主な ... その『ミルフィーユ・桜葉』という役は新谷良子の名前を広く認知させ、本人にも大切なものとなっている。 このころは演技も歌も素人丸出し( ... え、普通のことしか書いてないって? 「普通って言うなぁ!」", "2009年10月20日 – 普通におっぱいが大きい新谷良子さん』 ... 新谷良子オフィシャルblog 「はぴすま☆だいありー♪」 Powered by Ameba ... 結婚 356 名前: ノイズh(神奈川県)[sage] 投稿日:2009/10/19(月) 22:04:20.17 ID:7/ms/OLl できたっちゃ結婚か", "2010年5月30日 – この用法の「壁ドン(壁にドン)」は声優の新谷良子の発言から広まったものであり、一般的には「壁際」+「追い詰め」「押し付け」などと表現される場合が多い。 ドンッ. 「……黙れよ」. このように、命令口調で強引に迫られるのが女性のロマンの"] 9 10txt_num = len(text) 11print ('total texts:', txt_num) 12#print 13 14fv_tf = [] # ある文書中の単語の出現回数を格納するための配列 15fv_df = {} # 単語の出現文書数を格納するためのディクショナリ 16word_count = [] # 単語の総出現回数を格納するための配列 17 18fv_tf_idf = [] # ある文書中の単語の特徴量を格納するための配列 19 20count_flag = {} # fv_dfを計算する上で必要なフラグを格納するためのディクショナリ

補足情報(FW/ツールのバージョンなど)

Python 3.6.0 :: Anaconda 4.3.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因

python2系のMeCabバインディングは、パース系のメソッドの引数がstr(python3のbytesに該当)ですが、python3系のMeCabバインディングではstr(python2のunicodeに該当)です。

こう直せばとりあえず動くかと。他にエラーが出ないかどうかは確認していませんが。

python

1tagger.parseToNode(txt)

そのフォーマットの商品名をMeCabで形態素解析するのは、困難です。

かなりグチャグチャになります(辞書にもよるとは思いますが……)。

$ mecab コカ・コーラ 綾鷹 お茶 ペットボトル (2L×6本)×2箱 コカ・コーラ 名詞,固有名詞,一般,*,*,*,コカ・コーラ,コカコーラ,コカコーラ 綾 名詞,一般,*,*,*,*,綾,アヤ,アヤ 鷹 名詞,一般,*,*,*,*,鷹,タカ,タカ お茶 名詞,一般,*,*,*,*,お茶,オチャ,オチャ ペットボトル 名詞,一般,*,*,*,*,ペットボトル,ペットボトル,ペットボトル ( 名詞,サ変接続,*,*,*,*,* 2 名詞,数,*,*,*,*,* L× 名詞,一般,*,*,*,*,* 6 名詞,数,*,*,*,*,* 本 名詞,接尾,助数詞,*,*,*,本,ホン,ホン ) 名詞,サ変接続,*,*,*,*,* × 記号,一般,*,*,*,*,×,カケル,カケル 2 名詞,数,*,*,*,*,* 箱 名詞,接尾,助数詞,*,*,*,箱,ハコ,ハコ EOS Clover カットワークはさみ 115 サック付き 36-666 Clover 名詞,固有名詞,組織,*,*,*,* カット 名詞,サ変接続,*,*,*,*,カット,カット,カット ワーク 名詞,一般,*,*,*,*,ワーク,ワーク,ワーク はさみ 名詞,一般,*,*,*,*,はさみ,ハサミ,ハサミ 115 名詞,数,*,*,*,*,* サック 名詞,一般,*,*,*,*,サック,サック,サック 付き 名詞,接尾,一般,*,*,*,付き,ツキ,ツキ 36 名詞,数,*,*,*,*,* - 名詞,サ変接続,*,*,*,*,* 666 名詞,数,*,*,*,*,* EOS

むしろ何もしなくてもスペースで適当に区切られているのですから、空白区切りで済ませられませんかね。


TF-IDFの計算を自分で書くのは辛いので、ライブラリを使いましょう。

メジャーな選択肢としては、

  • sklearnの実装
  • gensimの実装

くらいしかないと思います。gensimの方は使い方が少し面倒くさいので、sklearnを勧めます。
(gensimをけなしている訳ではなく、gensimには自由度が高かったり、パフォーマンスやコードの再利用性などが高まるように色々配慮してくれているという利点があります。ただ、それを使いこなすために手間が増えるのは事実です)

参考リンク

sklearn.feature_extraction.text.TfidfVectorizer — scikit-learn 0.19.2 documentation
scikit-learnでtf-idfを計算する
TF-IDF で文書をベクトル化。python の TfidfVectorizer を使ってみる | コード7区
【python】TF-IDFで重要語を抽出してみる - 静かなる名辞(私のブログです。以前似たようなものを書いたので紹介します)

投稿2018/09/04 12:20

編集2018/09/04 12:42
hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/09/04 13:26

ご丁寧にご回答いただきましてありがとうございます。 紹介いただいた方法でそれっぽいことができました。 「高すぎるものを除去した上で」と前回のご回答で明記された理由は何でしょうか。
hayataka2049

2018/09/04 13:38

idfが大きすぎて(出現頻度が低すぎて)tfidfが高くなる語があるからです。一般にそういう語は「ノイズ」ということになります。 sklearnのクラスを用いるなら、min_df等を指定して適当に制限をかければ良いということになります。
退会済みユーザー

退会済みユーザー

2018/09/05 13:06

お返事いただきましてありがとうございます。 ご回答を受けてやってみたことに追記させていただいた結果に関して、伺いたいことがございます。 ①TF-IDFのコードの中で分かち書きのように分割される塊((2L×6本)×2箱など)がありますが、記号などを除くことにより分割されたように見えるだけでしょうか。 ②数字・英字・ひらがな・カタカナ・漢字が順番に表示され、漢字以外は昇順に表示されるのですが、これはsortをしているせいでしょうか。sortされているせいでカタカナの単語間で特徴量の大小は判断できないのでしょうか。 具体的には「ペットボトル」という単語は「カットワークはさみ」よりも特徴量の小さいような印象をうけるのですが、そういった部分まで実装はむずかしいのでしょうか。
退会済みユーザー

退会済みユーザー

2018/09/05 13:07

hayataka2049様のブログ記事も拝見させていたきました。 sklearnのdatasetsを入力として使用されており、この部分がわからず、活用させていただくことが難しい状況です。 お手数おかけしますが、もしご存知のことがございましたら、教えていただけますと大変助かります。
hayataka2049

2018/09/05 22:28

なにをやっているのかわからないので想像するしかありませんが、恐らくvocabulary_をprintしているのかなと 特徴量の重みに基づいて出力するようなコードを作成する必要があります
退会済みユーザー

退会済みユーザー

2018/09/05 22:29

お返事いただきましてありがとうございます。 具体的には別質問の試したことに追記致しました。 特徴量の重みに基づいて出力するようなコードを作成したいのですが、配列で出力している値を使用することが方法でしょうか。
hayataka2049

2018/09/05 22:32

そういうことになります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問