teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

9

自己解決が進み問題点が絞られたため。

2020/11/06 20:45

投稿

hankechi78
hankechi78

スコア8

title CHANGED
@@ -1,1 +1,1 @@
1
- Java MalformedInputExceptionエラー,for文
1
+ Java MalformedInputExceptionエラー
body CHANGED
@@ -1,458 +1,34 @@
1
1
  ### 前提・実現したいこと
2
2
 
3
- ディレクトリ「path1」内の複数のファイル(dat形式)モデル(modele)として読み込み、このモデルに基づいて、「path2」で指定したファイルがど言語れているかを自動的判断させるプログラムを以下の通り設ています。
3
+ 一つのフォルダ内の複数のファイルを読み込み、絶対パスを取得したのですが、なぜ二つ目.DS_Storeが余に作成され困っています。どうすれば作成されないようにできるでしょうか?
4
4
 
5
- 最終的に、メイン関数で下記TextAnalyseクラスのidentifierLangue(modeles)メソッドを呼び出し、1行「このテキストの言語は(言語モデル名)である」と表示させたいと思っています。
6
- しかし、なぜか以下の通り表示されます。
7
-
8
- また、path2で読み込んでいるの分析用テキストがフランス語(fr)テキストなのにもかかわらず(分析用テキストの単語数は十分長いと思います・・・)、結果はオランダ語(nl)が結果として表示されているので、モデルごとの合計得点の比較(下記参照)もうまくいっていないように見受けられます。
9
-
10
5
  ### 発生している問題
11
6
 
12
7
  ```
13
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
8
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
14
- java.nio.charset.MalformedInputException: Input length = 1
9
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/.DS_Store
15
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
10
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/fr.dat
16
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
11
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/en.dat
17
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
12
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/it.dat
18
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
13
+ /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/de.dat
19
- このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
20
-
21
14
  ```
22
15
 
23
16
  ### 該当のソースコード
24
17
 
25
- Identifierクラス(メイン)
26
- ```
18
+ ```Java
27
- package langueIdentifier;
19
+ package test;
28
20
 
29
21
  import java.io.File;
30
- import java.util.ArrayList;
31
22
 
