回答編集履歴

6

trivial

2018/06/06 12:14

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -128,13 +128,13 @@
128
128
 
129
129
 
130
130
 
131
- langを付けることでシンセットが取り出せました。
131
+ langを付けることで日本語からシンセットが引けました。
132
132
 
133
133
 
134
134
 
135
135
 
136
136
 
137
- 以上から、`convWords2Synsets`関数は以下の様になるでしょう。(よくない点は多いですが直さないでおきましょう
137
+ 以上から、`convWords2Synsets`関数は以下の様になるでしょう。(よくない点は多いですが直さないでおきま
138
138
 
139
139
  ```
140
140
 

5

追記

2018/06/06 12:14

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -52,7 +52,7 @@
52
52
 
53
53
  [https://ja.1answer.info/737461636b6f766572666c6f772e636f6d-7a3331343738313532](https://ja.1answer.info/737461636b6f766572666c6f772e636f6d-7a3331343738313532)
54
54
 
55
- を見ると、`WordNetCorpusReader`のコンストラクタの第2引数に渡すのは Open Multilingual Wordnet ([http://compling.hss.ntu.edu.sg/omw/](http://compling.hss.ntu.edu.sg/omw/))で提供している、多国語対応Wordnetのファイルを置いたディレクトリの様です。
55
+ を見ると、`WordNetCorpusReader`のコンストラクタの第2引数に渡すのは Open Multilingual Wordnet ([http://compling.hss.ntu.edu.sg/omw/](http://compling.hss.ntu.edu.sg/omw/))で提供している、~~多国語対応Wordnetのファイルを置いたディレクトリの様です~~
56
56
 
57
57
 
58
58
 
@@ -85,3 +85,77 @@
85
85
  古いNLTKを使って動かす(どんな問題が起きるかはわからない)
86
86
 
87
87
  の2択になるのではないでしょうか。
88
+
89
+
90
+
91
+ ----
92
+
93
+
94
+
95
+ ちゃんと調べて、omw は nltk にコーパスとして登録されていることが確認できました。
96
+
97
+ Python対話環境で以下のコードを試してみてください。
98
+
99
+
100
+
101
+ ```
102
+
103
+ >>> import nltk
104
+
105
+ >>> nltk.download('wordnet')
106
+
107
+ (略)
108
+
109
+ >>> nltk.download('omw')
110
+
111
+ (略)
112
+
113
+ >>> from nltk.corpus import wordnet
114
+
115
+ >>> wordnet.synsets('サル', lang='jpn')
116
+
117
+ [Synset('simian.n.01'), Synset('monkey.n.01'), Synset('anthropoid.n.01')]
118
+
119
+ >>> wordnet.synsets('人間', lang='jpn')
120
+
121
+ [Synset('person.n.01'), Synset('homo.n.02'), Synset('world.n.08'), Synset('person.n.02'), Synset('man.n.03')]
122
+
123
+ >>> wordnet.synsets('サル', lang='jpn')[1].path_similarity(wordnet.synsets('人間', lang='jpn')[4]) # サルの2番目と人間の5番目の類似度
124
+
125
+ 0.1
126
+
127
+ ```
128
+
129
+
130
+
131
+ langを付けることでシンセットが取り出せました。
132
+
133
+
134
+
135
+
136
+
137
+ 以上から、`convWords2Synsets`関数は以下の様になるでしょう。(よくない点は多いですが直さないでおきましょう)
138
+
139
+ ```
140
+
141
+ def convWords2Synsets(wordList1, wordList2):
142
+
143
+ """ 単語リストを2つ受け取って概念リストのリストを返す """
144
+
145
+ from nltk.corpus import wordnet
146
+
147
+
148
+
149
+ synLists = [[ ],[ ]]
150
+
151
+ wordLists = [wordList1, wordList2]
152
+
153
+ for i in [0,1]:
154
+
155
+ for j in range(len(wordLists[i])):
156
+
157
+ synLists[i].append(wordnet.synsets(wordLists[i][j], lang='jpn'))
158
+
159
+ return synLists
160
+
161
+ ```

4

追記

2018/06/06 11:53

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -69,3 +69,19 @@
69
69
  ですから`jwn.synsets()`を日本語を引数に呼び出してもシンセットが返ってこないはずです。
70
70
 
71
71
  すべての結果が空なので、エラーがでている箇所`max(sims)`の`sims`が空になっているんじゃないでしょうか?
72
+
73
+
74
+
75
+ ----
76
+
77
+ `jwn_corpusreader.py`のコード、使われてないからなにかと思いましたが、これは古いNLTK用のソースですか? 動かなかったので捨てたんでしょうか。
78
+
79
+
80
+
81
+ 新しいNLTKでちゃんと動くように直す
82
+
83
+
84
+
85
+ 古いNLTKを使って動かす(どんな問題が起きるかはわからない)
86
+
87
+ の2択になるのではないでしょうか。

3

追記

2018/06/06 06:23

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -41,3 +41,31 @@
41
41
 
42
42
 
43
43
  いまは、Sublimeで作成してPythonで読んでいるので、「BOMを気にしないといけない状況ではない」と判断しています。
44
+
45
+
46
+
47
+ ----
48
+
49
+ ちょっと調べてみました。
50
+
51
+
52
+
53
+ [https://ja.1answer.info/737461636b6f766572666c6f772e636f6d-7a3331343738313532](https://ja.1answer.info/737461636b6f766572666c6f772e636f6d-7a3331343738313532)
54
+
55
+ を見ると、`WordNetCorpusReader`のコンストラクタの第2引数に渡すのは Open Multilingual Wordnet ([http://compling.hss.ntu.edu.sg/omw/](http://compling.hss.ntu.edu.sg/omw/))で提供している、多国語対応Wordnetのファイルを置いたディレクトリの様です。
56
+
57
+
58
+
59
+ ```
60
+
61
+ jwn = WordNetCorpusReader('nltk_data/corpora/wordnet', 'wnjpn-ok.tab')
62
+
63
+ ```
64
+
65
+ としていますが、これだと(`wnjpn-ok.tab`が件のディレクトリでないなら)日本語Wordnetのセットアップになっていません。
66
+
67
+
68
+
69
+ ですから`jwn.synsets()`を日本語を引数に呼び出してもシンセットが返ってこないはずです。
70
+
71
+ すべての結果が空なので、エラーがでている箇所`max(sims)`の`sims`が空になっているんじゃないでしょうか?

2

追記

2018/06/06 06:09

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -3,3 +3,41 @@
3
3
  意図的にBOM付きを指定しなければ普通は入りません。
4
4
 
5
5
  そこは気にしないでロジックを直すことに集中すればいいと思います。
6
+
7
+
8
+
9
+ ----
10
+
11
+
12
+
13
+ UTF-8、UTF-16、UTF-32はUnicodeのコードポイント(**ある**文字に振られた番号)をバイナリデータに変換する仕様ですが、UTF-16やUTF-32には複数バイト分のデータの並び順にリトルエンディアンとビッグエンディアンの2種類あって、そのことをエンディアンとかバイトオーダーとか呼んでいます。
14
+
15
+
16
+
17
+ ということは例えば「UTF-16で書かれたファイル」といってもその表現方法に2種類あることにあります。
18
+
19
+ 「このファイルはどちらのエンディアンで書かれているのか」がわからないと文字情報を読み取れません。そのため、エンディアンを識別するためにファイルの先頭に特別な**印**を置くことができる仕様になっています。
20
+
21
+ これをBOM(Byte Order Mark)と呼びます。
22
+
23
+
24
+
25
+ UTF-8には実質エンディアンは関係ないのですが、UTF-16やUTF-32に倣って「このファイルはUTF-8でエンコードされている」ことを示す**印**を置くこともできます。それも(やっぱりUTF-16やUTF-32に倣って)BOMと呼びます。
26
+
27
+ したがって、UTF-8には「BOMを付けたファイル」と「BOMを付けていないファイル」の2種類があるわけです。
28
+
29
+
30
+
31
+ さて、PythonやSublimeのエンコーディング名、"UTF-8"は「BOMを付けていないファイル」の方を指しています。こちらがデフォルトで、Sublimeでは"UTF-8 with BOM"を**わざわざ指定しなければ**BOMは付きません。
32
+
33
+
34
+
35
+ かたやterapadは"utf-8"がBOM付きの方で、"utf-8n"がBOMなしの方なんです。
36
+
37
+ だからPythonで(UTF-8を指定して)読みこむために、terapadで"utf-8n"を指定しないといけないわけです。
38
+
39
+ terapadが標準的な名前になっていないというだけの話なんです。
40
+
41
+
42
+
43
+ いまは、Sublimeで作成してPythonで読んでいるので、「BOMを気にしないといけない状況ではない」と判断しています。

1

追記

2018/06/05 15:36

投稿

quickquip
quickquip

スコア11038

test CHANGED
@@ -1,4 +1,4 @@
1
- utf-8nはつまりBOM(Byte Order Mark)なしのutf-8という意味であって、普通のエディタのutf-8のことです。
1
+ utf-8nはつまりBOM(Byte Order Mark)なしのutf-8という意味であって、普通のエディタの(そしてPythonの)utf-8のことです。
2
2
 
3
3
  意図的にBOM付きを指定しなければ普通は入りません。
4
4