From dd793f0adf38b61a016747bdd6ecd9b6ed9a0cae Mon Sep 17 00:00:00 2001 From: Neil Date: Sat, 16 Mar 2024 21:42:34 +0530 Subject: [PATCH] Add files via upload --- README.md | 67 ++++++------ __init__.py | 8 ++ baker/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 130 bytes baker/__pycache__/bparser.cpython-312.pyc | Bin 0 -> 6420 bytes baker/__pycache__/chatbot.cpython-312.pyc | Bin 0 -> 1107 bytes baker/__pycache__/trainer.cpython-312.pyc | Bin 0 -> 4442 bytes baker/bparser.py | 97 ++++++++++++++++++ baker/chatbot.py | 8 +- demo.py | 74 +++++++++++++ setup.py | 2 +- test.py | 16 +++ tests/__init__.py | 0 tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 130 bytes .../__pycache__/test_chatbot.cpython-312.pyc | Bin 0 -> 1420 bytes .../test_functions.cpython-312.pyc | Bin 0 -> 2087 bytes .../test_loop_trainer.cpython-312.pyc | Bin 0 -> 828 bytes tests/__pycache__/test_parser.cpython-312.pyc | Bin 0 -> 910 bytes .../__pycache__/test_trainer.cpython-312.pyc | Bin 0 -> 1178 bytes tests/data-empty.json | 3 + tests/data.json | 14 +++ tests/test_chatbot.py | 18 ++++ tests/test_functions.py | 26 +++++ tests/test_loop_trainer.py | 10 ++ tests/test_parser.py | 13 +++ tests/test_trainer.py | 16 +++ 25 files changed, 333 insertions(+), 39 deletions(-) create mode 100644 __init__.py create mode 100644 baker/__pycache__/__init__.cpython-312.pyc create mode 100644 baker/__pycache__/bparser.cpython-312.pyc create mode 100644 baker/__pycache__/chatbot.cpython-312.pyc create mode 100644 baker/__pycache__/trainer.cpython-312.pyc create mode 100644 baker/bparser.py create mode 100644 demo.py create mode 100644 test.py create mode 100644 tests/__init__.py create mode 100644 tests/__pycache__/__init__.cpython-312.pyc create mode 100644 tests/__pycache__/test_chatbot.cpython-312.pyc create mode 100644 tests/__pycache__/test_functions.cpython-312.pyc create mode 100644 tests/__pycache__/test_loop_trainer.cpython-312.pyc create mode 100644 tests/__pycache__/test_parser.cpython-312.pyc create mode 100644 tests/__pycache__/test_trainer.cpython-312.pyc create mode 100644 tests/data-empty.json create mode 100644 tests/data.json create mode 100644 tests/test_chatbot.py create mode 100644 tests/test_functions.py create mode 100644 tests/test_loop_trainer.py create mode 100644 tests/test_parser.py create mode 100644 tests/test_trainer.py diff --git a/README.md b/README.md index aa4a017..c86f2c6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # Baker -[![Downloads](https://static.pepy.tech/badge/baker-python)](https://pepy.tech/project/baker-python) - *Bot-Maker* Baker! Is a framework to create chatbots with Python in the easiest and simplest route, train your chatbot by texting or adding data in XML, JSON or YAML files. # Installation @@ -72,9 +70,11 @@ The files can also be empty for example a JSON file can be like this: To train the chatbot, use the `Trainer` class. Here is an example of basic training: ```py -from baker import trainer +import baker.trainer +import baker.bparser +import baker.chatbot -bot = trainer.Trainer('database.yaml') +bot = baker.trainer.Trainer('data.json') user_input = input("You: ") response = bot.get_response(user_input) @@ -91,7 +91,9 @@ from this route the keyword (user's question) must be already created in the fil But with this way to train you can train the chatbot as long you want to with custom keywords (no need to define them in the data file) and their infinite responses: ```py -trainer = Trainer("database.json") +import baker.trainer + +trainer = baker.trainer.Trainer('data.json') trainer.loop_training() ``` @@ -102,7 +104,7 @@ The data file can either be empty or it can have keywords, pre-defined keyowrds To parse the chatbot to run and test it use the `Parser` class: ```py -from baker import parser +import baker.bparser def test_chatbot(bot): while True: @@ -113,7 +115,7 @@ def test_chatbot(bot): response = bot.get_response(user_input) print("Bot:", response) -bot = parser.Parser('database.json') +bot = baker.bparser.Parser('data.json') test_chatbot(bot) ``` @@ -121,14 +123,14 @@ test_chatbot(bot) The above code will run the chatbot, but there is anther simpler way to run the chatbot with it's specified name which is to use the `Chatbot` class: ```py -from baker import trainer -from baker import parser -from baker import chatbot - -trainer = trainer.Trainer('database.json') -parser = parser.Parser('database.json') -my_chatbot = chatbot.Chatbot("MyChatbot") -my_chatbot.interactive_session(trainer, parser) +import baker.trainer +import baker.bparser +import baker.chatbot + +trainer = baker.trainer.Trainer('data.json') +parser = baker.bparser.Parser('data.json') +my_chatbot = baker.chatbot.Chatbot("MyChatbot") +my_chatbot.session(trainer, parser) ``` `Parser` class has more functions regarding the data file: @@ -136,40 +138,37 @@ my_chatbot.interactive_session(trainer, parser) - Exporting responses : ```py -response_file_name = "responses.json" -Parser = Parser(response_file_name) -parser.export_responses("exported_responses.xml") +import baker.bparser + +response_file_name = "data.json" +parser_instance = baker.bparser.Parser(response_file_name) +parser_instance.export_responses(export_file_name="data2.json") ``` - Reset resposes ```py -parser.reset_responses("A_User_Question") +baker.bparser.Parser.reset_responses("A_User_Question") ``` - Removing responses: ```py -user_input = "What is the weather like?" -response_to_remove = "I'm not sure." -parser.remove_response(user_input, response_to_remove) -``` +parser_instance2 = baker.bparser.Parser("data.json") -- List questions: - -```py -key_questions = parser.list_questions() -print("List of Key Questions:") -for question in key_questions: - print(question) +user_input = "Hello" +response_to_remove = "Heyy" +parser_instance2.remove_response(user_input, response_to_remove) ``` - Count responses: ```py -user_input = "Tell me a joke" -response_count = parser.count_responses(user_input) -print(f"Number of Responses for '{user_input}': {response_count}") +parser_instance3 = baker.bparser.Parser("data.json") +user_input = "Hello" + +count = parser_instance3.count_responses(user_input) +print(f"Number of Responses for '{user_input}': {count}") ``` -Keep training your chatbot by texting or adding words in the database and then run it! +Keep training your chatbot by texting or adding words in the database and then run it! \ No newline at end of file diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..c80a814 --- /dev/null +++ b/__init__.py @@ -0,0 +1,8 @@ +from baker import bparser +from baker import chatbot +from baker import trainer +from tests import test_chatbot +from tests import test_functions +from tests import test_loop_trainer +from tests import test_parser +from tests import test_trainer \ No newline at end of file diff --git a/baker/__pycache__/__init__.cpython-312.pyc b/baker/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08d4473be5589230017209c02ea8ad5252f3e94f GIT binary patch literal 130 zcmX@j%ge<81RJ)0O$E`9K?FMZ%mNgd&QQsq$>_I|p@<2{`wUX^OVQOTCZMt;BR?<3 zDKR^>C?*L^#>Z#oWtPOp>lIY~;;_lhPbtkwwJTx;>R<%oVi4maGb1Bo5i^hl016Nt AJ^%m! literal 0 HcmV?d00001 diff --git a/baker/__pycache__/bparser.cpython-312.pyc b/baker/__pycache__/bparser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1704397f7d4ee5afa79ea05f9ac705891ce423eb GIT binary patch literal 6420 zcmc&(Ur-yz8Q(kI=^v6127?J0gdxTPtT>4sVhpwuApVm^c4J~Yj1xuS&NhmW$lhTL zBhpMK4{pbuK>Gkp+CusgdF+|wp%3m%XX>WyOlJBbq1vbyW}0d9k~asZ<0()5zCE2z zl2v7rmoB64cE8>IcK6$FfBSvQU)^pefh7F?-|}fMA^*aHk%V04!AZz05{XD$l#J?M zZj@tXew1fl%czBYg$Z$t=g5S0)W#8>93v9{9+50Jd0p11eTMT3Utu9Qrn7X)tD(?rwZ7Vb!LWk}r4`7#B-_}1O}OsKHtt++>`6EF zBu74e{l@E=#{O%<&pZ#H2`SQ%6&OrM|AaLz5)~V;6v?mD;1CiK&AgFIaE5j+K#w_o z&Z64PI*BtZ;sBWw60pN>?IDELs}7@0gxRH0(!UA8kU1yDehR%T*h>*1C*=COjUEw? zku$$V{UgvzWWCO*HAb7rHX~<#&0dl1CfCT_%w^`R<77@uSck}KJ+NL|!WOAF+L+%t zd%`wE-gk`gmq6dI!5rrt2}fjy*}}*z@YlTpnR7zDGa)AI{ZMf|Adr|xZ8F+O)`aB) z@+;oZ%8&6(!k?jAjwHl0Fb)U5Ima|g@lsrsn zocgOMngc}((zuZ3VW$L!kz>j@4uEBfwxbD5i~y6E&@6AsGnzPdc|0m<;uVypR6!e` znWziJ;xU=so;y3mhZXCUO(5@*jpmk>W6Q_Zn|spDJ;_%y&An-R<2CNu;SG1qynpFT z#@%+GxE-gs)sbxV&eevs>OC9HzLgWpCsw5oPAxdHHLa_?Yc*ZT*d6Oy;03G;E(eqQ zGtK+-%4gPU{2L98i&qz}t_r_+XT4!>x?yjo;fZ-6+uSnm$Ts^niKV7{ekl7`%gUbR zJ@bRv0|)Ol_a%pyURfFaU^La-H$My{`*_#^uIm=^#4~J=|W%+frI!*&jc5Xt2ZbX;-cbm|Mcl+=alA*xx}O0}TKjUa~UyXfJ?|?;_cD%U&S)7RYljdCO|8 zF}X;cku$%N)6fV2XW3at8qC&4&VVU^rvXBkF2y-(!ANBwC?O<714;nU5ZZPEVA&J) zZ|P@~s*HZ2JRo0h70C4?0x9U*Y|PI5nqbR-5$~>&1hDOr+_yXhy7Q=QMkA>@!B>XF znMYu7#sEPtfZ#O6%it^YeQt1?bv!1?F_q%AKyh1M0OmGHz8Id0s-cU~_;g57X8?O} zqjUhW8&~<3IHg|P`|QXKUbD-wvA8rIyQEbEn1&>IEE=X^6`+gamEy0Vcvn!|H;Nm< zfQ~j|?lB;mAWcn7GVv63M)727w&AEe0h7~21Up4@o|$?x$D+HiK~=6aLSS)@5q8>-G8%ZY;KM>8TV5Q9swQ}Za{E3)a_rDeG#UDcU&dEXEIB)HU`e6hIdQ>LiwyBwePsd1l@Rf7|X8c5@`foGiZ#UAJM+}w96Y(o@p`lV#BYhf(f~(3KX0_hb z)MtH8pCx>_c!_cnNU=(j$8QUN@chnmXEy!p%juq%%b4orzqxvWz3ysFyISwM+U|>F z?-?#t)v4>e&&+$8SujLb)WVdrwwrH2rs7h4mk^4fRcXq@G|DMSg)nUZ zwZ3j<_hr@%z*B%6=DJJxFTy~|ULeKm&icCx!M50V9Uh{)y5WlC&~6( zjsnRTD>!qpLdB;G@WXTGpT!DgqLWHb8YQuUIZ~O2jS8_s<$gBFW$ZyHKfipeVD?3j zC`l!;0>mbz31S7eU;>x#EDG{{E<^jVaRj~-@FKo4TE56K}UyO5xpM)C3~ z^!_!kKAidBnCF=9Dpdt-%=myFMp^mbfF6Nj+1S7s!ib2J*@oOrkdvFQKqOaogF@jR z0N=ZJxp%#(JKfZs>gmrk4crc=n~uUW#h31y)V5u#gBkZ83=Ph6$rrQL_^49dwNd2v zci#@*^B&FCw5^_7tLaJYJ9_7ZwS6Z`+I;r-J@093b9Sw!8{b|2U$McVPZ~b!z}Vo_ zmlzuiriMmRgRi98&SvV*rM%}JLU3@N1qbIj3=Yn7TMC|(kB9i7KFgo`#9@mq=y&5Y zFuogyLYgxanutqN@ctaqTp_rK!%@A4Vo<@JyL5cV>xrUALSI7iLnI?e&LX)0syqYaJ+jI3;=rceD>iO+c*RrPW``)YYsjkl(=qTzU-hx}jryt8IrUIRGz$vK%OiVHr!eXN)M>T<9B^LtmXua?9SY wul+C`10J4Hb^+hFa2)qJsrsC_KPL{z{DbUDkzEgkQI0#$ZNmQ>;KRiH7e37v)&Kwi literal 0 HcmV?d00001 diff --git a/baker/__pycache__/chatbot.cpython-312.pyc b/baker/__pycache__/chatbot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d379dc40bea0b8d2aae33a6f08295bffcd4e6b0f GIT binary patch literal 1107 zcmZ8g%}*0S6o0cj+Ye}IMX>ZBT_XV&lb(!+YBWKO;GtqP8XJTbfXS_|e@IpW z_{A52U>|g^GO!5-7^n<|-X9etv6d^ifDuS=4-9Dy40)SH;ZjiQNW;H5%$K+h1o@yl z!oVgFC?Eq^G_(cmf4SCoq zR){8f*dgT?G{kls&QsMB^=@u{uI?_{*8FsFnb7$Kp-a6?*=pU3=(=f{uC6zde*SD= z5rLvC&?>ZtM%MAWXqPRZ#Onz}VL;UPje$*YgJ#+2ny_@X6Q8lg#`Zzp_WckDU?sZ3%j&vT5LB| zEmDX5`)W+HQ{%));O+1!s$6J9u>6`DiQrg$1D}iYoT*jlMB*F$tverQ-_N$L?~Fg# z8JOFTJZujPcG9D*m95eB`|U*fAd%TkWcCu5K0W!7xY9`u?_3z)PfoOx!|l|?gVfY+ zYU*=tFLiBwrV~52G2WWok6k{BL*hK;4=vC7Wmk+}P+j->biHC5wKB&sU4K<8mU}yt zS4D@J`T~L{nxOna3dNgqVoa^Uv4oU#HxyCEdXC&j3waVHUR>PnY%niHECcI;KfSOI vdco5?120r0Jc-=s)pwI-n2ldXhrik*86k8C(L)&e37Nk*hQ^M8DZ%^)H)8&@ literal 0 HcmV?d00001 diff --git a/baker/__pycache__/trainer.cpython-312.pyc b/baker/__pycache__/trainer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2ff22e8e2231c8ad177042dba7f2c3304ab1b27f GIT binary patch literal 4442 zcmbVPZ%iA>6`x)2+G}Gw=06SwmOvm5;HFA)6he~bfaJKlI;SSrYfvth<6VM%#`euF z0V6w&PWg~lRA<@`fYKID{cw&FwW-t({g}I|pZW#jOYm)wdQz)O_l=NLY5COm)?OPp znyMYcn>TOXdo%NP<~MKt>~Po!l&W9gsag)1`8-vnl!NJL_yWVBE-qm15W zM_Ii#O>iNWArt(lnJH*kMlCEkM*9{fP2m#^wnEiBBJNNPeL5RQe_ zKw!pIT&~ZM2;f6$0dkY%-Cei2S!dqewC3(!b$4ek{`Sh?VTZSJSe=b%D%1j!5n zJxG6tMa~ly74#A*E!B_^65-3d!KD}@JeR>D&8AJNrQ9bm5_{ituNdm%B+aEv68FI& zLTH_8HS{9-E;L$&I>i}&(|qhFV8x@A!UJb6+B*!3h|}Q8^$z<8SXp$d_tZ*5CsJi_ z<+^MYsVz$l?p~2eo5Li{r_4j-{cc#ZC1r`!89L=UEu<_%lPm#h($kMIP-&p2BQN%0q890vZ= z)+y3PzD*Qn3fh+l1HT_Z@3iR>nPR+FzsArleo`Il`Hq*-1UVLpOX1kHE#4PV;xVX_ z!HMV==S%8z8mRl-m@=72#HlJvBJN#rEKVnaYQN}pYHVE5IQ<9+N+KFou{0*2IrY;6!^kluj00es;&#$F-3#$QKo3V<9Owo;*X zbc?5Frp`E1J5MnxC@+BABg?E=m?~JZ^`ZL2o@&^xRMixRp^FOnI`U@MWZ(V5{_`{Wzfwxy$zn81? zuekg#8*!!^9^!JZ2o3+*w34P1FKf5Uwv=XA`0vh~80;{8-d#P|Dtvyr0r)?*@<==Q z!6TNC0o|ZUFpxT!{2rj-{{j;dK|tD7j4iJN43lQdzyWx@hrYxZhXMe{lwu`TKl*Jd zeto?}@U!kJ;A<}!F-fNToB?1AiG2zF3@BoYP}H^!RQ?ywmixjs&-cNzRiEjiT5U`& zQe$xCTCy1t0XW@r){*+Mw!s`BT$dqOhfBQGb`=0~yX3g<+!i~h+G;3C`%>(yfin3G za7-G|=mKb*q8R2o798)QN2a0#XSrAr9@>p;(ss_fQ@u`5KCINo%1}I>V zVBGQ)@0yEVmf}sL?E@eUNOC9|q(K#6i{eM}R#J>RbtBo21VN4>>{ASm#z~VC3EeNn z(?~@WT85+Y1k6g~5$F`nc46{rQAFEOp`zHjNM%{$rzoh=gV5o%6_B(8c-n~sE>%Lk zNVpFJdt`(L&@d!PD8jSXR5%yr zU;>f?i30qf47ZeKn^a^9d2M1+)$B2Os=S?Wg|Op_TTRb{OP%Gdwo{JJ2jvV9$b&0t z7iyN87n@frI`ekd$NnGt7y4K29c%WUReMi1`q+NrtHZBln{N-5y7Gd3O=w&d8XpTy z6z_r^nKI&m9(4(rS4RDSih6p9pw+JOs&8Td`vn3oCDuRFKGHcM#^S1|Oj21Kk57qe zTr9wggseIqRDGrR(qK%APiW@Qcsv}E0e3LO^t(WcuZ%)4?T~GiLs?@aKHH_eXoIM* zGmz`m?)j5*CzoqJZT_VBfo-+*M6P;Z#Xj&=bzdQ1+p~dEz%t-xo><|hmipn2F7jz6 z#n7g0J*6#}W+7CiP=b?Ufep_Zw+lmNyV{6a3UfQ5PKK19An^Dsj)RGCl1v#$&-rJL z495T##h?gzqWB?XhltAJp*R&25Mo6fRB5zp5W_4_hgEOCI8$X<7zhutNc1TK1lHe8whB&Kwu&+O~Ok!pxFbkmSD8dLlMdJ1Y1A#dO+w|l)Vk)E_^KH zF=wLq33Y-OpwbHD7TIK3{^X|M;@z9=F8(~T+0OILn@*1Je{L7}&Vn@>daZ?P6t7JE zp44jLw)MfQLY93y?m}He`%q6rGK54Q`yJ#;^Vt#x3QIagFF*%wB7IU25{7w7tWQY= Y{QZR-SRn_V630vK6a)7J5Z%SU0fX(mMF0Q* literal 0 HcmV?d00001 diff --git a/baker/bparser.py b/baker/bparser.py new file mode 100644 index 0000000..7b935ac --- /dev/null +++ b/baker/bparser.py @@ -0,0 +1,97 @@ +import json +import random +import os +import yaml +import xml.etree.ElementTree as ET + +class Parser: + def __init__(self, response_file_name): + self.file_path = response_file_name + self.responses = self.load_responses(self.file_path) + + def load_responses(self, file_path): + _, file_extension = os.path.splitext(file_path) + with open(file_path, 'r') as file: + if file_extension == '.json': + responses = json.load(file) + elif file_extension == '.yaml' or file_extension == '.yml': + responses = yaml.safe_load(file) + elif file_extension == '.xml': + root = ET.parse(file).getroot() + responses = {} + for item in root: + key = item.tag + value = [child.text for child in item] + responses[key] = value + else: + raise ValueError(f"Unsupported file format: {file_extension}") + return responses + + def save_responses(self): + _, file_extension = os.path.splitext(self.file_path) + with open(self.file_path, 'w') as file: + if file_extension == '.json': + json.dump(self.responses, file, indent=4) + elif file_extension == '.yaml' or file_extension == '.yml': + yaml.dump(self.responses, file, default_flow_style=False) + elif file_extension == '.xml': + root = ET.Element('responses') + for key, values in self.responses.items(): + item = ET.SubElement(root, key) + for value in values: + ET.SubElement(item, 'response').text = value + tree = ET.ElementTree(root) + tree.write(file, encoding="utf-8", xml_declaration=True) + else: + raise ValueError(f"Unsupported file format: {file_extension}") + + def train_response(self, user_input, new_response): + if user_input in self.responses: + self.responses[user_input].append(new_response) + else: + self.responses[user_input] = [new_response] + self.save_responses() + + def get_response(self, user_input): + if user_input in self.responses: + return random.choice(self.responses[user_input]) + else: + return "I'm not sure how to respond to that." + + def remove_response(self, user_input, response): + if user_input in self.responses and response in self.responses[user_input]: + self.responses[user_input].remove(response) + self.save_responses() + + def list_key_questions(self): + return list(self.responses.keys()) + + def count_responses(self, user_input): + if user_input in self.responses: + return len(self.responses[user_input]) + else: + return 0 + + def reset_responses(self, user_input): + if user_input in self.responses: + self.responses[user_input] = [] + self.save_responses() + + def export_responses(self, export_file_name): + export_extension = os.path.splitext(export_file_name)[1] + + with open(export_file_name, 'w') as export_file: + if export_extension == '.json': + json.dump(self.responses, export_file, indent=4) + elif export_extension == '.yaml' or export_extension == '.yml': + yaml.dump(self.responses, export_file, default_flow_style=False) + elif export_extension == '.xml': + root = ET.Element('responses') + for key, values in self.responses.items(): + item = ET.SubElement(root, key) + for value in values: + ET.SubElement(item, 'response').text = value + tree = ET.ElementTree(root) + tree.write(export_file, encoding="utf-8", xml_declaration=True) + else: + raise ValueError(f"Unsupported export file format: {export_extension}") \ No newline at end of file diff --git a/baker/chatbot.py b/baker/chatbot.py index 1160cf1..64ffb4c 100644 --- a/baker/chatbot.py +++ b/baker/chatbot.py @@ -1,6 +1,6 @@ import re -from parser import Parser -from trainer import Trainer +import baker.trainer +import baker.bparser as bparser class Chatbot: def __init__(self, name): @@ -13,5 +13,5 @@ def session(self, trainer, parser): if user_input.lower() == "exit": print("Session ended.") break - response = parser.get_response(user_input) - print("Bot:", response) \ No newline at end of file + response = parser.get_response(user_input) # Corrected line + print("Bot:", response) diff --git a/demo.py b/demo.py new file mode 100644 index 0000000..5ac0d3e --- /dev/null +++ b/demo.py @@ -0,0 +1,74 @@ +#test-chatbot.py + +import baker.trainer +import baker.bparser +import baker.chatbot + +trainer = baker.trainer.Trainer('data.json') +parser = baker.bparser.Parser('data.json') +my_chatbot = baker.chatbot.Chatbot("MyChatbot") +my_chatbot.session(trainer, parser) + +#test-functions.py + +import baker.bparser + +response_file_name = "data.json" +parser_instance = baker.bparser.Parser(response_file_name) +parser_instance.export_responses(export_file_name="data2.json") + +baker.bparser.Parser.reset_responses("A_User_Question") + + +parser_instance2 = baker.bparser.Parser("data.json") + +user_input = "Hello" +response_to_remove = "Heyy" +parser_instance2.remove_response(user_input, response_to_remove) + +parser_instance3 = baker.bparser.Parser("data.json") +user_input = "Hello" + +count = parser_instance3.count_responses(user_input) +print(f"Number of Responses for '{user_input}': {count}") + +#test-loop-trainer.py + +import baker.trainer + +trainer = baker.trainer.Trainer('data.json') +trainer.loop_training() + +#test-parser.py + +import baker.bparser + +def test_chatbot(bot): + while True: + user_input = input("You: ") + if user_input.lower() == "exit": + print("Testing session ended.") + break + response = bot.get_response(user_input) + print("Bot:", response) + +bot = baker.bparser.Parser('data.json') + +test_chatbot(bot) + +#test-trainer.py + +import baker.trainer +import baker.bparser +import baker.chatbot + +bot = baker.trainer.Trainer('data.json') + +user_input = input("You: ") +response = bot.get_response(user_input) +print("Bot:", response) + +# Train the bot with a new response +new_response = input("New response: ") +bot.train_response(user_input, new_response) +print("Bot has been trained with the new response!") \ No newline at end of file diff --git a/setup.py b/setup.py index d5f8f29..1c91835 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ setup( name='baker-python', - version='1.1', + version='2.0', packages=['baker'], url='https://github.com/enginestein/Baker', license='GPL-3.0-only', diff --git a/test.py b/test.py new file mode 100644 index 0000000..618f9ee --- /dev/null +++ b/test.py @@ -0,0 +1,16 @@ +import unittest + +import tests.test_chatbot +import tests.test_functions +import tests.test_loop_trainer +import tests.test_parser +import tests.test_trainer + +if __name__ == "__main__": + test_suite = unittest.TestSuite() + test_suite.addTest(unittest.makeSuite(tests.test_chatbot.TestChatbot)) + #test_suite.addTest(unittest.makeSuite(tests.test_functions.TestFunctions)) + #test_suite.addTest(unittest.makeSuite(tests.test_loop_trainer.TestLoopTrainer)) + #test_suite.addTest(unittest.makeSuite(tests.test_parser.TestParser)) + #test_suite.addTest(unittest.makeSuite(tests.test_trainer.TestTrainer)) + unittest.TextTestRunner().run(test_suite) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/__pycache__/__init__.cpython-312.pyc b/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29312d22e9d8e98e84873b76924071c64b49f67a GIT binary patch literal 130 zcmX@j%ge<81TH(irh@3lAOanHW&w&!XQ*V*Wb|9fP{ah}eFmxdrRZuE6Hr-_k)Idi zl$f1b6jPE~Tv8kpAD@|*SrQ+wS5Wzj!zMRBr8Fniu80+=gAs^}L5z>gjEsy$%s>_Z D-{&0x literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_chatbot.cpython-312.pyc b/tests/__pycache__/test_chatbot.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80d5bb9878df1049a3af92f0a536a88489bd1a4b GIT binary patch literal 1420 zcmah|&r91-9Dn)ICXMYzignt}u^|KX7AXxPv+wf}>MH+C)t3uO;yisi4rY z9_=YR)-ll0>yG;mcIwKgJa?Oy-GsV}r@fctnKA}G!ux){zrXMM{pMRNCIED}uYc4% z8h~GzAt&U6UJU^UC_teKAnQ>oOSwFqWn9YoG?Zm%FbfpA1{6l6^e71y&=%w2ET{4c zyDSv zwk}(_vXv+1*b6@p7t{NQqzt)NO0Wc9LEf}xzep&F303|T8-utY$vA{!=>gcm)^<-M(eoSzADrfQm6xs(n= z)>I2?P%!g`Rap85$_;b zBI&F)R=bJGc4G4IVJC5~E*$akE}v}k$q&=b=^y-L4^MF+%|g_BJPg!(L6VAPWz(HQ zRFd9q$^}nj+(5RUfia4Rf!Dxb$%TI)6JIsZqa&dy&jzb;;368IB&7udTR?uZq*=Hd zFy_uTwj7IOKzKK0p9NxH%U{KjP|Hym8jFCnP{0Ey)&~?gC z6m<+D$KdKQ81%j~R-mT#Cc5#lc6{s%Am(%!u+jR~cV^^>6?a~|pWmH-_wtkhY|_o} E7wls)ivR!s literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_functions.cpython-312.pyc b/tests/__pycache__/test_functions.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e43419c49248230bddecbf83519874493e473bc GIT binary patch literal 2087 zcmb_c&1)M+6rb4-d7?;2No?XsHWhW(j>H24^dM{dk}_2(XOc!d8O{G zN@XN)!KKbAy_rBEJ(ac&CCB~`y+}1iVv<`=y%{UL_|*4ST75-sE*;o6Z+70t%`>yrK4#P7#znVi1ECNv1o~j3kjYVn{p0kWEtXc}|0QAL8N2 zD5h#C58{N_=OqHRf$sldx!+q*Ql(X@sej`-of|fxy+!9OQ1&2Bh8iRz8FYtaWIRVk zF=UXC3#6~AYCaLXXL9GGij{NnC5z|05Euy$hhL`v0xn1E)B&wK3X-P{=7I;u;1{XU z{a(zvRFeu*Lt8!7keh5aX`YH$31H<*Jy$4ZU|jF9Y9N7(qBO(FlR#2@u<) zJs)qd$cxAuPnI7qw<3vVB+*FTJc!)d4Yk?D7K=Ao{P(2>iyyMJ4njDYv(I5?kGzI2 z1^q|IM27kty8K9K5xS{=22kstR^ZA|IGSQJh-05YfzL&R007g``!HzK#-ip}3^6-| zCetnyV|H6_PJnC71{3foh;8zM1s??;23u^d$>v&YsmYca%hwOt4f`DIk3fT$b<5cT z<+adEC}pD$L!BB@T{7glT%(f!t4TF^zxP0TC2iyL7i!8Z7E3}&nbqn<%r;A3nSIc} z0x=WevC_OO{1rq$Zw+&o4m1w%KgAHh+#ZuC5)j)T;y_0xkhRf%1P4a2ohtHvxJ` z0ZVdhIA^^dHQDL6T8}W#+a*p;yTsWS!9$yRrO0!oiZxW^!k^_pjC0Sfn8KguUM~@H z-f~W3^NNk7EL1nvMCQh_Ok{4%<^qJ|H$eO+bKzJkywVJ>Jc}HJS9jGm3p@%v4E^B$ z@#@osgW1F(OS&wkwJE`Lx83Tx@ay_!$*4g8)kQ$pzpP}7*obxA4nsbB2E{yzMG(Ib zH-h`%ZLCUHpu#VK*dfP~tfuI(pQ<0wW1pgaOgjNZUFmwE9cJFl<}F>vQ&g2nf#PNrWf u7wF3Osn+yjb9(V5fyL3gL<#I}{V88+E9bUT-`)A<&bOZ&$wY~`f&T?e0^SV( literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_loop_trainer.cpython-312.pyc b/tests/__pycache__/test_loop_trainer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d261bca297d82c4ff1df19c9d5727a23e32aa02 GIT binary patch literal 828 zcmZWn&ubGw6n-0@056sNDW0N8%G8@DZ-LZHPrjGkWrIG*d*8etU%of9U(4kppnX35<1+^Eiw>C; zQZNq?jKBkr1>hu+Ih?~&@c0ls&4>1tY$%UoEy0fN7d-voHh{D^U~eh!$BQ!^1=r`X* zH-Z>_Vr`zGJhrpd^As*WPWj%lH>_d$LLkmZn=#Js1wLaSVv^BMA6RUQ*^4+?7Vw{-7S{B_WP_Zje+Yz4aH6WejqKoSr!X5p6kyIp>9H(nDDy?%)dw zVH?Wqg{_$Ms`BCn>*)nb`r?#Hn>}_TKjFPbIh|(ZD#HA4FU<#uz=v`j3-plDJ#;gT zF?J4>bGUw?YpnWlf4Wwitko_653?fZrIW!o?Z%nDdi?Ce_Pg!(FJ>C(Hy6Zz0i^1< A_5c6? literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_parser.cpython-312.pyc b/tests/__pycache__/test_parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fed84371b3834c0845867f2b4f2a8662b11f9e1f GIT binary patch literal 910 zcmZ`%&2JJ>5TCanupm&VB(}Xsh$eCnk0#pmpfP$WHqnFGki0DHnwBn5-&+olHo*jA zJ=q&quMK~Sr)o^=_UOqQaq-fVGrO$F!AaiCy!rmkd!Mt}G$1*rznz;5;0Ik|(&tLx zqA~^>Z03R)NoFbvJOx`Bfvq~wO2kPEIZ-3s)EwQ`_U{0QRRu6Mvxtec$y{O3XMI-D zf6~3yjNK%0x{!iZ6l1JoG8;_AW+O1wzEV;B^h-y2JC=}+XvWc$LUYgwULivqm~q5B z)FWysv9^${82iG6SSRzUM~MB99sa%J)KF1tOHC>9I-Wp7Hl_epJ4NQJjjkuDQ0eN{ zlLz&kzPH=$)E`;+E^7IzJnNugzk5DaL5pVn1ByDtWB>pF literal 0 HcmV?d00001 diff --git a/tests/__pycache__/test_trainer.cpython-312.pyc b/tests/__pycache__/test_trainer.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f80e16a92442a9f46ca5233f3f4144f6003538da GIT binary patch literal 1178 zcmaJ=%}*0S6rb4-JCtpSEuRg>CPhOJRu3e`#u$Ydze4rEK^x*`VF#tOyRf?rX|p7l zU@Rv{JixJ6(u@Cx7i%$X25x%sMpC@s#hLC-my_@C-f!Ofz2Cl>+4&lYgaNgcqd)jB z1mGuIaFcz|EmCj*bfCi`$a@jy1pzz(y08Ou5re`N-W0@!=;6GCWnEgE2Ed95fO3_9 z!%@Qr5L93Vrsdykom=K*7U^_7>&9p}pgMV|gS?=_9gr6*LRut)3)prREN#`m)-tEF z9yS~sraMlv2f$&uo)rX+f>_|&4pMaE4PS2yIw4-rg??6WVPSyhgXjhf(FKLUpu&+W zat#PBDfhEm5><|Hb`V{`l^Xu^5K!%*pvIBQdjC6Bpilv6DOVlPHAl-7Y}2U9Z_IKw zS&ioKX41m;x@p)rn@l4jFKKJoA|b~+XcF>IoXD%jdf6e$JM5^ugA8f5jVBpVl3h`3}rBwVI#s;7whYKnn3`>i&+s3fzC8;`S#uPV-a(^#Bk z(=9smPq2Gl_2ZRi6%-M zX6x=TnxVwK$Zll6Sf6W8%`~TGzT{g|4}YLXU3PW3v_z1q8d?dfDhaD<$<)h5h80!a zC~HNpVhvO75wJ#Ru;R=~+%aGy>UKa^K=Lf~NG#2iOZ0`PYC1$v*;sYh&Pk+qsTu#Q zEcRdsV&^lb(R=6#kFuP^daVfxgYRCT``&~Ptn0ME9*TXBx-$_%cmjq_!0@>=0B7O; obUT)6#!}~it