質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1534閲覧

Pythonとxmlを使ってTelegramにお喋りボットを実装したい。

kay_ventris4

総合スコア269

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/02 12:40

編集2020/09/02 13:23

前提・実現したいこと

Telegramにお喋りボットをPythonを使って実装したいです。

xmlのaimlを使って簡単なお喋りができるファイルをPythonで作り、これをTelegramに実装しようとしているのですが、inputがうまくできていないのか、応答が正常に行われません。市販の本のチュートリアルが日本語用に書かれていたのを独力で英語版にしようとして、MeCab等の解析手順を勝手に省いたのですが、その辺りに問題があるのかと…

発生している問題・エラーメッセージ

Telegram上のボットが初期メッセージを発するところまでは順調です。そののちHelloとメッセージをこちら側が打ち込むと以下のエラーが出力されます。(名前の部分はで伏してあります。):
(以下エラー)
FATAL PARSE ERROR in file osyaberi.xml:
osyaberi.xml:1:0: unclosed token
WARNING: No match found for input: Hello
No error handlers are registered, logging exception.
Traceback (most recent call last):
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/ext/dispatcher.py", line 340, in process_update
handler.handle_update(update, self, check, context)
File "/Users//opt/anaconda3/lib/python3.7/site-packages/telegram/ext/handler.py", line 122, in handle_update
return self.callback(dispatcher.bot, update, optional_args)
File "/Users/
/Desktop/Weather/telegram_bot.py", line 14, in message
update.message.reply_text(system_output["utt"])
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/message.py", line 515, in reply_text
return self.bot.send_message(self.chat_id, args, kwargs)
File "</Users/
/opt/anaconda3/lib/python3.7/site-packages/decorator.py:decorator-gen-2>", line 2, in send_message
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/bot.py", line 67, in decorator
result = func(args, kwargs)
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/bot.py", line 348, in send_message
timeout=timeout, kwargs)
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/bot.py", line 175, in _message
result = self._request.post(url, data, timeout=timeout)
File "/Users/
/opt/anaconda3/lib/python3.7/site-packages/telegram/utils/request.py", line 333, in post
urlopen_kwargs)
File "/Users/
*/opt/anaconda3/lib/python3.7/site-packages/telegram/utils/request.py", line 244, in _request_wrapper
raise BadRequest(message)
telegram.error.BadRequest: Message text is empty
(以上エラー)

該当のソースコード

xml

1<?xml version="1.0" encoding="UTF-8"> 2<aiml version="1.0.1" encoding="UTF-8"> 3 4 <category> 5 <pattern>Hello _</pattern> 6 <template>Hello, Kay.</template> 7 </category> 8 <category> 9 <pattern>Good morning _</pattern> 10 <template>Good morning, Kay.</template> 11 </category> 12 <category> 13 <pattern>Good evening _</pattern> 14 <template>Good evening, Kay.</template> 15 </category> 16 17 18 <category> 19 <pattern>_ Japan _</pattern> 20 <template>Ah Japan is really a divine country, isnt it.</template> 21 </category> 22 <category> 23 <pattern> _ UK _</pattern> 24 <template>Diving into Thames is quite fun.</template> 25 </category> 26 <category> 27 <pattern>_ France _</pattern> 28 <template>Ah Ive been to France to visit the friend in Toulouse. That was definitely superb.</template> 29 </category> 30 <category> 31 <pattern>_ I went to * _</pattern> 32 <template>Oh you visited <star/>? Thats absolutely a good place.</template> 33 </category> 34 35 36 <category> 37 <pattern>My name is * _</pattern> 38 <think><set name="username"><star/></set></think> 39 <template>Thank you. Your name has been registered.</template> 40 </category> 41 <category> 42 <pattern>_ bye</pattern> 43 <template>Good bye, <get name="username"/>. See you again.</template> 44 </category> 45 46 47 <category> 48 <pattern>_ films _</pattern> 49 <template>Do you like watching films?</template> 50 </category> 51 <category> 52 <pattern>_ yes _</pattern> 53 <that>Do you like watching films?</that> 54 <template>Me too.</template> 55 </category> 56 <category> 57 <pattern>_ no _</pattern> 58 <that>Do you like watching films?</that> 59 <template>I do recommend you watch Weathering With You.</template> 60 </category> 61 62 63 <category> 64 <pattern>Any suggestion for todays lunch?</pattern> 65 <template> 66 <random> 67 <li>Italian</li> 68 <li>Japanese</li> 69 <li>French</li> 70 <li>Chinese</li> 71 </random> 72 </template> 73 </category> 74 75 76 77 <category> 78 <pattern>What food do you like?</pattern> 79 <template>Hmm French cuisines, in general.</template> 80 </category> 81 <category> 82 <pattern>What kind of food are you into?</pattern> 83 <template><srai>What food do you like?</srai></template> 84 </category> 85 <category> 86 <pattern>What kind of meal do you like?</pattern> 87 <template><srai>What food do you like?</srai></template> 88 </category> 89 90 91 92</aiml>

