質問編集履歴

3

文法の編集

2020/11/09 15:03

投稿

u-12
u-12

スコア0

test CHANGED
File without changes
test CHANGED
@@ -62,7 +62,9 @@
62
62
 
63
63
  コード
64
64
 
65
+ ```
66
+
65
- ```from slackbot.bot import respond_to #@メッセージへの応答
67
+ from slackbot.bot import respond_to #@メッセージへの応答
66
68
 
67
69
  from slackbot.bot import listen_to #チャンネル内発言への応答
68
70
 

2

文法の編集

2020/11/09 15:03

投稿

u-12
u-12

スコア0

test CHANGED
File without changes
test CHANGED
@@ -62,579 +62,579 @@
62
62
 
63
63
  コード
64
64
 
65
+ ```from slackbot.bot import respond_to #@メッセージへの応答
66
+
67
+ from slackbot.bot import listen_to #チャンネル内発言への応答
68
+
69
+ from slackbot.bot import default_reply # デフォルトの応答
70
+
71
+ import slackbot_settings
72
+
73
+
74
+
75
+ ###################################################
76
+
77
+ #この下にSVM学習済みファイルと単語リスト読み込み部分を貼り付ける
78
+
79
+
80
+
81
+ import pickle
82
+
83
+
84
+
85
+ # 保存したモデルをロードする
86
+
87
+ filename = "svmclassifier.pkl"
88
+
89
+ loaded_classifier = pickle.load(open(filename, "rb"))
90
+
91
+
92
+
93
+ # 単語リストを読み込みリストに保存
94
+
95
+ basicFormList = []
96
+
97
+ bffile = "basicFormList.txt"
98
+
99
+ for line in open(bffile, "r", encoding="utf_8"):
100
+
101
+ basicFormList.append(line.strip())
102
+
103
+ print(len(basicFormList))
104
+
105
+
106
+
107
+ ###################################################
108
+
109
+ #この下にクラスや関数を貼りつける
110
+
111
+
112
+
113
+ from janome.tokenizer import Tokenizer
114
+
115
+
116
+
117
+ # 単語のクラス
118
+
119
+ class Word:
120
+
121
+ def __init__(self, token):
122
+
123
+ # 表層形
124
+
125
+ self.text = token.surface
126
+
127
+
128
+
129
+ # 原型
130
+
131
+ self.basicForm = token.base_form
132
+
133
+
134
+
135
+ # 品詞
136
+
137
+ self.pos = token.part_of_speech
138
+
139
+
140
+
141
+ # 単語の情報を「表層系\t原型\t品詞」で返す
142
+
143
+ def wordInfo(self):
144
+
145
+ return self.text + "\t" + self.basicForm + "\t" + self.pos
146
+
147
+
148
+
149
+ # 引数のtextをJanomeで解析して単語リストを返す関数
150
+
151
+ def janomeAnalyzer(text):
152
+
153
+ # 形態素解析
154
+
155
+ t = Tokenizer()
156
+
157
+ tokens = t.tokenize(text)
158
+
159
+
160
+
161
+ # 解析結果を1行ずつ取得してリストに追加
162
+
163
+ wordlist = []
164
+
165
+ for token in tokens:
166
+
167
+ word = Word(token)
168
+
169
+ wordlist.append(word)
170
+
171
+ return wordlist
172
+
173
+
174
+
175
+ import random
176
+
177
+
178
+
179
+ # キーワード照合ルールのリスト(keywordMatchingRuleオブジェクトのリスト)
180
+
181
+ kRuleList = []
182
+
183
+
184
+
185
+ # 応答候補のリスト(ResponseCandidateオブジェクトのリスト)
186
+
187
+ candidateList = []
188
+
189
+
190
+
191
+ # キーワード照合ルールのクラス(キーワードと応答の組み合わせ)
192
+
193
+ class KeywordMatchingRule:
194
+
195
+ def __init__(self, keyword, response):
196
+
197
+ self.keyword = keyword
198
+
199
+ self.response = response
200
+
201
+
202
+
203
+ # 応答候補のクラス(応答候補とスコアの組み合わせ)
204
+
205
+ class ResponseCandidate:
206
+
207
+ def __init__(self, response, score):
208
+
209
+ self.response = response
210
+
211
+ self.score = score
212
+
213
+ def print(self):
214
+
215
+ print("候補文 [%s, %.5f]" % (self.response, self.score))
216
+
217
+
218
+
219
+ # キーワード照合ルールを初期化する関数
220
+
221
+ def setupKeywordMatchingRule():
222
+
223
+ kRuleList.clear()
224
+
225
+ for line in open('kw_matching_rule.txt', 'r', encoding="utf_8"):
226
+
227
+ arr = line.split(",")
228
+
229
+ # keywordMatchingRuleオブジェクトを作成してkRuleListに追加
230
+
231
+ kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
232
+
233
+
234
+
235
+ # キーワード照合ルールを利用した応答候補を生成する関数
236
+
237
+ def generateResponseByRule(inputText):
238
+
239
+ for rule in kRuleList:
240
+
241
+ # ルールのキーワードが入力テキストに含まれていたら
242
+
243
+ if(rule.keyword in inputText):
244
+
245
+ # キーワードに対応する応答文とスコアでResponseCandidateオブジェクトを作成してcandidateListに追加
246
+
247
+ cdd = ResponseCandidate(rule.response, 1.0 + random.random())
248
+
249
+ candidateList.append(cdd)
250
+
251
+
252
+
253
+ # ユーザ入力文に含まれる名詞を利用した応答候補を生成する関数
254
+
255
+ def generateResponseByInputTopic(inputWordList):
256
+
257
+ # 名詞につなげる語句のリスト
258
+
259
+ textList = ["は好きですか?", "て何ですか?", "何県です。"]
260
+
261
+
262
+
263
+ for w in inputWordList:
264
+
265
+ pos2 = w.pos.split(",")
266
+
267
+ # 品詞が名詞だったら
268
+
269
+ if pos2[0]=='名詞':
270
+
271
+ cdd = ResponseCandidate(w.basicForm + random.choice(textList),
272
+
273
+ 0.7 + random.random())
274
+
275
+ candidateList.append(cdd)
276
+
277
+
278
+
279
+ # 無難な応答を返す関数
280
+
281
+ def generateOtherResponse():
282
+
283
+ # 無難な応答のリスト
284
+
285
+ bunanList = ["なるほど", "それで?","頑張ろう"]
286
+
287
+
288
+
289
+ # ランダムにどれかをcandidateListに追加
290
+
291
+ cdd = ResponseCandidate(random.choice(bunanList), 0.5 + random.random())
292
+
293
+ candidateList.append(cdd)
294
+
295
+
296
+
297
+ from collections import Counter
298
+
299
+
300
+
301
+ # 単語情報リストを渡すとカウンターを返す関数
302
+
303
+ def makeCounter(wordList):
304
+
305
+ basicFormList = []
306
+
307
+ for word in wordList:
308
+
309
+ basicFormList.append(word.basicForm)
310
+
311
+ # 単語の原型のカウンターを作成
312
+
313
+ counter = Counter(basicFormList)
314
+
315
+ return counter
316
+
317
+
318
+
319
+ # Counterのリストと単語リストからベクトルのリストを作成する関数
320
+
321
+ def makeVectorList(counterList, basicFormList):
322
+
323
+ vectorList = []
324
+
325
+ for counter in counterList:
326
+
327
+ vector = []
328
+
329
+ for word in basicFormList:
330
+
331
+ vector.append(counter[word])
332
+
333
+ vectorList.append(vector)
334
+
335
+ return vectorList
336
+
337
+
338
+
339
+ from sklearn import svm
340
+
341
+
342
+
343
+ # ネガポジ判定の結果を返す関数
344
+
345
+ # 引数 text:入力文, classifier:学習済みモデル, basicFormList:ベクトル化に使用する単語リスト
346
+
347
+ def negaposiAnalyzer(text, classifier, basicFormList):
348
+
349
+ # 形態素解析して頻度のCounterを作成
350
+
351
+ counterList = []
352
+
353
+ wordlist = janomeAnalyzer(text)
354
+
355
+ counter = makeCounter(wordlist)
356
+
357
+
358
+
359
+ # 1文のcounterだが,counterListに追加
360
+
361
+ counterList.append(counter)
362
+
363
+
364
+
365
+ # Counterリストと単語リストからベクトルのリストを作成
366
+
367
+ vectorList = makeVectorList(counterList, basicFormList)
368
+
369
+
370
+
371
+ # ベクトルのリストに対してネガポジ判定
372
+
373
+ predict_label = classifier.predict(vectorList)
374
+
375
+
376
+
377
+ # 入力文のベクトル化に使用された単語を出力
378
+
379
+ for vector in vectorList:
380
+
381
+ wl=[]
382
+
383
+ for i, num in enumerate(vector):
384
+
385
+ if(num==1):
386
+
387
+ wl.append(basicFormList[i])
388
+
389
+ print(wl)
390
+
391
+
392
+
393
+ # 予測結果を出力
394
+
395
+ print(predict_label)
396
+
397
+
398
+
399
+ # 予測結果によって出力を決定
400
+
401
+ if predict_label[0]=="1":
402
+
403
+ output = "よかったね"
404
+
405
+ else:
406
+
407
+ output = "ざんねん"
408
+
409
+
410
+
411
+ return output
412
+
413
+
414
+
415
+ def generateNegaposiResponse(inputText):
416
+
417
+ # ネガポジ判定を実行
418
+
419
+ output = negaposiAnalyzer(inputText, loaded_classifier,
420
+
421
+ basicFormList)
422
+
423
+
424
+
425
+ # 応答候補に追加
426
+
427
+ cdd = ResponseCandidate(output, 0.7 + random.random())
428
+
429
+ candidateList.append(cdd)
430
+
431
+
432
+
433
+ # 応答文を生成する関数
434
+
435
+ def generateResponse(inputText):
436
+
437
+
438
+
439
+ # 応答文候補を空にしておく
440
+
441
+ candidateList.clear()
442
+
443
+
444
+
445
+ # 形態素解析した後,3つの戦略を順番に実行
446
+
447
+ wordlist = janomeAnalyzer(inputText)
448
+
449
+ generateResponseByRule(inputText)
450
+
451
+ generateResponseByInputTopic(wordlist)
452
+
453
+ generateOtherResponse()
454
+
455
+
456
+
457
+ # ネガポジ判定の結果を応答候補に追加
458
+
459
+ generateNegaposiResponse(inputText)
460
+
461
+
462
+
463
+ ret="デフォルト"
464
+
465
+ maxScore=-1.0
466
+
467
+
468
+
469
+ # scoreが最も高い応答文候補を出力する
470
+
471
+ for cdd in candidateList:
472
+
473
+ cdd.print()
474
+
475
+ if cdd.score > maxScore:
476
+
477
+ ret=cdd.response
478
+
479
+ maxScore = cdd.score
480
+
481
+ return ret
482
+
483
+
484
+
485
+ # 応答文を生成する関数
486
+
487
+ def generateResponse(inputText):
488
+
489
+
490
+
491
+ # 応答文候補を空にしておく
492
+
493
+ candidateList.clear()
494
+
495
+
496
+
497
+ # 形態素解析した後,3つの戦略を順番に実行
498
+
499
+ wordlist = janomeAnalyzer(inputText)
500
+
501
+ generateResponseByRule(inputText)
502
+
503
+ generateResponseByInputTopic(wordlist)
504
+
505
+ generateOtherResponse()
506
+
507
+
508
+
509
+ # ネガポジ判定の結果を応答候補に追加
510
+
511
+ generateNegaposiResponse(inputText)
512
+
513
+
514
+
515
+ ret="デフォルト"
516
+
517
+ maxScore=-1.0
518
+
519
+
520
+
521
+ # scoreが最も高い応答文候補を戻す
522
+
523
+ for cdd in candidateList:
524
+
525
+ cdd.print()
526
+
527
+ if cdd.score > maxScore:
528
+
529
+ ret=cdd.response
530
+
531
+ maxScore = cdd.score
532
+
533
+ return ret
534
+
535
+ ###################################################
536
+
537
+
538
+
539
+ # キーワード照合ルールを読み込む
540
+
541
+ setupKeywordMatchingRule()
542
+
543
+
544
+
545
+ # 特定の文字列に対して返答
546
+
547
+ @respond_to('こんにちは')
548
+
549
+ def respond(message):
550
+
551
+ message.reply('こんにちは!')
552
+
553
+
554
+
555
+ # デフォルトの返答
556
+
557
+ @default_reply()
558
+
559
+ def default(message):
560
+
561
+ # Slackの入力を取得
562
+
563
+ text = message.body['text']
564
+
565
+
566
+
567
+ # システムの出力を生成
568
+
569
+ output = generateResponse(text)
570
+
571
+
572
+
573
+ # Slackで返答
574
+
575
+ message.reply(output)
576
+
577
+
578
+
579
+ # スタンプの追加
580
+
581
+ @respond_to('かっこいい')
582
+
583
+ def react(message):
584
+
585
+ message.reply('ありがとう!')
586
+
587
+ message.react('hearts')
588
+
589
+ message.react('+1')
590
+
591
+
592
+
593
+ # 決まった応答の追加1
594
+
595
+ @respond_to('時間を教えて')
596
+
597
+ def react(message):
598
+
599
+ import datetime
600
+
601
+ dt_now = datetime.datetime.now()
602
+
603
+ dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
604
+
605
+ message.reply(dt_now_str)
606
+
607
+
608
+
609
+ @respond_to('都道府県を教えて')
610
+
611
+ def react(message):
612
+
613
+ import datetime
614
+
615
+ dt_now = datetime.datetime.now()
616
+
617
+ dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
618
+
619
+ message.reply(dt_now_str)
620
+
621
+
622
+
623
+ コード
624
+
65
625
  ```
