前提・実現したいこと
文章の形態素解析を実施するにあたりエラーが出てきてしまいました。
単語の名詞を抽出して行っています。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) AttributeError: 'numpy.ndarray' object has no attribute 'sqrt' The above exception was the direct cause of the following exception: TypeError Traceback (most recent call last) <ipython-input-300-c18e50803453> in <module> 33 for n in range(len(all_words_df_new)): 34 cos_text = all_words_df_new.iloc[n] ---> 35 cos = np.dot(words_df_new_float, cos_text) / (np.linalg.norm(words_df_new_float)* np.linalg.norm(cos_text)) 36 cos_sim.append(cos) 37 all_words_df_new["cos_sim"] = cos_sim <__array_function__ internals> in norm(*args, **kwargs) ~\anaconda3\envs\watanabe\lib\site-packages\numpy\linalg\linalg.py in norm(x, ord, axis, keepdims) 2475 else: 2476 sqnorm = dot(x, x) -> 2477 ret = sqrt(sqnorm) 2478 if keepdims: 2479 ret = ret.reshape(ndim*[1]) TypeError: loop of ufunc does not support argument 0 of type numpy.ndarray which has no callable sqrt method
該当のソースコード
import numpy as np for number in range(len(expression["a"])): # すべての文章を順番に取り出す # 単語にする parts = ["名詞"] target_text = tagger.parse(expression["a"].iloc[number]).splitlines() words_df = pd.DataFrame() for i in target_text: if i == "EOS" or i == "": continue word_tmp = i.split()[0] part = i.split()[-1].split(",")[0] if not (part in parts):continue words_df[word_tmp] = [1] # 次元合わせする all_words_df_new = all_words_df for m in words_df.columns.values: if m in all_words_df_new.columns.values:continue all_words_df_new[m] = [0] words_df_new = pd.DataFrame() for z in all_words_df_new.columns.values: if z in words_df.columns.values:words_df_new[z] = [1] words_df_new[z] = [0] cos_sim = [] # display(words_df_new.head()) # display(all_words_df_new.head()) words_df_new_float = words_df_new.astype(np.float64) # print(all_words_df_new.dtypes) # print(words_df_new_float.dtypes) for n in range(len(all_words_df_new)): cos_text = all_words_df_new.iloc[n] cos = np.dot(words_df_new_float, cos_text) / (np.linalg.norm(words_df_new_float)* np.linalg.norm(cos_text)) cos_sim.append(cos) all_words_df_new["cos_sim"] = cos_sim all_words_df_new.sort_values("cos_sim",ascending=False).head()
試したこと
DataFrame型内はすべてfloatに書き換えていると思います。
プログラミング初心者のため解決できず現在に至っています。
エラーメッセージは極力全て掲載したほうが解決しやすいですよ
質問のコードには「sqrt」は見つかりません。本当のエラー発生箇所を提示してください。
すみません、ご指摘ありがとうございます。
編集しましたので前よりわかりやすくなったと思います。
words_df_new_floatは名前からするとpandas.DataFrameでしょうか?
中身はどうなっていますか?words_df_new_float.head()の出力結果を教えてください。
pandas.DataFrameだと思います。1列1200行で列名がついています。
浮腫 痛み 全身 掻痒 感 皮膚 科 外用 処方 ... アルコール 断 酒 経緯 中毒 9 年 9月 禁酒 cos_sim
0 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 rows × 1211 columns
これでわかるでしょうか、、。
for n in range(len(all_words_df_new)):
このforループの中でエラーが起きていると思いますが、「n」に何が入った時にエラーになるか、printなどして調べられますか?エラーになる時のall_words_df_new.iloc[n]がどうなってるのかも分かると良さそうです。
あとは、norm()でエラーになっているので、
norm(words_df_new_float)
と
norm(cos_text)
のどちらが、もしくは、両方ともエラーになるのか、切り分けできると良さそうです。
簡単なDataFrameで試したところnp.linalg.norm()でエラーは出ませんでした。
データに問題がないとすると原因不明ですね。
takutakuyaさんが書いてることの補足です
words_df_new_float = words_df_new.astype(np.float64)
の次に
tmp1 = np.linalg.norm(words_df_new_float)
を追加して、そこでエラーが出たら words_df_new_float を調べる
cos_text = all_words_df_new.iloc[n]
の次に
print(n)
tmp2 = np.linalg.norm(cos_text)
を追加して、そこでエラーが出たら all_words_df_new.iloc[n] を調べる
(「n」はエラーが出た時の実際の数値を入れる)
追加する行のインデントは、前の行に合わせてください
丁寧にありがとうございます。
tmp2 = np.linalg.norm(cos_text)でエラーが出てきました。
all_words_df_newの一行目は
0
浮腫 1
痛み 1
全身 0
掻痒 0
...
9 0
年 0
9月 0
禁酒 0
cos_sim [[nan]]
Name: 0, Length: 1211, dtype: object
となっています。
> DataFrame型内はすべてfloatに書き換えていると思います。
cos_text = all_words_df_new.iloc[n]
の次に追加した
print(n)
の次に、さらに
print(cos_text.map(type))
を追加すると、cos_textの各要素の型が表示されると思いますので、変なものが混ざってないか確認してみてください
> cos_sim [[nan]]
は、質問者さんが扱っているデータとして正しいのでしょうか?
参考
https://www.sejuku.net/blog/68519
https://techacademy.jp/magazine/33615
あなたの回答
tips
プレビュー