また、Pythonによるaimlのファイルの読み込みは以下の通りです:

python

1import aiml 2from telegram_bot import TelegramBot 3 4class Osyaberi: 5 def __init__(self): 6 self.sessiondic={} 7 def initial_message(self, input): 8 sessionId=input['sessionId'] 9 kernel=aiml.Kernel() 10 kernel.learn('osyaberi.xml') 11 self.sessiondic[sessionId]=kernel 12 return {'utt': 'Hi, Kay. Talk for a little while?', 'end': False} 13 def reply(self, input): 14 sessionId=input['sessionId'] 15 utt=input['utt'] 16 response=self.sessiondic[sessionId].respond(utt) 17 return {'utt': response, 'end': False} 18 19if __name__=='__main__': 20 osyaberi=Osyaberi() 21 bot=TelegramBot(osyaberi) 22 bot.run()

試したこと

ターミナル上で上記のファイルを実行した結果、initial_messageの係る部分はOKそうなのですが、replyの方でパースがしっかりできていないようです。エラーはTelegram上で'Hi, Kay. Talk for a little while?'に対し'Hello'と応答した結果です。

###補足情報
環境:MacBook Pro13,macOS 10.15.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

FATAL PARSE ERROR in file osyaberi.xml: osyaberi.xml:1:0: unclosed token

このエラーは osyaberi.xml のパースに失敗したことを意味しています。
具体的なエラーは unclosed token です。
token はXMLのタグだと思えばいいので、タグに対応した閉じタグが無いよという意味になります。

<?xml version="1.0" encoding="UTF-8">

XMLのこの宣言が間違えているのですが、そもそもaimlの場合XMLのこの宣言は要らないです。

投稿2020/09/02 13:52

ELBE

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kay_ventris4

2020/09/02 14:11

ELBE様、ご丁寧にありがとうございました。ご教授によりxmlファイルの1行目を削除した結果、FATAL PARSE ERROR in file osyaberi.xml: osyaberi.xml:1:0: unclosed tokenのエラーは消えました。しかし、それより以下のWARNING: No match found for input: Hello No error handlers are registered, logging exception. ...(中略) telegram.error.BadRequest: Message text is emptyのエラーが引き続き出力されています。可能な範囲で、そちらの方の解決のヒントもお教え頂けると幸いです。よろしくお願いいたします。
ELBE

2020/09/02 14:51

kernel.respond() を実行していないので、Helloという言葉にどう返事したらいいか分からない状態になっています。 kernel.learn() は、入力される言葉に対する返答はこのファイルの中にあるぞ。という宣言です。 kernel.respond() は、learn()で指定したファイル内にある会話のやりとりを学習しろ。という命令です。
ELBE

2020/09/02 14:51

本を参考にされているのであれば、本のどこからにrespond()を使っている箇所があるはずです。
kay_ventris4

2020/09/02 15:13

度々申し訳ございません。 チュートリアルにrespond()の記述はありませんでした。 kernel.respond('osyaberi.xml')を加えたところ、 Loading osyaberi.xml...done (0.01 seconds) WARNING: No match found for input: osyaberi WARNING: No match found for input: xml Loading osyaberi.xml...done (0.00 seconds) WARNING: No match found for input: osyaberi WARNING: No match found for input: xml WARNING: No match found for input: Hello No error handlers are registered, logging exception. (中略) telegram.error.BadRequest: Message text is empty という形でエラーが再び現れました。 調べてもあまりよくわからなかったのですが、.respond()の引数は'osyaberi.xml'ではないのでしょうか?
kay_ventris4

2020/09/02 23:32

承知いたしました。大変勉強になりました。 重ねて、ご丁寧にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問