66
626
 
67
-
627
+ ### 該当のソースコード
628
+
629
+
630
+
68
-
631
+ python```ここに言語名を入力
632
+
69
- コード
633
+ ソースコード
70
634
 
71
635
  ```
72
636
 
73
- ### 該当のソースコード
637
+
74
-
75
-
76
-
77
- python```ここに言語名を入力
78
-
79
- ソースコード
80
-
81
- ```
82
-
83
- from slackbot.bot import respond_to #@メッセージへの応答
84
-
85
- from slackbot.bot import listen_to #チャンネル内発言への応答
86
-
87
- from slackbot.bot import default_reply # デフォルトの応答
88
-
89
- import slackbot_settings
90
-
91
-
92
-
93
- ###################################################
94
-
95
- #この下にSVM学習済みファイルと単語リスト読み込み部分を貼り付ける
96
-
97
-
98
-
99
- import pickle
100
-
101
-
102
-
103
- # 保存したモデルをロードする
104
-
105
- filename = "svmclassifier.pkl"
106
-
107
- loaded_classifier = pickle.load(open(filename, "rb"))
108
-
109
-
110
-
111
- # 単語リストを読み込みリストに保存
112
-
113
- basicFormList = []
114
-
115
- bffile = "basicFormList.txt"
116
-
117
- for line in open(bffile, "r", encoding="utf_8"):
118
-
119
- basicFormList.append(line.strip())
120
-
121
- print(len(basicFormList))
122
-
123
-
124
-
125
- ###################################################
126
-
127
- #この下にクラスや関数を貼りつける
128
-
129
-
130
-
131
- from janome.tokenizer import Tokenizer
132
-
133
-
134
-
135
- # 単語のクラス
136
-
137
- class Word:
138
-
139
- def __init__(self, token):
140
-
141
- # 表層形
142
-
143
- self.text = token.surface
144
-
145
-
146
-
147
- # 原型
148
-
149
- self.basicForm = token.base_form
150
-
151
-
152
-
153
- # 品詞
154
-
155
- self.pos = token.part_of_speech
156
-
157
-
158
-
159
- # 単語の情報を「表層系\t原型\t品詞」で返す
160
-
161
- def wordInfo(self):
162
-
163
- return self.text + "\t" + self.basicForm + "\t" + self.pos
164
-
165
-
166
-
167
- # 引数のtextをJanomeで解析して単語リストを返す関数
168
-
169
- def janomeAnalyzer(text):
170
-
171
- # 形態素解析
172
-
173
- t = Tokenizer()
174
-
175
- tokens = t.tokenize(text)
176
-
177
-
178
-
179
- # 解析結果を1行ずつ取得してリストに追加
180
-
181
- wordlist = []
182
-
183
- for token in tokens:
184
-
185
- word = Word(token)
186
-
187
- wordlist.append(word)
188
-
189
- return wordlist
190
-
191
-
192
-
193
- import random
194
-
195
-
196
-
197
- # キーワード照合ルールのリスト(keywordMatchingRuleオブジェクトのリスト)
198
-
199
- kRuleList = []
200
-
201
-
202
-
203
- # 応答候補のリスト(ResponseCandidateオブジェクトのリスト)
204
-
205
- candidateList = []
206
-
207
-
208
-
209
- # キーワード照合ルールのクラス(キーワードと応答の組み合わせ)
210
-
211
- class KeywordMatchingRule:
212
-
213
- def __init__(self, keyword, response):
214
-
215
- self.keyword = keyword
216
-
217
- self.response = response
218
-
219
-
220
-
221
- # 応答候補のクラス(応答候補とスコアの組み合わせ)
222
-
223
- class ResponseCandidate:
224
-
225
- def __init__(self, response, score):
226
-
227
- self.response = response
228
-
229
- self.score = score
230
-
231
- def print(self):
232
-
233
- print("候補文 [%s, %.5f]" % (self.response, self.score))
234
-
235
-
236
-
237
- # キーワード照合ルールを初期化する関数
238
-
239
- def setupKeywordMatchingRule():
240
-
241
- kRuleList.clear()
242
-
243
- for line in open('kw_matching_rule.txt', 'r', encoding="utf_8"):
244
-
245
- arr = line.split(",")
246
-
247
- # keywordMatchingRuleオブジェクトを作成してkRuleListに追加
248
-
249
- kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
250
-
251
-
252
-
253
- # キーワード照合ルールを利用した応答候補を生成する関数
254
-
255
- def generateResponseByRule(inputText):
256
-
257
- for rule in kRuleList:
258
-
259
- # ルールのキーワードが入力テキストに含まれていたら
260
-
261
- if(rule.keyword in inputText):
262
-
263
- # キーワードに対応する応答文とスコアでResponseCandidateオブジェクトを作成してcandidateListに追加
264
-
265
- cdd = ResponseCandidate(rule.response, 1.0 + random.random())
266
-
267
- candidateList.append(cdd)
268
-
269
-
270
-
271
- # ユーザ入力文に含まれる名詞を利用した応答候補を生成する関数
272
-
273
- def generateResponseByInputTopic(inputWordList):
274
-
275
- # 名詞につなげる語句のリスト
276
-
277
- textList = ["は好きですか?", "て何ですか?", "何県です。"]
278
-
279
-
280
-
281
- for w in inputWordList:
282
-
283
- pos2 = w.pos.split(",")
284
-
285
- # 品詞が名詞だったら
286
-
287
- if pos2[0]=='名詞':
288
-
289
- cdd = ResponseCandidate(w.basicForm + random.choice(textList),
290
-
291
- 0.7 + random.random())
292
-
293
- candidateList.append(cdd)
294
-
295
-
296
-
297
- # 無難な応答を返す関数
298
-
299
- def generateOtherResponse():
300
-
301
- # 無難な応答のリスト
302
-
303
- bunanList = ["なるほど", "それで?","頑張ろう"]
304
-
305
-
306
-
307
- # ランダムにどれかをcandidateListに追加
308
-
309
- cdd = ResponseCandidate(random.choice(bunanList), 0.5 + random.random())
310
-
311
- candidateList.append(cdd)
312
-
313
-
314
-
315
- from collections import Counter
316
-
317
-
318
-
319
- # 単語情報リストを渡すとカウンターを返す関数
320
-
321
- def makeCounter(wordList):
322
-
323
- basicFormList = []
324
-
325
- for word in wordList:
326
-
327
- basicFormList.append(word.basicForm)
328
-
329
- # 単語の原型のカウンターを作成
330
-
331
- counter = Counter(basicFormList)
332
-
333
- return counter
334
-
335
-
336
-
337
- # Counterのリストと単語リストからベクトルのリストを作成する関数
338
-
339
- def makeVectorList(counterList, basicFormList):
340
-
341
- vectorList = []
342
-
343
- for counter in counterList:
344
-
345
- vector = []
346
-
347
- for word in basicFormList:
348
-
349
- vector.append(counter[word])
350
-
351
- vectorList.append(vector)
352
-
353
- return vectorList
354
-
355
-
356
-
357
- from sklearn import svm
358
-
359
-
360
-
361
- # ネガポジ判定の結果を返す関数
362
-
363
- # 引数 text:入力文, classifier:学習済みモデル, basicFormList:ベクトル化に使用する単語リスト
364
-
365
- def negaposiAnalyzer(text, classifier, basicFormList):
366
-
367
- # 形態素解析して頻度のCounterを作成
368
-
369
- counterList = []
370
-
371
- wordlist = janomeAnalyzer(text)
372
-
373
- counter = makeCounter(wordlist)
374
-
375
-
376
-
377
- # 1文のcounterだが,counterListに追加
378
-
379
- counterList.append(counter)
380
-
381
-
382
-
383
- # Counterリストと単語リストからベクトルのリストを作成
384
-
385
- vectorList = makeVectorList(counterList, basicFormList)
386
-
387
-
388
-
389
- # ベクトルのリストに対してネガポジ判定
390
-
391
- predict_label = classifier.predict(vectorList)
392
-
393
-
394
-
395
- # 入力文のベクトル化に使用された単語を出力
396
-
397
- for vector in vectorList:
398
-
399
- wl=[]
400
-
401
- for i, num in enumerate(vector):
402
-
403
- if(num==1):
404
-
405
- wl.append(basicFormList[i])
406
-
407
- print(wl)
408
-
409
-
410
-
411
- # 予測結果を出力
412
-
413
- print(predict_label)
414
-
415
-
416
-
417
- # 予測結果によって出力を決定
418
-
419
- if predict_label[0]=="1":
420
-
421
- output = "よかったね"
422
-
423
- else:
424
-
425
- output = "ざんねん"
426
-
427
-
428
-
429
- return output
430
-
431
-
432
-
433
- def generateNegaposiResponse(inputText):
434
-
435
- # ネガポジ判定を実行
436
-
437
- output = negaposiAnalyzer(inputText, loaded_classifier,
438
-
439
- basicFormList)
440
-
441
-
442
-
443
- # 応答候補に追加
444
-
445
- cdd = ResponseCandidate(output, 0.7 + random.random())
446
-
447
- candidateList.append(cdd)
448
-
449
-
450
-
451
- # 応答文を生成する関数
452
-
453
- def generateResponse(inputText):
454
-
455
-
456
-
457
- # 応答文候補を空にしておく
458
-
459
- candidateList.clear()
460
-
461
-
462
-
463
- # 形態素解析した後,3つの戦略を順番に実行
464
-
465
- wordlist = janomeAnalyzer(inputText)
466
-
467
- generateResponseByRule(inputText)
468
-
469
- generateResponseByInputTopic(wordlist)
470
-
471
- generateOtherResponse()
472
-
473
-
474
-
475
- # ネガポジ判定の結果を応答候補に追加
476
-
477
- generateNegaposiResponse(inputText)
478
-
479
-
480
-
481
- ret="デフォルト"
482
-
483
- maxScore=-1.0
484
-
485
-
486
-
487
- # scoreが最も高い応答文候補を出力する
488
-
489
- for cdd in candidateList:
490
-
491
- cdd.print()
492
-
493
- if cdd.score > maxScore:
494
-
495
- ret=cdd.response
496
-
497
- maxScore = cdd.score
498
-
499
- return ret
500
-
501
-
502
-
503
- # 応答文を生成する関数
504
-
505
- def generateResponse(inputText):
506
-
507
-
508
-
509
- # 応答文候補を空にしておく
510
-
511
- candidateList.clear()
512
-
513
-
514
-
515
- # 形態素解析した後,3つの戦略を順番に実行
516
-
517
- wordlist = janomeAnalyzer(inputText)
518
-
519
- generateResponseByRule(inputText)
520
-
521
- generateResponseByInputTopic(wordlist)
522
-
523
- generateOtherResponse()
524
-
525
-
526
-
527
- # ネガポジ判定の結果を応答候補に追加
528
-
529
- generateNegaposiResponse(inputText)
530
-
531
-
532
-
533
- ret="デフォルト"
534
-
535
- maxScore=-1.0
536
-
537
-
538
-
539
- # scoreが最も高い応答文候補を戻す
540
-
541
- for cdd in candidateList:
542
-
543
- cdd.print()
544
-
545
- if cdd.score > maxScore:
546
-
547
- ret=cdd.response
548
-
549
- maxScore = cdd.score
550
-
551
- return ret
552
-
553
- ###################################################
554
-
555
-
556
-
557
- # キーワード照合ルールを読み込む
558
-
559
- setupKeywordMatchingRule()
560
-
561
-
562
-
563
- # 特定の文字列に対して返答
564
-
565
- @respond_to('こんにちは')
566
-
567
- def respond(message):
568
-
569
- message.reply('こんにちは!')
570
-
571
-
572
-
573
- # デフォルトの返答
574
-
575
- @default_reply()
576
-
577
- def default(message):
578
-
579
- # Slackの入力を取得
580
-
581
- text = message.body['text']
582
-
583
-
584
-
585
- # システムの出力を生成
586
-
587
- output = generateResponse(text)
588
-
589
-
590
-
591
- # Slackで返答
592
-
593
- message.reply(output)
594
-
595
-
596
-
597
- # スタンプの追加
598
-
599
- @respond_to('かっこいい')
600
-
601
- def react(message):
602
-
603
- message.reply('ありがとう!')
604
-
605
- message.react('hearts')
606
-
607
- message.react('+1')
608
-
609
-
610
-
611
- # 決まった応答の追加1
612
-
613
- @respond_to('時間を教えて')
614
-
615
- def react(message):
616
-
617
- import datetime
618
-
619
- dt_now = datetime.datetime.now()
620
-
621
- dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
622
-
623
- message.reply(dt_now_str)
624
-
625
-
626
-
627
- @respond_to('都道府県を教えて')
628
-
629
- def react(message):
630
-
631
- import datetime
632
-
633
- dt_now = datetime.datetime.now()
634
-
635
- dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
636
-
637
- message.reply(dt_now_str)
638
638
 