32
- public class Identifier {
23
+ public class Test3 {
33
24
 
34
25
  public static void main(String[] args) {
35
- File dir = new File("path1");
26
+ File dir = new File("/Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues");
36
27
  File files[] = dir.listFiles();
37
- ArrayList<Modele> modeles = new ArrayList<Modele>();
38
- //各言語ファイルの絶対パスを取得し、それを引数として各言語モデルにつきmodeleインスタンスを作成。identifierLangueメソッドを呼び出す前準備としてこれらのインスタンスを配列modelesに保存。
39
28
  for (int i=0 ; i < files.length; i++) {
40
-        String filePath = files[i].getAbsolutePath();
29
+ String fileName = files[i].getAbsolutePath();
41
- Modele modele = new Modele(filePath);
42
- modeles.add(modele);
43
- TextAnalyse t = new TextAnalyse("path2");
44
- t.identifierLangue(modeles);
45
- }
46
-
47
- }
48
- }
49
- ```
50
-
51
- TextAnalyseクラス
52
- ```
53
- package langueIdentifier;
54
-
55
- import java.nio.file.*;
56
- import java.text.BreakIterator;
57
- import java.nio.charset.Charset;
58
- import java.io.BufferedReader;
59
- import java.io.IOException;
60
- import java.util.ArrayList;
61
- import java.util.HashMap;
62
-
63
- public class TextAnalyse {
64
-
65
- private String textFile;
66
- private ArrayList<String> mots;
67
-
68
- public TextAnalyse(String file) {
69
- this.textFile = file;
70
- this.mots = new ArrayList<String>();
71
- lectureDossier();
72
- }
73
-
74
- public void lectureDossier() {
75
- //この部分は正常に作動。path2の分析対象のテキストを単語に分割。テキストの言語を特定する上で、分割した各単語が各言語モデルの辞書(modeleクラスの注意書参照)に含まれているかを調べる必要があるため。
76
- Path p = Paths.get(textFile);
77
- Charset charset = Charset.forName("UTF-8");
78
- try (BufferedReader reader = Files.newBufferedReader(p, charset)){
79
- String line = reader.readLine();
80
- BreakIterator wb = BreakIterator.getWordInstance();
81
- while (line != null) {
82
- wb.setText(line);
83
- int lastIndex = wb.first();
84
- while (BreakIterator.DONE != lastIndex) {
85
- int firstIndex = lastIndex;
86
- lastIndex = wb.next();
87
- if (lastIndex != wb.DONE && Character.isLetterOrDigit(line.charAt(firstIndex))) {
88
- String mot = line.substring(firstIndex, lastIndex).toLowerCase();
89
- mots.add(mot);
90
- }
91
- }
92
- line = reader.readLine();
93
- }
94
- } catch (IOException ioe) {
95
- System.out.println(ioe.toString());
30
+ System.out.println(fileName);
96
31
  }
97
- }
98
-
99
- public void identifierLangue(ArrayList<Modele> modeles) {
100
- //このメソッドで分析対象のテキストの言語を特定。分析対象のテキストに含まれている各単語がmodeleインスタンスの辞書に含まれていて、かつ点数の高い単語が多く含まれているほど、分析対象のテキストがそのmodeleの言語である可能性が高くなる。Scoreクラスのメソッドを用いて各モデルの点数を計算している。
101
-
102
- //各モデルの合計得点を最後に比べるためのマップを予め作成。
103
- HashMap<Modele, Double> scores = new HashMap<Modele, Double>();
104
- //最高得点を獲得したモデルを格納して最後に表示するための前準備。
105
- ArrayList<Modele> list = new ArrayList<Modele>();
106
- //各モデルの合計得点を計算。
107
- for (Modele modele: modeles) {
108
- HashMap<String, Double> d = modele.getDict();
109
- Score score = new Score(modele);
110
- for (String mot : mots) {
111
- if (d.containsKey(mot)) {
112
- score.addPoint(mot);
113
- }
114
- Double totalScore = score.getScore();
115
- scores.put(modele, totalScore);
116
- }
117
- //合計得点を比較。
118
- Object firstModele = scores.keySet().toArray()[0];
119
- Double scoreMax = scores.get(firstModele);
120
- for (int k = 1 ; k < scores.size(); k++) {
121
- Object modeleK = scores.keySet().toArray()[k];
122
- Double scoreK = scores.get(modeleK);
123
- if (scoreMax < scoreK) {
124
- scoreMax = scoreK;
125
- }
126
- }
127
- //最高得点を取ったモデルを特定し、分析対象のテキストがそのモデルの言語であることをユーザーに伝える。
128
- for (Modele key : scores.keySet()) {
129
- if(scores.get(key).equals(scoreMax)) {
130
- Modele keyCible = key;
131
- list.add(keyCible);
132
- }
133
- }
134
- }
135
- System.out.println("このテキストの言語は次のファイルの言語です : " + list.get(0).getFile());
136
-
137
- }
138
32
  }
139
-
140
- ```
141
-
142
- Modeleクラス
143
- ```
144
- package langueIdentifier;
145
-
146
- import java.nio.file.*;
147
- import java.nio.charset.Charset;
148
- import java.io.BufferedReader;
149
- import java.io.File;
150
- import java.io.IOException;
151
- import java.util.ArrayList;
152
- import java.util.HashMap;
153
-
154
- public class Modele {
155
-
156
- private String modeleFile;
157
- //modeleクラスのインスタンスは①単語と②その単語の重み(点数)をペアにした辞書を持つ(末尾の「補足情報」参照)。
158
- private HashMap<String, Double> dictionaire;
159
-
160
- public Modele(String file) {
161
- this.modeleFile = file;
162
- this.dictionaire = new HashMap<String, Double>();
163
- lectureModele();
164
- }
165
-
166
- public void lectureModele() {
167
- Path p = Paths.get(modeleFile);
168
- Charset charset = Charset.forName("UTF-8");
169
- try (BufferedReader reader = Files.newBufferedReader(p, charset)){
170
- String line = reader.readLine();
171
- while (line != null) {
172
- if (! line.startsWith("#")) {
173
- String[] lineSplit = line.split(" ");
174
- dictionaire.put(lineSplit[0], Double.parseDouble(lineSplit[1]));
175
- }
176
- line = reader.readLine();
177
- }
178
- } catch (IOException ioe) {
179
- System.out.println(ioe.toString());
180
- }
181
- }
182
-
183
- public String getFile() {
184
- return modeleFile;
185
- }
186
-
187
- public HashMap<String, Double> getDict() {
188
- return dictionaire;
189
-
190
- }
191
-
192
-
193
33
  }
194
-
195
- ```
34
+ ```
196
-
197
- Scoreクラス
198
- ```
199
- package langueIdentifier;
200
-
201
- import java.util.HashMap;
202
-
203
- public class Score {
204
-
205
- private Modele modele;
206
- HashMap<String, Double> points;
207
-
208
- public Score(Modele modele) {
209
- this.modele = modele;
210
- this.points = new HashMap<>();
211
- }
212
- public void addPoint(String mot){
213
- HashMap<String, Double> d = modele.getDict();
214
- if (d.containsKey(mot)) {
215
- points.put(mot, d.get(mot));
216
- }
217
- }
218
-
219
- public Double getScore() {
220
- Double sum = 0.0;
221
- for (Double d : points.values()) {
222
- sum += d;
223
- }
224
- return sum;
225
- }
226
- }
227
- ```
228
-
229
-
230
- ### 補足情報
231
-
232
- 分析対象のテキストの例(フランス語)
233
- Le climatosceptique de la Maison-Blanche a besoin de tenir certaines de ses promesses et asseoir ainsi un quinquennat déjà contesté dans l'ensemble du pays.
234
- Le chat paraissait malade.
235
- (抜粋)
236
-
237
- 言語モデルのファイル(英語 En)(抜粋)
238
- (#から開始するとteratail上で拡大されて表示されてしまうので、便宜的に””で括っています)
239
- "#Based on the PROJECT GUTENBERG EBOOK #7151 CLELIA (8clel10.txt)
240
- all 0.244
241
- fanno 0.013
242
- lanificio 0.016
243
- soccorso 0.011
244
- figli 0.026
245
- volle 0.016
246
- nuovi 0.025
247
- così 0.162
248
- monte 0.016
249
- benché 0.035"
250
-
251
-
252
- 言語モデルのファイル(仏語 Fr)
253
- "#Based on the PROJECT GUTENBERG EBOOK LE DOCTEUR OX #11589 (11589-8.txt)
254
- tm 0.076
255
- certain 0.017
256
- oncle 0.015
257
- nord 0.057
258
- aux 0.180
259
- te 0.013
260
- rouages 0.015
261
- vers 0.114
262
- instants 0.020
263
- scène 0.012
264
- rapidement 0.024
265
- besoin 0.013
266
- tua 0.012
267
- airs 0.016
268
- seulement 0.037
269
- moins 0.088
270
- énorme 0.011
271
- vieillard 0.056
272
- pu 0.036
273
- lorsque 0.025
274
- parler 0.016
275
- revint 0.017
276
- voici 0.029
277
- docteur 0.119
278
- tant 0.029
279
- ombre 0.012
280
- guide 0.024
281
- sombre 0.012
282
- ami 0.027
283
- file 0.012
284
- horloger 0.051
285
- horloges 0.025
286
- cents 0.036
287
- beaucoup 0.013
288
- is 0.044
289
- étaient 0.130
290
- it 0.020
291
- surface 0.013
292
- demi 0.027
293
- soit 0.019
294
- lendemain 0.023
295
- mots 0.023
296
- il 1.410
297
- raison 0.031
298
- soir 0.033
299
- goûter 0.013
300
- pauvre 0.019
301
- if 0.028
302
- lieues 0.019
303
- par 0.452
304
- pas 0.740
305
- quand 0.118
306
- puis 0.094
307
- impossible 0.013
308
- belle 0.028
309
- s 0.826
310
- édouard 0.011
311
- verne 0.019
312
- quant 0.019
313
- grand 0.074
314
- résister 0.011
315
- quiquendone 0.106
316
- pied 0.032
317
- heures 0.110
318
- cinq 0.064
319
- commune 0.016
320
- arriver 0.015
321
- vallée 0.012
322
- marches 0.013
323
- monter 0.017
324
- équipage 0.044
325
- dents 0.013
326
- elle 0.266
327
- cas 0.012
328
- moment 0.099
329
- commença 0.012
330
- vieux 0.037
331
- moyen 0.028
332
- pourquoi 0.037
333
- trouva 0.012
334
- premiers 0.020
335
- oeuvre 0.023
336
- travers 0.027
337
- in 0.086
338
- entre 0.079
339
- également 0.011
340
- dessous 0.033
341
- pittonaccio 0.019
342
- nacelle 0.032
343
- lequel 0.033
344
- without 0.011
345
- glacier 0.016
346
- bonne 0.016
347
- y 0.217
348
- demeurait 0.013
349
- the 0.261
350
- voulez 0.017
351
- demanda 0.052
352
- lest 0.012
353
- coup 0.037
354
- violence 0.013
355
- devint 0.012
356
- ci 0.037
357
- semblaient 0.013
358
- arrêter 0.013
359
- va 0.024
360
- conseiller 0.110
361
- colère 0.012
362
- part 0.015
363
- vivement 0.012
364
- souper 0.011
365
- guides 0.052
366
- vérité 0.013
367
- quelle 0.020
368
- vie 0.065
369
- jules 0.012
370
- retrouver 0.017
371
- difficile 0.016
372
- bloc 0.016
373
- plateau 0.019
374
- enfin 0.084
375
- événement 0.011
376
- brevent 0.012
377
- vain 0.013
378
- départ 0.031
379
- combien 0.012
380
- matelots 0.035
381
- forces 0.013
382
- provisions 0.027
383
- certaine 0.017
384
- vaste 0.011
385
- haut 0.040
386
- succès 0.013
387
- possible 0.027
388
- mot 0.021
389
- demande 0.012
390
- moi 0.122
391
- mon 0.188
392
- ayant 0.019
393
- compte 0.021
394
- usine 0.011
395
- mis 0.027
396
- santé 0.019
397
- naufragés 0.015
398
- perdus 0.019
399
- d 1.052
400
- bruit 0.055
401
- tomber 0.013
402
- mesure 0.020
403
- firent 0.012
404
- ordinaire 0.013
405
- parfois 0.013
406
- donations 0.020
407
- t 0.088
408
- où 0.190
409
- works 0.043
410
- dernier 0.024
411
- doit 0.015
412
- ballon 0.075
413
- ennemis 0.012
414
- autres 0.061
415
- vais 0.011
416
- pierre 0.055
417
- époque 0.024
418
- ah 0.039
419
- orgueil 0.019
420
- ça 0.012
421
- sommes 0.035
422
- bord 0.037
423
- sommet 0.040
424
- quoique 0.011
425
- fou 0.015
426
- rien 0.092
427
- est 0.540
428
- for 0.037
429
- livres 0.013
430
- peu 0.140
431
- depuis 0.087
432
- située 0.011
433
- disait 0.027
434
- vivres 0.012
435
- quinze 0.017
436
- voilà 0.028
437
- mont 0.061
438
- dernière 0.012
439
- avoir 0.084
440
- foi 0.013
441
- autrefois 0.017
442
- descendre 0.025
443
- be 0.028
444
- expérience 0.019
445
- peau 0.016
446
- soigneusement 0.011
447
- agreement 0.024
448
- préparatifs 0.019
449
- fois 0.076
450
- pouvaient 0.027
451
- exemple 0.017
452
- by 0.032
453
- zéro 0.020
454
- on 0.492
455
- une 0.940
456
- soudain 0.016
457
-
458
- "

8

問題点につき追記

2020/11/06 20:45

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -5,6 +5,8 @@
5
5
  最終的に、メイン関数で下記TextAnalyseクラスのidentifierLangue(modeles)メソッドを呼び出し、1行「このテキストの言語は(言語モデル名)である」と表示させたいと思っています。
6
6
  しかし、なぜか以下の通り表示されます。
7
7
 
8
+ また、path2で読み込んでいるの分析用テキストがフランス語(fr)テキストなのにもかかわらず(分析用テキストの単語数は十分長いと思います・・・)、結果はオランダ語(nl)が結果として表示されているので、モデルごとの合計得点の比較(下記参照)もうまくいっていないように見受けられます。
9
+
8
10
  ### 発生している問題
9
11
 
10
12
  ```
@@ -230,8 +232,8 @@
230
232
  分析対象のテキストの例(フランス語)
231
233
  Le climatosceptique de la Maison-Blanche a besoin de tenir certaines de ses promesses et asseoir ainsi un quinquennat déjà contesté dans l'ensemble du pays.
232
234
  Le chat paraissait malade.
235
+ (抜粋)
233
236
 
234
-
235
237
  言語モデルのファイル(英語 En)(抜粋)
236
238
  (#から開始するとteratail上で拡大されて表示されてしまうので、便宜的に””で括っています)
237
239
  "#Based on the PROJECT GUTENBERG EBOOK #7151 CLELIA (8clel10.txt)
@@ -452,20 +454,5 @@
452
454
  on 0.492
453
455
  une 0.940
454
456
  soudain 0.016
455
- être 0.138
457
+
456
- tricasse 0.132
457
- oh 0.011
458
- of 0.170
459
- cornbutte 0.270
460
- douze 0.012
461
- aperçut 0.013
462
- plus 0.605
463
- horizon 0.024
464
- ox 0.087
465
- ou 0.118
466
- sept 0.020
467
- or 0.135
468
- silence 0.024
469
- plan 0.011
470
- escalier 0.015
471
458
  "

7

一部自己解決のため質問の修正

2020/11/06 15:49

投稿

hankechi78
hankechi78

スコア8

title CHANGED
@@ -1,1 +1,1 @@
1
- Java nio.file.NoSuchFileExceptionエラー,for文
1
+ Java MalformedInputExceptionエラー,for文
body CHANGED
@@ -8,16 +8,14 @@
8
8
  ### 発生している問題
9
9
 
10
10
  ```
11
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
11
- java.nio.file.NoSuchFileException: nl.dat
12
+ java.nio.charset.MalformedInputException: Input length = 1
12
- このテキストの言語は : nl.dat
13
- java.nio.file.NoSuchFileException: fr.dat
14
- このテキストの言語は : nl.dat
15
- java.nio.file.NoSuchFileException: en.dat
13
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
16
- このテキストの言語は : nl.dat
17
- java.nio.file.NoSuchFileException: it.dat
14
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
18
- このテキストの言語は : nl.dat
19
- java.nio.file.NoSuchFileException: de.dat
15
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
20
- このテキストの言語は : nl.dat
16
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
17
+ このテキストの言語は次のファイルの言語です : /Users/hankechi78/Desktop/Algorithmique et programmation/java/Exercice_note2/modeles_langues/nl.dat
18
+
21
19
  ```
22
20
 
23
21
  ### 該当のソースコード
@@ -37,8 +35,8 @@
37
35
  ArrayList<Modele> modeles = new ArrayList<Modele>();
38
36
  //各言語ファイルの絶対パスを取得し、それを引数として各言語モデルにつきmodeleインスタンスを作成。identifierLangueメソッドを呼び出す前準備としてこれらのインスタンスを配列modelesに保存。
39
37
  for (int i=0 ; i < files.length; i++) {
40
- String fileName = files[i].getName();
38
+        String filePath = files[i].getAbsolutePath();
41
- Modele modele = new Modele(fileName);
39
+ Modele modele = new Modele(filePath);
42
40
  modeles.add(modele);
43
41
  TextAnalyse t = new TextAnalyse("path2");
44
42
  t.identifierLangue(modeles);
@@ -132,7 +130,7 @@
132
130
  }
133
131
  }
134
132
  }
135
- System.out.println("このテキストの言語は : " + list.get(0).getFile());
133
+ System.out.println("このテキストの言語は次のファイルの言語です : " + list.get(0).getFile());
136
134
 
137
135
  }
138
136
  }
@@ -226,12 +224,7 @@
226
224
  }
227
225
  ```
228
226
 
229
- ### 試したこと
230
227
 
231
- TextAnalyseクラスのlectureDossier() メソッドとModeleクラスをそれぞれ切り出し、独立のmain関数として動きを調べたところ、うまく作動しました。
232
- また、langueIdentifierクラスも、テストしたところpath1内の各言語モデルファイルの絶対パスをそれぞれ取得し、各言語につきmodeleインスタンスを作成するところまでは問題なくできているようです。
233
- どこが問題なのかがわかりません。
234
-
235
228
  ### 補足情報
236
229
 
237
230
  分析対象のテキストの例(フランス語)

6

補足

2020/11/06 15:44

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -230,9 +230,8 @@
230
230
 
231
231
  TextAnalyseクラスのlectureDossier() メソッドとModeleクラスをそれぞれ切り出し、独立のmain関数として動きを調べたところ、うまく作動しました。
232
232
  また、langueIdentifierクラスも、テストしたところpath1内の各言語モデルファイルの絶対パスをそれぞれ取得し、各言語につきmodeleインスタンスを作成するところまでは問題なくできているようです。
233
+ どこが問題なのかがわかりません。
233
234
 
234
- 問題はTextAnalyseクラスのidentifierLangue(ArrayList<Modele> modeles)メソッドにあるように思われますが、エラーメッセージが表示されるわけでもなく、どこが問題なのかがわかりません。
235
-
236
235
  ### 補足情報
237
236
 
238
237
  分析対象のテキストの例(フランス語)

5

一部解決したため修正

2020/11/06 15:30

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -3,7 +3,7 @@
3
3
  ディレクトリ「path1」内の複数のファイル(dat形式)をモデル(modele)として読み込み、このモデルに基づいて、「path2」で指定したファイルがどの言語で書かれているかを自動的に判断させるプログラムを以下の通り設計しています。
4
4
 
5
5
  最終的に、メイン関数で下記TextAnalyseクラスのidentifierLangue(modeles)メソッドを呼び出し、1行「このテキストの言語は(言語モデル名)である」と表示させたいと思っています。
6
- しかし、なぜか以下の通り全ての言語を認識してしまいます。また、java.nio.file.NoSuchFileExceptionも表示されます。
6
+ しかし、なぜか以下の通り表示されます。
7
7
 
8
8
  ### 発生している問題
9
9
 
@@ -12,24 +12,12 @@
12
12
  このテキストの言語は : nl.dat
13
13
  java.nio.file.NoSuchFileException: fr.dat
14
14
  このテキストの言語は : nl.dat
15
- このテキストの言語は : fr.dat
16
- このテキストの言語は : nl.dat
17
15
  java.nio.file.NoSuchFileException: en.dat
18
16
  このテキストの言語は : nl.dat
19
- (中略)
20
17
  java.nio.file.NoSuchFileException: it.dat
21
- (中略)
22
- このテキストの言語は : en.dat
18
+ このテキストの言語は : nl.dat
23
- このテキストの言語は : fr.dat
24
- (中略)
25
- このテキストの言語は : it.dat
26
19
  java.nio.file.NoSuchFileException: de.dat
27
- (中略)
28
- このテキストの言語は : en.dat
29
- このテキストの言語は : fr.dat
30
20
  このテキストの言語は : nl.dat
31
- このテキストの言語は : it.dat
32
- このテキストの言語は : de.dat
33
21
  ```
34
22
 
35
23
  ### 該当のソースコード
@@ -113,6 +101,8 @@
113
101
 
114
102
  //各モデルの合計得点を最後に比べるためのマップを予め作成。
115
103
  HashMap<Modele, Double> scores = new HashMap<Modele, Double>();
104
+ //最高得点を獲得したモデルを格納して最後に表示するための前準備。
105
+ ArrayList<Modele> list = new ArrayList<Modele>();
116
106
  //各モデルの合計得点を計算。
117
107
  for (Modele modele: modeles) {
118
108
  HashMap<String, Double> d = modele.getDict();
@@ -138,12 +128,15 @@
138
128
  for (Modele key : scores.keySet()) {
139
129
  if(scores.get(key).equals(scoreMax)) {
140
130
  Modele keyCible = key;
141
- System.out.println("このテキストの言語は : " + keyCible.getFile());
131
+ list.add(keyCible);
142
132
  }
143
133
  }
144
134
  }
135
+ System.out.println("このテキストの言語は : " + list.get(0).getFile());
136
+
145
137
  }
146
138
  }
139
+
147
140
  ```
148
141
 
149
142
  Modeleクラス

4

補足

2020/11/06 15:27

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -236,7 +236,7 @@
236
236
  ### 試したこと
237
237
 
238
238
  TextAnalyseクラスのlectureDossier() メソッドとModeleクラスをそれぞれ切り出し、独立のmain関数として動きを調べたところ、うまく作動しました。
239
- また、langueIdentifierクラスも、テストしたところpath1内の各言語モデルファイルの絶対パスをそれぞれ取得するところまでは問題なくできているようです。
239
+ また、langueIdentifierクラスも、テストしたところpath1内の各言語モデルファイルの絶対パスをそれぞれ取得し、各言語につきmodeleインスタンスを作成するところまでは問題なくできているようです。
240
240
 
241
241
  問題はTextAnalyseクラスのidentifierLangue(ArrayList<Modele> modeles)メソッドにあるように思われますが、エラーメッセージが表示されるわけでもなく、どこが問題なのかがわかりません。
242
242
 

3

TextAnalyseクラスの補足

2020/11/06 14:48

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -84,7 +84,7 @@
84
84
  }
85
85
 
86
86
  public void lectureDossier() {
87
- //この部分は正常に作動。path2の分析対象のテキストを単語に分割。
87
+ //この部分は正常に作動。path2の分析対象のテキストを単語に分割。テキストの言語を特定する上で、分割した各単語が各言語モデルの辞書(modeleクラスの注意書参照)に含まれているかを調べる必要があるため。
88
88
  Path p = Paths.get(textFile);
89
89
  Charset charset = Charset.forName("UTF-8");
90
90
  try (BufferedReader reader = Files.newBufferedReader(p, charset)){
@@ -483,21 +483,4 @@
483
483
  silence 0.024
484
484
  plan 0.011
485
485
  escalier 0.015
486
- tel 0.015
487
- agissait 0.012
488
- pourtant 0.013
489
- troisième 0.012
490
- pays 0.016
491
- mers 0.015
492
- sol 0.017
493
- son 0.488
494
- bientôt 0.080
495
- loin 0.031
496
- rues 0.027
497
- parlait 0.012
498
- maître 0.190
499
- lune 0.012
500
- lieu 0.037
501
- plaisir 0.019
502
- jeunes 0.013
503
486
  "

2

Modeleインスタンスの説明を補足

2020/11/06 14:45

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -161,6 +161,7 @@
161
161
  public class Modele {
162
162
 
163
163
  private String modeleFile;
164
+ //modeleクラスのインスタンスは①単語と②その単語の重み(点数)をペアにした辞書を持つ(末尾の「補足情報」参照)。
164
165
  private HashMap<String, Double> dictionaire;
165
166
 
166
167
  public Modele(String file) {
@@ -258,7 +259,7 @@
258
259
  nuovi 0.025
259
260
  così 0.162
260
261
  monte 0.016
261
- benché 0.035
262
+ benché 0.035"
262
263
 
263
264
 
264
265
  言語モデルのファイル(仏語 Fr)

1

プログラムの設計につき補足。

2020/11/06 14:41

投稿

hankechi78
hankechi78

スコア8

title CHANGED
File without changes
body CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ディレクトリ「path1」内の複数のファイル(dat形式)をモデル(modele)として読み込み、このモデルに基づいて、「path2」で指定したファイルがどの言語で書かれているかを自動的に判断させるプログラムを以下の通り設計しています。
4
4
 
5
- 最終的に、下記TextAnalyseクラスのidentifierLangue(modeles)メソッドを呼び出し、1行「このテキストの言語は(言語モデル名)である」と表示させたいと思っています。
5
+ 最終的に、メイン関数で下記TextAnalyseクラスのidentifierLangue(modeles)メソッドを呼び出し、1行「このテキストの言語は(言語モデル名)である」と表示させたいと思っています。
6
6
  しかし、なぜか以下の通り全ての言語を認識してしまいます。また、java.nio.file.NoSuchFileExceptionも表示されます。
7
7
 
8
8
  ### 発生している問題
@@ -34,7 +34,7 @@
34
34
 
35
35
  ### 該当のソースコード
36
36
 
37
- Identifierクラス
37
+ Identifierクラス(メイン)
38
38
  ```
39
39
  package langueIdentifier;
40
40
 
@@ -47,6 +47,7 @@
47
47
  File dir = new File("path1");
48
48
  File files[] = dir.listFiles();
49
49
  ArrayList<Modele> modeles = new ArrayList<Modele>();
50
+ //各言語ファイルの絶対パスを取得し、それを引数として各言語モデルにつきmodeleインスタンスを作成。identifierLangueメソッドを呼び出す前準備としてこれらのインスタンスを配列modelesに保存。
50
51
  for (int i=0 ; i < files.length; i++) {
51
52
  String fileName = files[i].getName();
52
53
  Modele modele = new Modele(fileName);
@@ -83,6 +84,7 @@
83
84
  }
84
85
 
85
86
  public void lectureDossier() {
87
+ //この部分は正常に作動。path2の分析対象のテキストを単語に分割。
86
88
  Path p = Paths.get(textFile);
87
89
  Charset charset = Charset.forName("UTF-8");
88
90
  try (BufferedReader reader = Files.newBufferedReader(p, charset)){
@@ -107,7 +109,11 @@
107
109
  }
108
110
 
109
111
  public void identifierLangue(ArrayList<Modele> modeles) {
112
+ //このメソッドで分析対象のテキストの言語を特定。分析対象のテキストに含まれている各単語がmodeleインスタンスの辞書に含まれていて、かつ点数の高い単語が多く含まれているほど、分析対象のテキストがそのmodeleの言語である可能性が高くなる。Scoreクラスのメソッドを用いて各モデルの点数を計算している。
113
+
114
+ //各モデルの合計得点を最後に比べるためのマップを予め作成。
110
115
  HashMap<Modele, Double> scores = new HashMap<Modele, Double>();
116
+ //各モデルの合計得点を計算。
111
117
  for (Modele modele: modeles) {
112
118
  HashMap<String, Double> d = modele.getDict();
113
119
  Score score = new Score(modele);
@@ -118,6 +124,7 @@
118
124
  Double totalScore = score.getScore();
119
125
  scores.put(modele, totalScore);
120
126
  }
127
+ //合計得点を比較。
121
128
  Object firstModele = scores.keySet().toArray()[0];
122
129
  Double scoreMax = scores.get(firstModele);
123
130
  for (int k = 1 ; k < scores.size(); k++) {
@@ -127,6 +134,7 @@
127
134
  scoreMax = scoreK;
128
135
  }
129
136
  }
137
+ //最高得点を取ったモデルを特定し、分析対象のテキストがそのモデルの言語であることをユーザーに伝える。
130
138
  for (Modele key : scores.keySet()) {
131
139
  if(scores.get(key).equals(scoreMax)) {
132
140
  Modele keyCible = key;
@@ -276,39 +284,6 @@
276
284
  pu 0.036
277
285
  lorsque 0.025
278
286
  parler 0.016
279
- après 0.146
280
- cent 0.029
281
- milieu 0.049
282
- immense 0.023
283
- précautions 0.012
284
- glace 0.087
285
- fidèle 0.017
286
- zacharius 0.151
287
- brick 0.084
288
- chamonix 0.021
289
- dut 0.013
290
- choses 0.020
291
- suivre 0.015
292
- direction 0.013
293
- telle 0.017
294
- gaz 0.049
295
- monsieur 0.083
296
- lumière 0.013
297
- subitement 0.011
298
- ceux 0.021
299
- uns 0.016
300
- eut 0.051
301
- notables 0.031
302
- quatre 0.059
303
- argent 0.012
304
- marche 0.040
305
- soixante 0.019
306
- fut 0.235
307
- tête 0.072
308
- avions 0.016
309
- ait 0.012
310
- élevé 0.013
311
- n 0.531
312
287
  revint 0.017
313
288
  voici 0.029
314
289
  docteur 0.119