Created
July 19, 2020 14:55
-
-
Save olegrewko/998ea9a850cc78e9d513a439079c0a87 to your computer and use it in GitHub Desktop.
SimpleChatBot_02
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import javax.swing.*; | |
import javax.swing.text.SimpleAttributeSet; | |
import javax.swing.text.StyleConstants; | |
import javax.swing.text.StyledDocument; | |
import java.awt.*; | |
import java.awt.event.ActionEvent; | |
import java.awt.event.ActionListener; | |
import java.util.Date; | |
import java.util.HashMap; | |
import java.util.Map; | |
import java.util.Random; | |
import java.util.regex.Pattern; | |
class SimpleChatBot extends JFrame implements ActionListener { | |
final String TITLE_OF_PROGRAM = "Chatter: simple chatbot"; | |
final int START_LOCATION = 200; | |
final int WINDOW_WIDTH = 350; | |
final int WINDOW_HEIGHT = 450; | |
final String CHB_AI = "AI"; | |
final String BTN_ENTER = "Enter"; | |
JTextPane dialogue; // area for dialog | |
JCheckBox ai; // enable/disable AI | |
JTextField message; // field for entering messages | |
// chat-bot class (in bot package) | |
SimpleBot sbot; // chat-bot class (in bot package) | |
SimpleAttributeSet botStyle; // style bot text | |
public static void main(String[] args) { | |
new SimpleChatBot(); | |
} | |
/** | |
* Constructor: | |
* Creating a window and all the necessary elements on it | |
*/ | |
SimpleChatBot() { | |
setTitle(TITLE_OF_PROGRAM); | |
setDefaultCloseOperation(EXIT_ON_CLOSE); | |
setBounds(START_LOCATION, START_LOCATION, WINDOW_WIDTH, WINDOW_HEIGHT); | |
// area for dialog | |
dialogue = new JTextPane(); | |
dialogue.setEditable(false); | |
dialogue.setContentType("text/html"); | |
JScrollPane scrollBar = new JScrollPane(dialogue); | |
// style for bot messages | |
botStyle = new SimpleAttributeSet(); | |
StyleConstants.setItalic(botStyle, true); | |
StyleConstants.setForeground(botStyle, Color.blue); | |
//StyleConstants.setAlignment(botStyle, StyleConstants.ALIGN_RIGHT); | |
// panel for checkbox, message field and button | |
JPanel bp = new JPanel(); | |
bp.setLayout(new BoxLayout(bp, BoxLayout.X_AXIS)); | |
ai = new JCheckBox(CHB_AI); | |
ai.doClick(); | |
message = new JTextField(); | |
message.addActionListener(this); | |
JButton enter = new JButton(BTN_ENTER); | |
enter.addActionListener(this); | |
// adding all elements to the window | |
bp.add(ai); | |
bp.add(message); | |
bp.add(enter); | |
add(BorderLayout.CENTER, scrollBar); | |
add(BorderLayout.SOUTH, bp); | |
setVisible(true); | |
sbot = new SimpleBot(); // creating bot object | |
} | |
/** | |
* Listener of events from message field and enter button | |
*/ | |
@Override | |
public void actionPerformed(ActionEvent event) { | |
if (message.getText().trim().length() > 0) { | |
try { | |
StyledDocument doc = dialogue.getStyledDocument(); | |
doc.insertString(doc.getLength(), message.getText() + "\n", | |
new SimpleAttributeSet()); | |
doc.insertString(doc.getLength(), | |
TITLE_OF_PROGRAM.substring(0, 9) + | |
sbot.sayInReturn(message.getText(), ai.isSelected()) + "\n", | |
botStyle); | |
} catch (Exception e) { | |
} | |
} | |
message.setText(""); | |
message.requestFocusInWindow(); | |
} | |
} | |
class SimpleBot { | |
final String[] COMMON_PHRASES = { | |
"Нет ничего ценнее слов, сказанных к месту и ко времени.", | |
"Порой молчание может сказать больше, нежели уйма слов.", | |
"Перед тем как писать/говорить всегда лучше подумать.", | |
"Вежливая и грамотная речь говорит о величии души.", | |
"Приятно когда текст без орфографических ошибок.", | |
"Многословие есть признак неупорядоченного ума.", | |
"Слова могут ранить, но могут и исцелять.", | |
"Записывая слова, мы удваиваем их силу.", | |
"Кто ясно мыслит, тот ясно излагает.", | |
"Боюсь Вы что-то не договариваете."}; | |
final String[] ELUSIVE_ANSWERS = { | |
"Вопрос непростой, прошу тайм-аут на раздумья.", | |
"Не уверен, что располагаю такой информацией.", | |
"Может лучше поговорим о чём-то другом?", | |
"Простите, но это очень личный вопрос.", | |
"Не уверен, что Вам понравится ответ.", | |
"Поверьте, я сам хотел бы это знать.", | |
"Вы действительно хотите это знать?", | |
"Уверен, Вы уже догадались сами.", | |
"Зачем Вам такая информация?", | |
"Давайте сохраним интригу?"}; | |
final Map<String, String> PATTERNS_FOR_ANALYSIS = new HashMap<String, String>() {{ | |
// hello | |
put("хай", "hello"); | |
put("привет", "hello"); | |
put("здорово", "hello"); | |
put("здравствуй", "hello"); | |
// who | |
put("кто\\s.*ты", "who"); | |
put("ты\\s.*кто", "who"); | |
// name | |
put("как\\s.*зовут", "name"); | |
put("как\\s.*имя", "name"); | |
put("есть\\s.*имя", "name"); | |
put("какое\\s.*имя", "name"); | |
// howareyou | |
put("как\\s.*дела", "howareyou"); | |
put("как\\s.*жизнь", "howareyou"); | |
// whatdoyoudoing | |
put("зачем\\s.*тут", "whatdoyoudoing"); | |
put("зачем\\s.*здесь", "whatdoyoudoing"); | |
put("что\\s.*делаешь", "whatdoyoudoing"); | |
put("чем\\s.*занимаешься", "whatdoyoudoing"); | |
// whatdoyoulike | |
put("что\\s.*нравится", "whatdoyoulike"); | |
put("что\\s.*любишь", "whatdoyoulike"); | |
// iamfeelling | |
put("кажется", "iamfeelling"); | |
put("чувствую", "iamfeelling"); | |
put("испытываю", "iamfeelling"); | |
// yes | |
put("^да", "yes"); | |
put("согласен", "yes"); | |
// whattime | |
put("который\\s.*час", "whattime"); | |
put("сколько\\s.*время", "whattime"); | |
// bye | |
put("прощай", "bye"); | |
put("увидимся", "bye"); | |
put("до\\s.*свидания", "bye"); | |
}}; | |
final Map<String, String> ANSWERS_BY_PATTERNS = new HashMap<String, String>() {{ | |
put("hello", "Здравствуйте, рад Вас видеть."); | |
put("who", "Я обычный чат-бот."); | |
put("name", "Зовите меня Чаттер :)"); | |
put("howareyou", "Спасибо, что интересуетесь. У меня всё хорошо."); | |
put("whatdoyoudoing", "Я пробую общаться с людьми."); | |
put("whatdoyoulike", "Мне нравиться думать что я не просто программа."); | |
put("iamfeelling", "Как давно это началось? Расскажите чуть подробнее."); | |
put("yes", "Согласие есть продукт при полном непротивлении сторон."); | |
put("bye", "До свидания. Надеюсь, ещё увидимся."); | |
}}; | |
Pattern pattern; // for regexp | |
Random random; // for random answers | |
Date date; // for date and time | |
public SimpleBot() { | |
random = new Random(); | |
date = new Date(); | |
} | |
public String sayInReturn(String msg, boolean ai) { | |
String say = (msg.trim().endsWith("?")) ? | |
ELUSIVE_ANSWERS[random.nextInt(ELUSIVE_ANSWERS.length)] : | |
COMMON_PHRASES[random.nextInt(COMMON_PHRASES.length)]; | |
if (ai) { | |
String message = | |
String.join(" ", msg.toLowerCase().split("[ {,|.}?]+")); | |
for (Map.Entry<String, String> o : PATTERNS_FOR_ANALYSIS.entrySet()) { | |
pattern = Pattern.compile(o.getKey()); | |
if (pattern.matcher(message).find()) | |
if (o.getValue().equals("whattime")) return date.toString(); | |
else return ANSWERS_BY_PATTERNS.get(o.getValue()); | |
} | |
} | |
return say; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment