回答編集履歴
5
fix answer
test
CHANGED
@@ -51,4 +51,4 @@
|
|
51
51
|
|
52
52
|
普通はエラーを見て,Pythonが示す意図を察し,実装したいことと比較して,対処を考える必要があります.なので,こういったリファレンスを参照する力も要求されると思います.そうでなくても最低限「[mecab parse to node](https://www.google.com/search?q=mecab+parse+to+node)」などと検索して[使いたい機能を使ってみている人](https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180)を探され,真似るべきです.ただ,Webサイトや本で書かれているコードが正しいとも限りません.さらには自分がやりたいことに合致しないコードなんてざらにあります.他人のコードを丸々コピペして動くと思わない方が良いでしょうけれど,少なくともあなたの力になるはずです.
|
53
53
|
|
54
|
-
エラーの読解力と,情報収集力に繋がればと思い,長々と書かせていただきました.疑問の解消と今後の成長になれば幸いです.
|
54
|
+
エラーの読解力と,情報収集力に繋がればと思い,長々と書かせていただきました.疑問の解消と今後の成長になれば幸いです.自然言語処理に取り組まれるよりも先にプログラミングの勉強から始められることをお勧めしておきます.[1つ前の質問](https://teratail.com/questions/3pzc0953vno96n)も[配列操作](https://www.google.com/search?q=python+%E9%85%8D%E5%88%97+%E8%BF%BD%E5%8A%A0)に関する知識があれば実装可能かと思います.
|
4
fix context
test
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
Pythonは誰にでも使えると
|
1
|
+
Pythonは誰にでも使えると謳われるとはいえ,何を書いても動くというわけではありません.
|
2
|
-
おそらく,何かのWebサイトや教科書を参考にして書かれていると思いますが,
|
2
|
+
おそらく,質問のコードは何かのWebサイトや教科書を参考にして書かれていると思いますが,参考元のコードは概ね[ドキュメント](https://taku910.github.io/mecab/)を読んだ上で書かれたもので,適当に書いて動いた,というものではありません.これから「理屈で解決する.」ということを念頭に話を進めていきます.
|
3
3
|
|
4
4
|
さて,このドキュメントが示す[コードリファレンス](https://taku910.github.io/mecab/doxygen/annotated.html)では,[Tagger Class](https://taku910.github.io/mecab/doxygen/classMeCab_1_1Tagger.html)についての記述があります.今回はコード中で`MeCab.Tagger()`としてこのクラスを使用していることから,これに関するものが使われるということになりますね.
|
5
5
|
|
3
update context
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
現状出ているエラー`AttributeError: 'str' object has no attribute 'parseToNode'`に関して
|
28
28
|
> 私としては,これでstr型の引数を与えられているとは思うのですが、、、
|
29
|
-
と
|
29
|
+
と考えられているものの,引数に文字列を与えていることは正しいですが,解決にあたって着眼点が本質的ではありません.
|
30
30
|
|
31
31
|
内容は`str`オブジェクトには属性`parseToNode`は存在しない.というものです(翻訳してそのまんまの意味です).[strオブジェクトの属性](https://docs.python.org/ja/3/library/string.html)を確認すると,確かに`parseToNode`は存在しないことがわかります.
|
32
32
|
|
@@ -39,9 +39,9 @@
|
|
39
39
|
for key in j:
|
40
40
|
data = key["text"]
|
41
41
|
mecab = MeCab.Tagger() # Tagger Classであるオブジェクトmecabを作成
|
42
|
-
m = mecab.parse(data) # Tagger Classには文字列を受け付けて文字列を返すparse()があるので使ってみる(mは今後使われない)
|
42
|
+
m = mecab.parse(data) # Tagger Classには文字列を受け付けて文字列を返すtagger.parse()があるので使ってみる(文字列mは今後使われない)
|
43
|
-
node = mecab.parseToNode(data) # Tagger Classには文字列を受け付けてノードを返すparseToNode()があるので使ってみる
|
43
|
+
node = mecab.parseToNode(data) # Tagger Classには文字列を受け付けてノードを返すtagger.parseToNode()があるので使ってみる
|
44
|
-
while node: # nodeが
|
44
|
+
while node: # nodeがNoneになるまで
|
45
45
|
word = node.surface # nodeの文字を取り出し
|
46
46
|
pos = node.feature.split(',')[0] # 品詞(part of speech)を取り出し
|
47
47
|
print(f"{word}: {pos}") # 両方とも表示
|
@@ -49,6 +49,6 @@
|
|
49
49
|
```
|
50
50
|
突然出てきた`node`の扱いですが,もちろんこれも[mecab_node_t Struct Reference](https://taku910.github.io/mecab/doxygen/structmecab__node__t.html)に記述があり,これに基づいて書かれるコードです.`node.wcost`とかで単語コストを見れることがわかりますね.
|
51
51
|
|
52
|
-
普通はエラーを見て,Pythonが示す意図を察し,
|
52
|
+
普通はエラーを見て,Pythonが示す意図を察し,実装したいことと比較して,対処を考える必要があります.なので,こういったリファレンスを参照する力も要求されると思います.そうでなくても最低限「[mecab parse to node](https://www.google.com/search?q=mecab+parse+to+node)」などと検索して[使いたい機能を使ってみている人](https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180)を探され,真似るべきです.ただ,Webサイトや本で書かれているコードが正しいとも限りません.さらには自分がやりたいことに合致しないコードなんてざらにあります.他人のコードを丸々コピペして動くと思わない方が良いでしょうけれど,少なくともあなたの力になるはずです.
|
53
53
|
|
54
54
|
エラーの読解力と,情報収集力に繋がればと思い,長々と書かせていただきました.疑問の解消と今後の成長になれば幸いです.
|
2
update context
test
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
Pythonは誰にでも使えると歌われるとはいえ,何を書いても動くというわけではありません.
|
2
|
-
おそらく,何かのWebサイトや教科書を参考にして書かれていると思いますが,これらは全て,[ドキュメント](https://taku910.github.io/mecab/)を読んだ上で書かれたもので,適当に書いて動いた,というものではありません.
|
2
|
+
おそらく,何かのWebサイトや教科書を参考にして書かれていると思いますが,これらは全て,[ドキュメント](https://taku910.github.io/mecab/)を読んだ上で書かれたもので,適当に書いて動いた,というものではありません.理屈で解決する.ということを念頭に話を進めていきます.
|
3
3
|
|
4
4
|
さて,このドキュメントが示す[コードリファレンス](https://taku910.github.io/mecab/doxygen/annotated.html)では,[Tagger Class](https://taku910.github.io/mecab/doxygen/classMeCab_1_1Tagger.html)についての記述があります.今回はコード中で`MeCab.Tagger()`としてこのクラスを使用していることから,これに関するものが使われるということになりますね.
|
5
5
|
|
@@ -10,9 +10,9 @@
|
|
10
10
|
|`virtual const char *`|`parse(const char *str)`|
|
11
11
|
|`virtual const Node *`|`parseToNode(const char *str)`|
|
12
12
|
|
13
|
-
の記述が今回使いたそうにしているものと一致するように見えます.MeCabはC++で書かれているのでPythonの書式とは異なるものの,`parse()`も`parseToNode()`もどちらも文字列を意味する`char *str`を引数に要求していますね.`parse()`の戻り値は文字
|
13
|
+
の記述が今回使いたそうにしているものと一致するように見えます.MeCabはC++で書かれているのでPythonの書式とは異なるものの,`parse()`も`parseToNode()`もどちらも文字列を意味する`char *str`を引数に要求していますね.`parse()`の戻り値は文字`char`のポインタ`char *`,`parseToNode()`の戻り値はノードのポインタ`Node *`であることがわかりました.
|
14
14
|
|
15
|
-
いずれも集合型を受け付けておらず,文字列を引数に取らなければならない.というのはここで確認ができました.
|
15
|
+
返り値は違うものの,いずれも集合型を受け付けておらず,文字列を引数に取らなければならない.というのはここで確認ができました.
|
16
16
|
|
17
17
|
### 追加情報2に対するfix
|
18
18
|
現状のコードは
|
@@ -24,7 +24,13 @@
|
|
24
24
|
```
|
25
25
|
でしたね.提示いただいたJSONファイルの例で`key["text"]`は既に文字列型であることがわかったので,`mecab.parse(str(data))`の際に`str()`は不要であることがわかります.
|
26
26
|
|
27
|
-
|
27
|
+
現状出ているエラー`AttributeError: 'str' object has no attribute 'parseToNode'`に関して
|
28
|
+
> 私としては,これでstr型の引数を与えられているとは思うのですが、、、
|
29
|
+
とおっしゃられていますが,引数に文字列を与えていることは正しいですが,着眼点が解決にあたって本質的ではありません.
|
30
|
+
|
31
|
+
内容は`str`オブジェクトには属性`parseToNode`は存在しない.というものです(翻訳してそのまんまの意味です).[strオブジェクトの属性](https://docs.python.org/ja/3/library/string.html)を確認すると,確かに`parseToNode`は存在しないことがわかります.
|
32
|
+
|
33
|
+
`parseToNode`は,先ほど`Tagger Class`について述べた通り「`Tagger Class`の」Member Function(Pythonで言う属性)であったはずです.なのにも関わらず,`m = mecab.parse(str(data))`で得られた文字列型オブジェクト`m`に対して,`m.parseToNode(str(data))`と書かれていますね.これでは動くはずがありません.
|
28
34
|
|
29
35
|
ちゃんと`Tagger Class`である`mecab`に対して`parseToNode()`を行いましょう.
|
30
36
|
|
1
update context
test
CHANGED
@@ -5,35 +5,35 @@
|
|
5
5
|
|
6
6
|
中でも
|
7
7
|
|
8
|
-
|Type|Member Functions|
|
8
|
+
|Return Type|Member Functions|
|
9
9
|
|:--|:--:|
|
10
10
|
|`virtual const char *`|`parse(const char *str)`|
|
11
11
|
|`virtual const Node *`|`parseToNode(const char *str)`|
|
12
12
|
|
13
|
-
の記述が今回使いたそうにしているものと一致するように見えます.MeCabはC++で書かれているのでPythonの書式とは異なるものの,`parse()`も`parseToNode()`もどちらも文字列を意味する`char *str`を引数に要求していますね.
|
13
|
+
の記述が今回使いたそうにしているものと一致するように見えます.MeCabはC++で書かれているのでPythonの書式とは異なるものの,`parse()`も`parseToNode()`もどちらも文字列を意味する`char *str`を引数に要求していますね.`parse()`の戻り値は文字列`char *`,`parseToNode()`の戻り値はノード`Node *`であることがわかりました.
|
14
14
|
|
15
|
-
集合型を受け付けておらず,文字列を引数に取らなければならない.というのはここで確認ができました.
|
15
|
+
いずれも集合型を受け付けておらず,文字列を引数に取らなければならない.というのはここで確認ができました.
|
16
16
|
|
17
17
|
### 追加情報2に対するfix
|
18
18
|
現状のコードは
|
19
19
|
```Python
|
20
|
-
data = key["text"]
|
20
|
+
data = key["text"] # JSONデータから文字列を取り出し
|
21
|
-
mecab = MeCab.Tagger()
|
21
|
+
mecab = MeCab.Tagger() # Tagger Classであるmecabを作成
|
22
|
-
m = mecab.parse(str(data))
|
22
|
+
m = mecab.parse(str(data)) # 文字列str(data)をtagger.parse()して文字列mを作成(先述の通りparseの返り値は文字列である)
|
23
|
-
node = m.parseToNode(str(data))
|
23
|
+
node = m.parseToNode(str(data)) # 文字列mに対してstr.parseToNode()を実行 <- ここでエラー
|
24
24
|
```
|
25
|
-
でしたね.提示いただいたJSONファイルの例で`key["text"]`は既に文字列型であることがわかったので,`mecab.parse(str(data))`の際に`str()`は不要であることがわかりま
|
25
|
+
でしたね.提示いただいたJSONファイルの例で`key["text"]`は既に文字列型であることがわかったので,`mecab.parse(str(data))`の際に`str()`は不要であることがわかります.
|
26
26
|
|
27
27
|
次に,現状出ているエラー`AttributeError: 'str' object has no attribute 'parseToNode'`ですが,`str`オブジェクトには属性`parseToNode`は存在しない.というものです(翻訳してそのまんまの意味です).先に`Tagger Class`について述べた通り`parseToNode`は`Tagger Class`のMember Functionであったはずです.なのにも関わらず,`m = mecab.parse(str(data))`で得られた文字列`m`に対して,`m.parseToNode(str(data))`と書かれていますね.これでは動くはずがありません.
|
28
28
|
|
29
|
-
ちゃんと`Tagger Class`に対して`parseToNode()`を行いましょう.
|
29
|
+
ちゃんと`Tagger Class`である`mecab`に対して`parseToNode()`を行いましょう.
|
30
30
|
|
31
31
|
具体的には,次のようにコードを書く必要があります.
|
32
32
|
```Python
|
33
33
|
for key in j:
|
34
34
|
data = key["text"]
|
35
35
|
mecab = MeCab.Tagger() # Tagger Classであるオブジェクトmecabを作成
|
36
|
-
m = mecab.parse(data) # Tagger Classには文字列を受け付けて文字列を返すparse()があるので使ってみる
|
36
|
+
m = mecab.parse(data) # Tagger Classには文字列を受け付けて文字列を返すparse()があるので使ってみる(mは今後使われない)
|
37
37
|
node = mecab.parseToNode(data) # Tagger Classには文字列を受け付けてノードを返すparseToNode()があるので使ってみる
|
38
38
|
while node: # nodeがEOSになるまで
|
39
39
|
word = node.surface # nodeの文字を取り出し
|
@@ -43,6 +43,6 @@
|
|
43
43
|
```
|
44
44
|
突然出てきた`node`の扱いですが,もちろんこれも[mecab_node_t Struct Reference](https://taku910.github.io/mecab/doxygen/structmecab__node__t.html)に記述があり,これに基づいて書かれるコードです.`node.wcost`とかで単語コストを見れることがわかりますね.
|
45
45
|
|
46
|
-
普通はエラーを見て,Pythonが示す意図を察し,可能な対処を考える必要がありますし,Webサイトや本で書かれているコードが正しいとも限りません.
|
46
|
+
普通はエラーを見て,Pythonが示す意図を察し,可能な対処を考える必要があります.なので,こういったリファレンスを参照する力も要求されると思います.そうでなくても最低限「[mecab parse to node](https://www.google.com/search?q=mecab+parse+to+node)」などと検索して[使いたい機能を使ってみている人](https://qiita.com/yonedaco/items/27e1ad19132c9f1c9180)を探されるべきです.ただ,Webサイトや本で書かれているコードが正しいとも限りません.さらには自分がやりたいことに合致しないコードなんてざらにあります.他人のコードを丸々コピペして動くと思わない方が良いでしょうけれど,あなたの力になるはずです.
|
47
47
|
|
48
48
|
エラーの読解力と,情報収集力に繋がればと思い,長々と書かせていただきました.疑問の解消と今後の成長になれば幸いです.
|