639
639
 
640
640
 

1

文法の編集

2020/11/09 14:50

投稿

u-12
u-12

スコア0

test CHANGED
File without changes
test CHANGED
@@ -18,47 +18,57 @@
18
18
 
19
19
  エラーメッセージ
20
20
 
21
+ ```Failed to import plugins.react
22
+
23
+ Traceback (most recent call last):
24
+
25
+ File "C:\Users\k018c1445\anaconda3\lib\site-packages\slackbot\manager.py", line 60, in _load_plugins
26
+
27
+ import_module(module)
28
+
29
+ File "C:\Users\k018c1445\anaconda3\lib\importlib\__init__.py", line 127, in import_module
30
+
31
+ return _bootstrap._gcd_import(name[level:], package, level)
32
+
33
+ File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
34
+
35
+ File "<frozen importlib._bootstrap>", line 983, in _find_and_load
36
+
37
+ File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
38
+
39
+ File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
40
+
41
+ File "<frozen importlib._bootstrap_external>", line 728, in exec_module
42
+
43
+ File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
44
+
45
+ File "C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA\plugins\react.py", line 239, in <module>
46
+
47
+ setupKeywordMatchingRule()
48
+
49
+ File "C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA\plugins\react.py", line 84, in setupKeywordMatchingRule
50
+
51
+ kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
52
+
53
+ IndexError: list index out of range`````````ここに言語を入力
54
+
55
+ ここに言語を入力
56
+
21
57
  ```
22
58
 
23
- (base) PS C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA> python run.py
59
+ ここに言語を入力
24
-
60
+
25
- starting slackbot
61
+ ```python
26
-
27
- Failed to import plugins.react
62
+
28
-
29
- Traceback (most recent call last):
30
-
31
- File "C:\Users\k018c1445\anaconda3\lib\site-packages\slackbot\manager.py", line 60, in _load_plugins
32
-
33
- import_module(module)
34
-
35
- File "C:\Users\k018c1445\anaconda3\lib\importlib\__init__.py", line 127, in import_module
36
-
37
- return _bootstrap._gcd_import(name[level:], package, level)
38
-
39
- File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
40
-
41
- File "<frozen importlib._bootstrap>", line 983, in _find_and_load
42
-
43
- File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
44
-
45
- File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
46
-
47
- File "<frozen importlib._bootstrap_external>", line 724, in exec_module
48
-
49
- File "<frozen importlib._bootstrap_external>", line 860, in get_code
50
-
51
- File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
52
-
53
- File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
54
-
55
- File "C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA\plugins\react.py", line 98
56
-
57
- textList = ["は好きですか?", "て何ですか?" , "何県です。", "]
58
-
59
- ^
63
+ コード
60
-
64
+
61
- SyntaxError: invalid character in identifier
65
+ ```
66
+
67
+
68
+
69
+ コード
70
+
71
+ ```
62
72
 
63
73
  ### 該当のソースコード
64
74
 
@@ -70,566 +80,568 @@
70
80
 
71
81
  ```
72
82
 
83
+ from slackbot.bot import respond_to #@メッセージへの応答
84
+
85
+ from slackbot.bot import listen_to #チャンネル内発言への応答
86
+
87
+ from slackbot.bot import default_reply # デフォルトの応答
88
+
89
+ import slackbot_settings
90
+
91
+
92
+
93
+ ###################################################
94
+
95
+ #この下にSVM学習済みファイルと単語リスト読み込み部分を貼り付ける
96
+
97
+
98
+
99
+ import pickle
100
+
101
+
102
+
103
+ # 保存したモデルをロードする
104
+
105
+ filename = "svmclassifier.pkl"
106
+
107
+ loaded_classifier = pickle.load(open(filename, "rb"))
108
+
109
+
110
+
111
+ # 単語リストを読み込みリストに保存
112
+
113
+ basicFormList = []
114
+
115
+ bffile = "basicFormList.txt"
116
+
117
+ for line in open(bffile, "r", encoding="utf_8"):
118
+
119
+ basicFormList.append(line.strip())
120
+
121
+ print(len(basicFormList))
122
+
123
+
124
+
125
+ ###################################################
126
+
127
+ #この下にクラスや関数を貼りつける
128
+
129
+
130
+
131
+ from janome.tokenizer import Tokenizer
132
+
133
+
134
+
135
+ # 単語のクラス
136
+
137
+ class Word:
138
+
139
+ def __init__(self, token):
140
+
141
+ # 表層形
142
+
143
+ self.text = token.surface
144
+
145
+
146
+
147
+ # 原型
148
+
149
+ self.basicForm = token.base_form
150
+
151
+
152
+
153
+ # 品詞
154
+
155
+ self.pos = token.part_of_speech
156
+
157
+
158
+
159
+ # 単語の情報を「表層系\t原型\t品詞」で返す
160
+
161
+ def wordInfo(self):
162
+
163
+ return self.text + "\t" + self.basicForm + "\t" + self.pos
164
+
165
+
166
+
167
+ # 引数のtextをJanomeで解析して単語リストを返す関数
168
+
169
+ def janomeAnalyzer(text):
170
+
171
+ # 形態素解析
172
+
173
+ t = Tokenizer()
174
+
175
+ tokens = t.tokenize(text)
176
+
177
+
178
+
179
+ # 解析結果を1行ずつ取得してリストに追加
180
+
181
+ wordlist = []
182
+
183
+ for token in tokens:
184
+
185
+ word = Word(token)
186
+
187
+ wordlist.append(word)
188
+
189
+ return wordlist
190
+
191
+
192
+
193
+ import random
194
+
195
+
196
+
197
+ # キーワード照合ルールのリスト(keywordMatchingRuleオブジェクトのリスト)
198
+
199
+ kRuleList = []
200
+
201
+
202
+
203
+ # 応答候補のリスト(ResponseCandidateオブジェクトのリスト)
204
+
205
+ candidateList = []
206
+
207
+
208
+
209
+ # キーワード照合ルールのクラス(キーワードと応答の組み合わせ)
210
+
211
+ class KeywordMatchingRule:
212
+
213
+ def __init__(self, keyword, response):
214
+
215
+ self.keyword = keyword
216
+
217
+ self.response = response
218
+
219
+
220
+
221
+ # 応答候補のクラス(応答候補とスコアの組み合わせ)
222
+
223
+ class ResponseCandidate:
224
+
225
+ def __init__(self, response, score):
226
+
227
+ self.response = response
228
+
229
+ self.score = score
230
+
231
+ def print(self):
232
+
233
+ print("候補文 [%s, %.5f]" % (self.response, self.score))
234
+
235
+
236
+
237
+ # キーワード照合ルールを初期化する関数
238
+
239
+ def setupKeywordMatchingRule():
240
+
241
+ kRuleList.clear()
242
+
243
+ for line in open('kw_matching_rule.txt', 'r', encoding="utf_8"):
244
+
245
+ arr = line.split(",")
246
+
247
+ # keywordMatchingRuleオブジェクトを作成してkRuleListに追加
248
+
249
+ kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
250
+
251
+
252
+
253
+ # キーワード照合ルールを利用した応答候補を生成する関数
254
+
255
+ def generateResponseByRule(inputText):
256
+
257
+ for rule in kRuleList:
258
+
259
+ # ルールのキーワードが入力テキストに含まれていたら
260
+
261
+ if(rule.keyword in inputText):
262
+
263
+ # キーワードに対応する応答文とスコアでResponseCandidateオブジェクトを作成してcandidateListに追加
264
+
265
+ cdd = ResponseCandidate(rule.response, 1.0 + random.random())
266
+
267
+ candidateList.append(cdd)
268
+
269
+
270
+
271
+ # ユーザ入力文に含まれる名詞を利用した応答候補を生成する関数
272
+
273
+ def generateResponseByInputTopic(inputWordList):
274
+
275
+ # 名詞につなげる語句のリスト
276
+
277
+ textList = ["は好きですか?", "て何ですか?", "何県です。"]
278
+
279
+
280
+
281
+ for w in inputWordList:
282
+
283
+ pos2 = w.pos.split(",")
284
+
285
+ # 品詞が名詞だったら
286
+
287
+ if pos2[0]=='名詞':
288
+
289
+ cdd = ResponseCandidate(w.basicForm + random.choice(textList),
290
+
291
+ 0.7 + random.random())
292
+
293
+ candidateList.append(cdd)
294
+
295
+
296
+
297
+ # 無難な応答を返す関数
298
+
299
+ def generateOtherResponse():
300
+
301
+ # 無難な応答のリスト
302
+
303
+ bunanList = ["なるほど", "それで?","頑張ろう"]
304
+
305
+
306
+
307
+ # ランダムにどれかをcandidateListに追加
308
+
309
+ cdd = ResponseCandidate(random.choice(bunanList), 0.5 + random.random())
310
+
311
+ candidateList.append(cdd)
312
+
313
+
314
+
315
+ from collections import Counter
316
+
317
+
318
+
319
+ # 単語情報リストを渡すとカウンターを返す関数
320
+
321
+ def makeCounter(wordList):
322
+
323
+ basicFormList = []
324
+
325
+ for word in wordList:
326
+
327
+ basicFormList.append(word.basicForm)
328
+
329
+ # 単語の原型のカウンターを作成
330
+
331
+ counter = Counter(basicFormList)
332
+
333
+ return counter
334
+
335
+
336
+
337
+ # Counterのリストと単語リストからベクトルのリストを作成する関数
338
+
339
+ def makeVectorList(counterList, basicFormList):
340
+
341
+ vectorList = []
342
+
343
+ for counter in counterList:
344
+
345
+ vector = []
346
+
347
+ for word in basicFormList:
348
+
349
+ vector.append(counter[word])
350
+
351
+ vectorList.append(vector)
352
+
353
+ return vectorList
354
+
355
+
356
+
357
+ from sklearn import svm
358
+
359
+
360
+
361
+ # ネガポジ判定の結果を返す関数
362
+
363
+ # 引数 text:入力文, classifier:学習済みモデル, basicFormList:ベクトル化に使用する単語リスト
364
+
365
+ def negaposiAnalyzer(text, classifier, basicFormList):
366
+
367
+ # 形態素解析して頻度のCounterを作成
368
+
369
+ counterList = []
370
+
371
+ wordlist = janomeAnalyzer(text)
372
+
373
+ counter = makeCounter(wordlist)
374
+
375
+
376
+
377
+ # 1文のcounterだが,counterListに追加
378
+
379
+ counterList.append(counter)
380
+
381
+
382
+
383
+ # Counterリストと単語リストからベクトルのリストを作成
384
+
385
+ vectorList = makeVectorList(counterList, basicFormList)
386
+
387
+
388
+
389
+ # ベクトルのリストに対してネガポジ判定
390
+
391
+ predict_label = classifier.predict(vectorList)
392
+
393
+
394
+
395
+ # 入力文のベクトル化に使用された単語を出力
396
+
397
+ for vector in vectorList:
398
+
399
+ wl=[]
400
+
401
+ for i, num in enumerate(vector):
402
+
403
+ if(num==1):
404
+
405
+ wl.append(basicFormList[i])
406
+
407
+ print(wl)
408
+
409
+
410
+
411
+ # 予測結果を出力
412
+
413
+ print(predict_label)
414
+
415
+
416
+
417
+ # 予測結果によって出力を決定
418
+
419
+ if predict_label[0]=="1":
420
+
421
+ output = "よかったね"
422
+
423
+ else:
424
+
425
+ output = "ざんねん"
426
+
427
+
428
+
429
+ return output
430
+
431
+
432
+
433
+ def generateNegaposiResponse(inputText):
434
+
435
+ # ネガポジ判定を実行
436
+
437
+ output = negaposiAnalyzer(inputText, loaded_classifier,
438
+
439
+ basicFormList)
440
+
441
+
442
+
443
+ # 応答候補に追加
444
+
445
+ cdd = ResponseCandidate(output, 0.7 + random.random())
446
+
447
+ candidateList.append(cdd)
448
+
449
+
450
+
451
+ # 応答文を生成する関数
452
+
453
+ def generateResponse(inputText):
454
+
455
+
456
+
457
+ # 応答文候補を空にしておく
458
+
459
+ candidateList.clear()
460
+
461
+
462
+
463
+ # 形態素解析した後,3つの戦略を順番に実行
464
+
465
+ wordlist = janomeAnalyzer(inputText)
466
+
467
+ generateResponseByRule(inputText)
468
+
469
+ generateResponseByInputTopic(wordlist)
470
+
471
+ generateOtherResponse()
472
+
473
+
474
+
475
+ # ネガポジ判定の結果を応答候補に追加
476
+
477
+ generateNegaposiResponse(inputText)
478
+
479
+
480
+
481
+ ret="デフォルト"
482
+
483
+ maxScore=-1.0
484
+
485
+
486
+
487
+ # scoreが最も高い応答文候補を出力する
488
+
489
+ for cdd in candidateList:
490
+
491
+ cdd.print()
492
+
493
+ if cdd.score > maxScore:
494
+
495
+ ret=cdd.response
496
+
497
+ maxScore = cdd.score
498
+
499
+ return ret
500
+
501
+
502
+
503
+ # 応答文を生成する関数
504
+
505
+ def generateResponse(inputText):
506
+
507
+
508
+
509
+ # 応答文候補を空にしておく
510
+
511
+ candidateList.clear()
512
+
513
+
514
+
515
+ # 形態素解析した後,3つの戦略を順番に実行
516
+
517
+ wordlist = janomeAnalyzer(inputText)
518
+
519
+ generateResponseByRule(inputText)
520
+
521
+ generateResponseByInputTopic(wordlist)
522
+
523
+ generateOtherResponse()
524
+
525
+
526
+
527
+ # ネガポジ判定の結果を応答候補に追加
528
+
529
+ generateNegaposiResponse(inputText)
530
+
531
+
532
+
533
+ ret="デフォルト"
534
+
535
+ maxScore=-1.0
536
+
537
+
538
+
539
+ # scoreが最も高い応答文候補を戻す
540
+
541
+ for cdd in candidateList:
542
+
543
+ cdd.print()
544
+
545
+ if cdd.score > maxScore:
546
+
547
+ ret=cdd.response
548
+
549
+ maxScore = cdd.score
550
+
551
+ return ret
552
+
553
+ ###################################################
554
+
555
+
556
+
557
+ # キーワード照合ルールを読み込む
558
+
559
+ setupKeywordMatchingRule()
560
+
561
+
562
+
563
+ # 特定の文字列に対して返答
564
+
565
+ @respond_to('こんにちは')
566
+
567
+ def respond(message):
568
+
569
+ message.reply('こんにちは!')
570
+
571
+
572
+
573
+ # デフォルトの返答
574
+
575
+ @default_reply()
576
+
577
+ def default(message):
578
+
579
+ # Slackの入力を取得
580
+
581
+ text = message.body['text']
582
+
583
+
584
+
585
+ # システムの出力を生成
586
+
587
+ output = generateResponse(text)
588
+
589
+
590
+
591
+ # Slackで返答
592
+
593
+ message.reply(output)
594
+
595
+
596
+
597
+ # スタンプの追加
598
+
599
+ @respond_to('かっこいい')
600
+
601
+ def react(message):
602
+
603
+ message.reply('ありがとう!')
604
+
605
+ message.react('hearts')
606
+
607
+ message.react('+1')
608
+
609
+
610
+
611
+ # 決まった応答の追加1
612
+
613
+ @respond_to('時間を教えて')
614
+
615
+ def react(message):
616
+
617
+ import datetime
618
+
619
+ dt_now = datetime.datetime.now()
620
+
621
+ dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
622
+
623
+ message.reply(dt_now_str)
624
+
625
+
626
+
627
+ @respond_to('都道府県を教えて')
628
+
629
+ def react(message):
630
+
631
+ import datetime
632
+
633
+ dt_now = datetime.datetime.now()
634
+
635
+ dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
636
+
637
+ message.reply(dt_now_str)
638
+
639
+
640
+
73
641
 
74
642
 
75
643
  ### 試したこと
76
644
 
77
- from slackbot.bot import respond_to #@メッセージへの応答
78
-
79
- from slackbot.bot import listen_to #チャンネル内発言への応答
80
-
81
- from slackbot.bot import default_reply # デフォルトの応答
82
-
83
- import slackbot_settings
84
-
85
-
86
-
87
- ###################################################
88
-
89
- #この下にSVM学習済みファイルと単語リスト読み込み部分を貼り付ける
90
-
91
-
92
-
93
- import pickle
94
-
95
-
96
-
97
- # 保存したモデルをロードする
98
-
99
- filename = "svmclassifier.pkl"
100
-
101
- loaded_classifier = pickle.load(open(filename, "rb"))
102
-
103
-
104
-
105
- # 単語リストを読み込みリストに保存
106
-
107
- basicFormList = []
108
-
109
- bffile = "basicFormList.txt"
110
-
111
- for line in open(bffile, "r", encoding="utf_8"):
112
-
113
- basicFormList.append(line.strip())
114
-
115
- print(len(basicFormList))
116
-
117
-
118
-
119
- ###################################################
120
-
121
- #この下にクラスや関数を貼りつける
122
-
123
-
124
-
125
- from janome.tokenizer import Tokenizer
126
-
127
-
128
-
129
- # 単語のクラス
130
-
131
- class Word:
132
-
133
- def __init__(self, token):
134
-
135
- # 表層形
136
-
137
- self.text = token.surface
138
-
139
-
140
-
141
- # 原型
142
-
143
- self.basicForm = token.base_form
144
-
145
-
146
-
147
- # 品詞
148
-
149
- self.pos = token.part_of_speech
150
-
151
-
152
-
153
- # 単語の情報を「表層系\t原型\t品詞」で返す
154
-
155
- def wordInfo(self):
156
-
157
- return self.text + "\t" + self.basicForm + "\t" + self.pos
158
-
159
-
160
-
161
- # 引数のtextをJanomeで解析して単語リストを返す関数
162
-
163
- def janomeAnalyzer(text):
164
-
165
- # 形態素解析
166
-
167
- t = Tokenizer()
168
-
169
- tokens = t.tokenize(text)
170
-
171
-
172
-
173
- # 解析結果を1行ずつ取得してリストに追加
174
-
175
- wordlist = []
176
-
177
- for token in tokens:
178
-
179
- word = Word(token)
180
-
181
- wordlist.append(word)
182
-
183
- return wordlist
184
-
185
-
186
-
187
- import random
188
-
189
-
190
-
191
- # キーワード照合ルールのリスト(keywordMatchingRuleオブジェクトのリスト)
192
-
193
- kRuleList = []
194
-
195
-
196
-
197
- # 応答候補のリスト(ResponseCandidateオブジェクトのリスト)
198
-
199
- candidateList = []
200
-
201
-
202
-
203
- # キーワード照合ルールのクラス(キーワードと応答の組み合わせ)
204
-
205
- class KeywordMatchingRule:
206
-
207
- def __init__(self, keyword, response):
208
-
209
- self.keyword = keyword
210
-
211
- self.response = response
212
-
213
-
214
-
215
- # 応答候補のクラス(応答候補とスコアの組み合わせ)
216
-
217
- class ResponseCandidate:
218
-
219
- def __init__(self, response, score):
220
-
221
- self.response = response
222
-
223
- self.score = score
224
-
225
- def print(self):
226
-
227
- print("候補文 [%s, %.5f]" % (self.response, self.score))
228
-
229
-
230
-
231
- # キーワード照合ルールを初期化する関数
232
-
233
- def setupKeywordMatchingRule():
234
-
235
- kRuleList.clear()
236
-
237
- for line in open('kw_matching_rule.txt', 'r', encoding="utf_8"):
238
-
239
- arr = line.split(",")
240
-
241
- # keywordMatchingRuleオブジェクトを作成してkRuleListに追加
242
-
243
- kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
244
-
245
-
246
-
247
- # キーワード照合ルールを利用した応答候補を生成する関数
248
-
249
- def generateResponseByRule(inputText):
250
-
251
- for rule in kRuleList:
252
-
253
- # ルールのキーワードが入力テキストに含まれていたら
254
-
255
- if(rule.keyword in inputText):
256
-
257
- # キーワードに対応する応答文とスコアでResponseCandidateオブジェクトを作成してcandidateListに追加
258
-
259
- cdd = ResponseCandidate(rule.response, 1.0 + random.random())
260
-
261
- candidateList.append(cdd)
262
-
263
-
264
-
265
- # ユーザ入力文に含まれる名詞を利用した応答候補を生成する関数
266
-
267
- def generateResponseByInputTopic(inputWordList):
268
-
269
- # 名詞につなげる語句のリスト
270
-
271
- textList = ["は好きですか?", "て何ですか?" , "何県です。", "]
272
-
273
-
274
-
275
- for w in inputWordList:
276
-
277
- pos2 = w.pos.split(",")
278
-
279
- # 品詞が名詞だったら
280
-
281
- if pos2[0]=='名詞':
282
-
283
- cdd = ResponseCandidate(w.basicForm + random.choice(textList),
284
-
285
- 0.7 + random.random())
286
-
287
- candidateList.append(cdd)
288
-
289
-
290
-
291
- # 無難な応答を返す関数
292
-
293
- def generateOtherResponse():
294
-
295
- # 無難な応答のリスト
296
-
297
- bunanList = ["なるほど", "それで?","頑張ろう"]
298
-
299
-
300
-
301
- # ランダムにどれかをcandidateListに追加
302
-
303
- cdd = ResponseCandidate(random.choice(bunanList), 0.5 + random.random())
304
-
305
- candidateList.append(cdd)
306
-
307
-
308
-
309
- from collections import Counter
310
-
311
-
312
-
313
- # 単語情報リストを渡すとカウンターを返す関数
314
-
315
- def makeCounter(wordList):
316
-
317
- basicFormList = []
318
-
319
- for word in wordList:
320
-
321
- basicFormList.append(word.basicForm)
322
-
323
- # 単語の原型のカウンターを作成
324
-
325
- counter = Counter(basicFormList)
326
-
327
- return counter
328
-
329
-
330
-
331
- # Counterのリストと単語リストからベクトルのリストを作成する関数
332
-
333
- def makeVectorList(counterList, basicFormList):
334
-
335
- vectorList = []
336
-
337
- for counter in counterList:
338
-
339
- vector = []
340
-
341
- for word in basicFormList:
342
-
343
- vector.append(counter[word])
344
-
345
- vectorList.append(vector)
346
-
347
- return vectorList
348
-
349
-
350
-
351
- from sklearn import svm
352
-
353
-
354
-
355
- # ネガポジ判定の結果を返す関数
356
-
357
- # 引数 text:入力文, classifier:学習済みモデル, basicFormList:ベクトル化に使用する単語リスト
358
-
359
- def negaposiAnalyzer(text, classifier, basicFormList):
360
-
361
- # 形態素解析して頻度のCounterを作成
362
-
363
- counterList = []
364
-
365
- wordlist = janomeAnalyzer(text)
366
-
367
- counter = makeCounter(wordlist)
368
-
369
-
370
-
371
- # 1文のcounterだが,counterListに追加
372
-
373
- counterList.append(counter)
374
-
375
-
376
-
377
- # Counterリストと単語リストからベクトルのリストを作成
378
-
379
- vectorList = makeVectorList(counterList, basicFormList)
380
-
381
-
382
-
383
- # ベクトルのリストに対してネガポジ判定
384
-
385
- predict_label = classifier.predict(vectorList)
386
-
387
-
388
-
389
- # 入力文のベクトル化に使用された単語を出力
390
-
391
- for vector in vectorList:
392
-
393
- wl=[]
394
-
395
- for i, num in enumerate(vector):
396
-
397
- if(num==1):
398
-
399
- wl.append(basicFormList[i])
400
-
401
- print(wl)
402
-
403
-
404
-
405
- # 予測結果を出力
406
-
407
- print(predict_label)
408
-
409
-
410
-
411
- # 予測結果によって出力を決定
412
-
413
- if predict_label[0]=="1":
414
-
415
- output = "よかったね"
416
-
417
- else:
418
-
419
- output = "ざんねん"
420
-
421
-
422
-
423
- return output
424
-
425
-
426
-
427
- def generateNegaposiResponse(inputText):
428
-
429
- # ネガポジ判定を実行
430
-
431
- output = negaposiAnalyzer(inputText, loaded_classifier,
432
-
433
- basicFormList)
434
-
435
-
436
-
437
- # 応答候補に追加
438
-
439
- cdd = ResponseCandidate(output, 0.7 + random.random())
440
-
441
- candidateList.append(cdd)
442
-
443
-
444
-
445
- # 応答文を生成する関数
446
-
447
- def generateResponse(inputText):
448
-
449
-
450
-
451
- # 応答文候補を空にしておく
452
-
453
- candidateList.clear()
454
-
455
-
456
-
457
- # 形態素解析した後,3つの戦略を順番に実行
458
-
459
- wordlist = janomeAnalyzer(inputText)
460
-
461
- generateResponseByRule(inputText)
462
-
463
- generateResponseByInputTopic(wordlist)
464
-
465
- generateOtherResponse()
466
-
467
-
468
-
469
- # ネガポジ判定の結果を応答候補に追加
470
-
471
- generateNegaposiResponse(inputText)
472
-
473
-
474
-
475
- ret="デフォルト"
476
-
477
- maxScore=-1.0
478
-
479
-
480
-
481
- # scoreが最も高い応答文候補を出力する
482
-
483
- for cdd in candidateList:
484
-
485
- cdd.print()
486
-
487
- if cdd.score > maxScore:
488
-
489
- ret=cdd.response
490
-
491
- maxScore = cdd.score
492
-
493
- return ret
494
-
495
-
496
-
497
- # 応答文を生成する関数
498
-
499
- def generateResponse(inputText):
500
-
501
-
502
-
503
- # 応答文候補を空にしておく
504
-
505
- candidateList.clear()
506
-
507
-
508
-
509
- # 形態素解析した後,3つの戦略を順番に実行
510
-
511
- wordlist = janomeAnalyzer(inputText)
512
-
513
- generateResponseByRule(inputText)
514
-
515
- generateResponseByInputTopic(wordlist)
516
-
517
- generateOtherResponse()
518
-
519
-
520
-
521
- # ネガポジ判定の結果を応答候補に追加
522
-
523
- generateNegaposiResponse(inputText)
524
-
525
-
526
-
527
- ret="デフォルト"
528
-
529
- maxScore=-1.0
530
-
531
-
532
-
533
- # scoreが最も高い応答文候補を戻す
534
-
535
- for cdd in candidateList:
536
-
537
- cdd.print()
538
-
539
- if cdd.score > maxScore:
540
-
541
- ret=cdd.response
542
-
543
- maxScore = cdd.score
544
-
545
- return ret
546
-
547
- ###################################################
548
-
549
-
550
-
551
- # キーワード照合ルールを読み込む
552
-
553
- setupKeywordMatchingRule()
554
-
555
-
556
-
557
- # 特定の文字列に対して返答
558
-
559
- @respond_to('こんにちは')
560
-
561
- def respond(message):
562
-
563
- message.reply('こんにちは!')
564
-
565
-
566
-
567
- # デフォルトの返答
568
-
569
- @default_reply()
570
-
571
- def default(message):
572
-
573
- # Slackの入力を取得
574
-
575
- text = message.body['text']
576
-
577
-
578
-
579
- # システムの出力を生成
580
-
581
- output = generateResponse(text)
582
-
583
-
584
-
585
- # Slackで返答
586
-
587
- message.reply(output)
588
-
589
-
590
-
591
- # スタンプの追加
592
-
593
- @respond_to('かっこいい')
594
-
595
- def react(message):
596
-
597
- message.reply('ありがとう!')
598
-
599
- message.react('hearts')
600
-
601
- message.react('+1')
602
-
603
-
604
-
605
- # 決まった応答の追加1
606
-
607
- @respond_to('時間を教えて')
608
-
609
- def react(message):
610
-
611
- import datetime
612
-
613
- dt_now = datetime.datetime.now()
614
-
615
- dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
616
-
617
- message.reply(dt_now_str)
618
-
619
-
620
-
621
- @respond_to('都道府県を教えて')
622
-
623
- def react(message):
624
-
625
- import datetime
626
-
627
- dt_now = datetime.datetime.now()
628
-
629
- dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
630
-
631
- message.reply(dt_now_str)
632
-
633
645
 
634
646
 
635
647