はじめに
多くの人々は、プロローグプログラミング言語は、学生を教えるための純粋に科学的で時代遅れの言語だと考えています。 大学の大部分の学生は、人工知能のトピックに少なくともある程度近い科目でこの言語を正確に「緊張」させたが、このトピックも私を迂回しなかった。
私が出会った標準的なタスクは、この言語にとって退屈で広範であったため、「登録なしで既製をダウンロードする」のが魅力的でしたが、このコースを最大限に活用し、プロローグのトピックを実際に意味のある興味深いものに変えることにしました。 prologに関するhabrへの投稿を含む、かなり多くの異なるドキュメントを読んで、私はprologが形式言語の文を処理するための優れたツールであるという結論に達しました。 私は、VKontakteでフレーズに(おそらくうまく)答えることができるボットを書くことはクールだと決めました。
実装
まず、ボットの主な機能、つまり 管理者としてボットを実行するコマンドを送信できるようにするインターフェイス。
現在のコマンドのリスト:
$commands = array('', '', 'up', 'uptime', '', 'last');
実際、各チームはそれ自体を代弁しています。 2つのチームで停止する必要があります。
- listen%text%は、曲のステータスに入れる必要があるものをボットに伝えます。パフォーマーは名前=%text%です。 それはビジネスにはまったく当てはまらず、好奇心became盛になりました。
- 最後-ボットに送信された最後のメッセージを表示します。 そして、それを送信したユーザー。
次のようになります。
これはすべて、着信メッセージの処理の一部として行われました。 さらに、メッセージ処理は管理者からのものではありません。 回答が必要な提案。
これがプロローグの出番です。 より正確には、swi-prolog。その実装は、Windows(そこで開発された)と* nix(現在はそこで動作します)の両方で利用可能です。 また、swi-prologの利点は、それが解釈されることです。 したがって、スクリプトファイルをswiインタープリターにフィードし、結果をキャッチするだけです。 同時に、入力フレーズを覚えておき、結果のフレーズとともに、この束をファイルに書き込みます。 マスクのシートは、入力行の例でより適切に表されます。
, ?
マスクのリストは次のようになります。
['**','*','*','**','*','*','**','*','*','**','*','*']
この場合、これが問題であることを覚えておく必要があります。 これを行うには、述語リクエストでマスクのリストをフレーム化し、ファイルに保存します。 例:
request('?',['**','*','*','**','*','*','**','*','*','**','*','*']).
次に、スクリプトを実行します。アルゴリズムの説明は数行に削減されています。
- 入力ファイルから述語を読み取ります(同じリクエスト)
consult('request.txt')
また、ファイル内のテキストが一連の述語として認識されるようにするには、ヘッダーのどこかに動的な述語の説明を追加する必要があります。
:-dynamic(request/2).
- ナレッジベースを読み、質問と回答のリストと未回答の質問のリストを取得します。
:-dynamic(question/2). :-dynamic(answer/2). :-dynamic(notanswered/1). :-consult('questionanswerlink.txt'). :-consult('withoutanswer.txt').
- 質問/回答を探しています
goal2 :- toFile, consult('request.txt'), request(Type, KeyWords),% twoFindAllByType(Type, KeyWords, ActualByType), % , ( - , , ) KeyWords ( ). str(ActualByType, ActualPhrasesString),% toFile(ActualPhrasesString),fail.%
- 答えが見つからない場合-質問のリストからランダムな質問を取得します(答えがない場合)
noAnswer :- toFile, consult('request.txt'), % request(Type, _), % twoAsk(Type, Res),% str(Res, ActualPhrasesString),write(ActualPhrasesString), % toFile(S),fail.
- 結果を別のファイルに書き込みます(通常、結果はいくつかのフレーズです)
追加機能:
行のリスト
str([], _). % - str([H|[]], S):- % string_concat('', H, S),!. % (H) S ! str([H|_], String) :- % string_concat(H, '', S),% S String = S. % String
データファイルへの保存
toFile(Data) :- open('output.txt', append, OS), toFile(OS, Data). toFile:- open('output.txt', write, OS), close(OS). toFile(OS, Data) :- write(OS,Data), nl(OS), false. toFile(OS, _) :- close(OS).
さて、未回答の質問を取得:
twoAsk('.', Res):- % notanswered(R),Res = [R|Res]. % notanswered("- ") Res.
実際、これがprologスクリプトのすべてです。 残りの作業は非常に簡単です。結果のファイルからランダムな行を取り出してユーザーに提供すると同時に、BZファイルに質問と回答を書き込みます。 また、ボットが質問をしたが、回答がなかった場合、この質問は回答のない質問のデータベースに記録されます。
結果
これはおそらく記事の中で最も予想される部分です。 このバージョンのボットが3日間で作成されたという事実を考慮しても、フレーズを出力するアルゴリズムを考慮して、会話のコンテキストに応じて(場合によっては)フレーズが生成される場合があります。 しかし、彼はユニークで/あまり使用されていないフレーズの存在下で、特に正確に答えます(これは理解できます)。
ボットアルゴリズム、特に「スマート」にすべき部分は非常に曲がっています。 ちなみに、ボットを少し訓練するために、私は不便に行かなければなりませんでした。 たとえば、ボットに代わって、女の子が自分で売ったり、写真を撮って写真を売ったりするグループで数回書いた。 これは機能し、予想どおり、性別による分布:男性の98%、残りの2%。 しかし、これはいくつかの負の効果をもたらしました。 ボットは、男性と女性の両方の代わりに書き込みを開始しました。 これはユーザーを混乱させ、その結果、ナレッジベースには「性別」、「あなた」、「これ」などの単語を含む多くの質問が含まれます。 しかし、これらの不便さを考慮しても、人々は高速応答(特に慣れ親しんだフレーズの場合は0.5秒-1秒)、メッセージのリプレイ、場違いの応答を見なくても、ボットと通信し続けました。 一部の人々は、それが自然でなくても、単にコミュニケーションを必要とします。
そして最近では、彼らも私たちを認識し始めました:
ボットは、空を見て非常に長い間考えることができる哲学的なフレーズを出しました:
かどうか
ただし、絶対的なナンセンススキップが行われることもあります。
それでも、フォローするのは楽しいです:
時間内に修正:
最も興味深いのは:
ボットアカウントに加えて、同時に最も面白いダイアログのスクリーンショットを送信する公開ページを作成しました。ほとんどのダイアログは、Googleの「ボット女性vk」で厳密に+18と書くことで読むことができます。 彼らはすでに約150tiを蓄積しています。 ちなみに、プロローグの達人がこの記事を読んだら、彼らは私にいくつかのレッスンを教えてくれるかもしれません。例えば、誰かが興味を持っているなら、もちろん一緒に働いてより賢い仕事のアルゴリズムを作成できます。
残念ながら、現在のアルゴリズムでは、ボットが10人のクライアント(非常に難しい)でさえもサービスを提供できません。処理プロセスが数分間中断され、多数の入力マスクを持つ大きなナレッジベースをソートします。 したがって、ボット自体へのリンクは、LAN内の数人にのみ与えることができます。
ここまで読んでくれてありがとう。