質問編集履歴

8

削除された内容の復元を行いました

2020/07/27 23:32

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,207 @@
1
- 解決しました
1
+ 全くの初心者です
2
+
2
-
3
+ 大学の課題ですごく難しい問題が出されました。
4
+
5
+ まだ今年始めたばかりなので出来ればソースを見ながら理解したいです。
6
+
7
+ 先生にも質問しましたがまだ返信が来ず提出期限も迫っているため質問させて頂きました。
8
+
9
+ 問題
10
+
11
+ Example2.txtは英語の文章が入っていました。
12
+
13
+ 下記のexample2.txtのユニグラム・バイグラム・トライグラム値を、それぞれアルファベット順に出力したファイルを提出しなさい。また、その際に作成したプログラムも提出しなさい。
14
+
15
+ ユニグラムの例は以下のとおりである。(1単語目はアルファベット順になる)
16
+
17
+ (前略)
18
+
19
+ a 2.021773e-02
20
+
21
+ above 5.184033e-04
22
+
23
+ absolute 1.036807e-03
24
+
25
+ (後略)
26
+
27
+ バイグラムの例は以下のとおりである。(1単語目も2単語目もアルファベット順になる)
28
+
29
+ (前略)
30
+
31
+ a boat 2.021773e-02
32
+
33
+ a cup 5.184033e-04
34
+
35
+ boat is 1.036807e-03
36
+
37
+ (後略)
38
+
39
+ トライグラムの例は以下のとおりである。(1単語目も2単語目も3単語目もアルファベット順になる)
40
+
41
+ (前略)
42
+
43
+ a boat is 2.021773e-02
44
+
45
+ a boat was 5.184033e-04
46
+
47
+ a cup is 1.036807e-03
48
+
49
+ (後略)
50
+
51
+ なお以下の点について注意すること。
52
+
53
+ 1)文頭記号を<s>、文末記号を</s>とする。
54
+
55
+ 2)バックオフについては考慮しなくてよい。
56
+
57
+ 3)example2.txtの単語の定義は、空白で挟まれた数字・文字列とする。
58
+
59
+ 4)単語内のアルファベットは、すべて小文字に表記変換すること
60
+
61
+ 5)ピリオドとカンマは削除すること。
62
+
3
- ばいグラムトライグラムの計算方法ですがライブラリ関数は使わず自分で計算式を立てて作成てみます。
63
+ 6)トライグラムの計算は難しい、ユニグムの計算は易いので、できたところで提出ること但し、未完成のものの提出は不要。
64
+
4
-
65
+ 7)配列で大きなメモリをとるためには、スタックサイズをunlimitedにしないと、segmentation faultで落ちる。動的にとれる人は動的にとるかvectorを使用したほうがよい。スタックで行う場合にメモリを拡張する方法は、各自のプログラミング環境により異なるので、自分でインターネットで調査すること。
66
+
67
+ 8)出力ファイルの単語と確率値の間はタブとする。
68
+
69
+ 9)確率値は、指数表示・小数点以下6桁で表すものとする。上記の例を参照。
70
+
71
+ 10)単数と複数は別の単語として扱うものとする。
72
+
73
+ 11)ユニグラム値はunigram.txt、バイグラム値はbigram.txt、トライグラム値はtrigram.txtに保存すること。
74
+
75
+ 以下ユニグラムのコードです
76
+
77
+ あってますでしょうか
78
+
79
+ #include<iostream>
80
+
81
+ #include<fstream>
82
+
83
+ #include<string>
84
+
85
+ #include<iomanip>
86
+
87
+ using namespace std;
88
+
89
+ int mkdict(string dict[],int num[]){
90
+
91
+ int count=0;
92
+
93
+ string x;
94
+
95
+ ifstream fin("example2.txt");
96
+
97
+ if(!fin){
98
+
99
+ cerr<<"error"<<endl;
100
+
101
+ return 1;
102
+
103
+ }
104
+
105
+ while(fin>>x){
106
+
107
+ int i;
108
+
109
+ for(int s=0;s<x.size();s++){
110
+
111
+ if(x[s]==','||x[s]=='.')
112
+
113
+ x[s]=' ';
114
+
115
+ if(x[s]>='A'&&x[s]<'Z')
116
+
117
+ x[s]=x[s]-'A'+'a';
118
+
119
+ }
120
+
121
+ for( i=0;i<count;i++){
122
+
123
+ if(x==dict[i]){
124
+
125
+ num[i]++;
126
+
127
+ break;
128
+
129
+ }
130
+
131
+ }
132
+
133
+ if(i==count){
134
+
135
+ dict[count]=x;
136
+
137
+ count++;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ return count;
144
+
145
+ }
146
+
147
+ int main(){
148
+
149
+ const int DICSZ=100000;
150
+
151
+ string dict[DICSZ];
152
+
153
+ int num[DICSZ];
154
+
155
+ for(int i=0;i<DICSZ;i++)
156
+
157
+ num[i]=1;
158
+
159
+ int nwords=mkdict(dict,num);
160
+
161
+ int nnum=0;
162
+
163
+ for(int i=0;i<nwords;i++){
164
+
165
+ for(int j=0;j<nwords;j++){
166
+
167
+ if(dict[i]<dict[j]){
168
+
169
+ string keep=dict[i];
170
+
171
+ dict[i]=dict[j];
172
+
173
+ dict[j]=keep;
174
+
175
+ int keep1=num[i];
176
+
177
+ num[i]=num[j];
178
+
179
+ num[j]=keep1;
180
+
181
+ }
182
+
183
+ }
184
+
185
+ }
186
+
187
+ for(int i=0;i<nwords;i++)
188
+
189
+ nnum+=num[i];
190
+
191
+ for(int i=0;i<nwords;i++){
192
+
193
+ cout<<dict[i]<<" "<<scientific<<setprecision(6)<<((double)(num[i])/nnum)<<endl;;
194
+
195
+ }
196
+
197
+ cout<<endl;
198
+
199
+ cout<<nnum;
200
+
201
+ return 0;
202
+
203
+ 以上です、
204
+
205
+ 簡単なことでも全部でもヒントでも構いません。
206
+
5
- ありがとうございます。
207
+ よろしくお願ます。

7

2020/07/27 23:32

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
File without changes

6

2020/07/26 04:09

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,433 +1,5 @@
1
- 全くの初心者です
1
+ 解決しました
2
2
 
3
- 大学課題ですごく難い問題が出されした
3
+ ばいグラムトライグラム計算方法ですがライブラリ関数は使わず自分で計算式を立てて作成てみ
4
4
 
5
- まだ今年始めたばかりなので出来ればソースを見ながら理解したいです。
6
-
7
- 先生にも質問しましたがまだ返信が来ず提出期限も迫っているため質問させて頂きました。
8
-
9
- 問題
10
-
11
- Example2.txtは英語の文章が入っていました。
12
-
13
-
14
-
15
- 下記のexample2.txtのユニグラム・バイグラム・トライグラム値を、それぞれアルファベット順に出力したファイルを提出しなさい。また、その際に作成したプログラムも提出しなさい。
16
-
17
-
18
-
19
- ユニグラムの例は以下のとおりである。(1単語目はアルファベット順になる)
20
-
21
-
22
-
23
- (前略)
24
-
25
-
26
-
27
- a 2.021773e-02
28
-
29
-
30
-
31
- above 5.184033e-04
32
-
33
-
34
-
35
- absolute 1.036807e-03
36
-
37
-
38
-
39
- (後略)
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
- バイグラムの例は以下のとおりである。(1単語目も2単語目もアルファベット順になる)
48
-
49
-
50
-
51
- (前略)
52
-
53
-
54
-
55
- a boat 2.021773e-02
56
-
57
-
58
-
59
- a cup 5.184033e-04
60
-
61
-
62
-
63
- boat is 1.036807e-03
64
-
65
-
66
-
67
- (後略)
68
-
69
-
70
-
71
-
72
-
73
-
74
-
75
- トライグラムの例は以下のとおりである。(1単語目も2単語目も3単語目もアルファベット順になる)
76
-
77
-
78
-
79
- (前略)
80
-
81
-
82
-
83
- a boat is 2.021773e-02
84
-
85
-
86
-
87
- a boat was 5.184033e-04
88
-
89
-
90
-
91
- a cup is 1.036807e-03
92
-
93
-
94
-
95
- (後略)
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
- なお以下の点について注意すること。
104
-
105
-
106
-
107
- 1)文頭記号を<s>、文末記号を</s>とする。
108
-
109
-
110
-
111
- 2)バックオフについては考慮しなくてよい。
112
-
113
-
114
-
115
- 3)example2.txtの単語の定義は、空白で挟まれた数字・文字列とする。
116
-
117
-
118
-
119
- 4)単語内のアルファベットは、すべて小文字に表記変換すること
120
-
121
-
122
-
123
- 5)ピリオドとカンマは削除すること。
124
-
125
-
126
-
127
- 6)トライグラムの計算は難しいが、ユニグラムの計算は易しいので、できたところまで提出すること。但し、未完成のものの提出は不要。
128
-
129
-
130
-
131
- 7)配列で大きなメモリをとるためには、スタックサイズをunlimitedにしないと、segmentation faultで落ちる。動的にとれる人は動的にとるかvectorを使用したほうがよい。スタックで行う場合にメモリを拡張する方法は、各自のプログラミング環境により異なるので、自分でインターネットで調査すること。
132
-
133
-
134
-
135
- 8)出力ファイルの単語と確率値の間はタブとする。
136
-
137
-
138
-
139
- 9)確率値は、指数表示・小数点以下6桁で表すものとする。上記の例を参照。
140
-
141
-
142
-
143
- 10)単数と複数は別の単語として扱うものとする。
144
-
145
-
146
-
147
- 11)ユニグラム値はunigram.txt、バイグラム値はbigram.txt、トライグラム値はtrigram.txtに保存すること。
148
-
149
-
150
-
151
-
152
-
153
-
154
-
155
- 以下ユニグラムのコードです
156
-
157
- あってますでしょうか
158
-
159
-
160
-
161
- #include<iostream>
162
-
163
-
164
-
165
- #include<fstream>
166
-
167
-
168
-
169
- #include<string>
170
-
171
-
172
-
173
- #include<iomanip>
174
-
175
-
176
-
177
- using namespace std;
178
-
179
-
180
-
181
-
182
-
183
-
184
-
185
- int mkdict(string dict[],int num[]){
186
-
187
-
188
-
189
- int count=0;
190
-
191
-
192
-
193
-
194
-
195
-
196
-
197
- string x;
198
-
199
-
200
-
201
- ifstream fin("example2.txt");
202
-
203
-
204
-
205
- if(!fin){
206
-
207
-
208
-
209
- cerr<<"error"<<endl;
210
-
211
-
212
-
213
- return 1;
214
-
215
-
216
-
217
- }
218
-
219
-
220
-
221
- while(fin>>x){
222
-
223
-
224
-
225
- int i;
226
-
227
-
228
-
229
- for(int s=0;s<x.size();s++){
230
-
231
-
232
-
233
- if(x[s]==','||x[s]=='.')
234
-
235
-
236
-
237
- x[s]=' ';
238
-
239
-
240
-
241
- if(x[s]>='A'&&x[s]<'Z')
242
-
243
-
244
-
245
- x[s]=x[s]-'A'+'a';
246
-
247
-
248
-
249
- }
250
-
251
-
252
-
253
- for( i=0;i<count;i++){
254
-
255
-
256
-
257
- if(x==dict[i]){
258
-
259
-
260
-
261
- num[i]++;
262
-
263
-
264
-
265
- break;
266
-
267
-
268
-
269
- }
270
-
271
-
272
-
273
- }
274
-
275
-
276
-
277
- if(i==count){
278
-
279
-
280
-
281
- dict[count]=x;
282
-
283
-
284
-
285
- count++;
286
-
287
-
288
-
289
- }
290
-
291
-
292
-
293
- }
294
-
295
-
296
-
297
- return count;
298
-
299
-
300
-
301
-
302
-
303
-
304
-
305
- }
306
-
307
-
308
-
309
- int main(){
310
-
311
-
312
-
313
- const int DICSZ=100000;
314
-
315
-
316
-
317
- string dict[DICSZ];
318
-
319
-
320
-
321
- int num[DICSZ];
322
-
323
-
324
-
325
- for(int i=0;i<DICSZ;i++)
326
-
327
-
328
-
329
- num[i]=1;
330
-
331
-
332
-
333
- int nwords=mkdict(dict,num);
334
-
335
-
336
-
337
- int nnum=0;
338
-
339
-
340
-
341
- for(int i=0;i<nwords;i++){
342
-
343
-
344
-
345
- for(int j=0;j<nwords;j++){
346
-
347
-
348
-
349
- if(dict[i]<dict[j]){
350
-
351
-
352
-
353
- string keep=dict[i];
354
-
355
-
356
-
357
- dict[i]=dict[j];
358
-
359
-
360
-
361
- dict[j]=keep;
362
-
363
-
364
-
365
- int keep1=num[i];
366
-
367
-
368
-
369
- num[i]=num[j];
370
-
371
-
372
-
373
- num[j]=keep1;
374
-
375
-
376
-
377
- }
378
-
379
-
380
-
381
- }
382
-
383
-
384
-
385
- }
386
-
387
-
388
-
389
- for(int i=0;i<nwords;i++)
390
-
391
-
392
-
393
- nnum+=num[i];
394
-
395
-
396
-
397
-
398
-
399
-
400
-
401
- for(int i=0;i<nwords;i++){
402
-
403
-
404
-
405
- cout<<dict[i]<<" "<<scientific<<setprecision(6)<<((double)(num[i])/nnum)<<endl;;
406
-
407
-
408
-
409
- }
410
-
411
-
412
-
413
- cout<<endl;
414
-
415
-
416
-
417
- cout<<nnum;
418
-
419
-
420
-
421
- return 0;
422
-
423
-
424
-
425
-
426
-
427
-
428
-
429
- 以上です、
430
-
431
- 簡単なことでも全部でもヒントでも構いません。
432
-
433
- よろしくお願ます。
5
+ ありがとうございます。

5

2020/07/26 04:09

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
File without changes

4

2020/07/25 16:31

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
File without changes

3

2020/07/25 16:31

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
File without changes

2

2020/07/25 16:31

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
@@ -150,6 +150,282 @@
150
150
 
151
151
 
152
152
 
153
+
154
+
155
+ 以下ユニグラムのコードです
156
+
157
+ あってますでしょうか
158
+
159
+
160
+
161
+ #include<iostream>
162
+
163
+
164
+
165
+ #include<fstream>
166
+
167
+
168
+
169
+ #include<string>
170
+
171
+
172
+
173
+ #include<iomanip>
174
+
175
+
176
+
177
+ using namespace std;
178
+
179
+
180
+
181
+
182
+
183
+
184
+
185
+ int mkdict(string dict[],int num[]){
186
+
187
+
188
+
189
+ int count=0;
190
+
191
+
192
+
193
+
194
+
195
+
196
+
197
+ string x;
198
+
199
+
200
+
201
+ ifstream fin("example2.txt");
202
+
203
+
204
+
205
+ if(!fin){
206
+
207
+
208
+
209
+ cerr<<"error"<<endl;
210
+
211
+
212
+
213
+ return 1;
214
+
215
+
216
+
217
+ }
218
+
219
+
220
+
221
+ while(fin>>x){
222
+
223
+
224
+
225
+ int i;
226
+
227
+
228
+
229
+ for(int s=0;s<x.size();s++){
230
+
231
+
232
+
233
+ if(x[s]==','||x[s]=='.')
234
+
235
+
236
+
237
+ x[s]=' ';
238
+
239
+
240
+
241
+ if(x[s]>='A'&&x[s]<'Z')
242
+
243
+
244
+
245
+ x[s]=x[s]-'A'+'a';
246
+
247
+
248
+
249
+ }
250
+
251
+
252
+
253
+ for( i=0;i<count;i++){
254
+
255
+
256
+
257
+ if(x==dict[i]){
258
+
259
+
260
+
261
+ num[i]++;
262
+
263
+
264
+
265
+ break;
266
+
267
+
268
+
269
+ }
270
+
271
+
272
+
273
+ }
274
+
275
+
276
+
277
+ if(i==count){
278
+
279
+
280
+
281
+ dict[count]=x;
282
+
283
+
284
+
285
+ count++;
286
+
287
+
288
+
289
+ }
290
+
291
+
292
+
293
+ }
294
+
295
+
296
+
297
+ return count;
298
+
299
+
300
+
301
+
302
+
303
+
304
+
305
+ }
306
+
307
+
308
+
309
+ int main(){
310
+
311
+
312
+
313
+ const int DICSZ=100000;
314
+
315
+
316
+
317
+ string dict[DICSZ];
318
+
319
+
320
+
321
+ int num[DICSZ];
322
+
323
+
324
+
325
+ for(int i=0;i<DICSZ;i++)
326
+
327
+
328
+
329
+ num[i]=1;
330
+
331
+
332
+
333
+ int nwords=mkdict(dict,num);
334
+
335
+
336
+
337
+ int nnum=0;
338
+
339
+
340
+
341
+ for(int i=0;i<nwords;i++){
342
+
343
+
344
+
345
+ for(int j=0;j<nwords;j++){
346
+
347
+
348
+
349
+ if(dict[i]<dict[j]){
350
+
351
+
352
+
353
+ string keep=dict[i];
354
+
355
+
356
+
357
+ dict[i]=dict[j];
358
+
359
+
360
+
361
+ dict[j]=keep;
362
+
363
+
364
+
365
+ int keep1=num[i];
366
+
367
+
368
+
369
+ num[i]=num[j];
370
+
371
+
372
+
373
+ num[j]=keep1;
374
+
375
+
376
+
377
+ }
378
+
379
+
380
+
381
+ }
382
+
383
+
384
+
385
+ }
386
+
387
+
388
+
389
+ for(int i=0;i<nwords;i++)
390
+
391
+
392
+
393
+ nnum+=num[i];
394
+
395
+
396
+
397
+
398
+
399
+
400
+
401
+ for(int i=0;i<nwords;i++){
402
+
403
+
404
+
405
+ cout<<dict[i]<<" "<<scientific<<setprecision(6)<<((double)(num[i])/nnum)<<endl;;
406
+
407
+
408
+
409
+ }
410
+
411
+
412
+
413
+ cout<<endl;
414
+
415
+
416
+
417
+ cout<<nnum;
418
+
419
+
420
+
421
+ return 0;
422
+
423
+
424
+
425
+
426
+
427
+
428
+
153
429
  以上です、
154
430
 
155
431
  簡単なことでも全部でもヒントでも構いません。

1

2020/07/25 16:31

投稿

naoki9
naoki9

スコア0

test CHANGED
File without changes
test CHANGED
@@ -7,6 +7,10 @@
7
7
  先生にも質問しましたがまだ返信が来ず提出期限も迫っているため質問させて頂きました。
8
8
 
9
9
  問題
10
+
11
+ Example2.txtは英語の文章が入っていました。
12
+
13
+
10
14
 
11
15
  下記のexample2.txtのユニグラム・バイグラム・トライグラム値を、それぞれアルファベット順に出力したファイルを提出しなさい。また、その際に作成したプログラムも提出しなさい。
12
16