Code Monkey home page Code Monkey logo

chatscript's Introduction

Status

The former repository of ChatScript was at https://github.com/bwilcox-1234/ChatScript, however, I lost access to this repository (2 factor authentication lost that I didn't want in the first place and I could not convince github to restore my access). So it is no longer maintained. But the global user ChatScript became available, and is a better name anyway.

ChatScript

Natural Language tool/dialog manager

ChatScript is the next generation chatbot engine that has won the Loebner's 4 times and is the basis for natural language company for a variety of tech startups.

ChatScript is a rule-based engine, where rules are created by humans writers in program scripts through a process called dialog flow scripting. These use a scripting metalanguage (simply called a "script") as their source code. Here what a ChatScript script file looks like:

#
# file: food.top
#
topic: ~food []

#! I like spinach
s: ( I like spinach ) Are you a fan of the Popeye cartoons?
	
	a: ( ~yes )  I used to watch him as a child. Did you lust after Olive Oyl?
    	    b: ( ~no ) Me neither. She was too skinny.
    	    b: ( yes ) You probably like skinny models.
	
	a: ( ~no ) What cartoons do you watch?
     		b: ( none ) You lead a deprived life.
     		b: ( Mickey Mouse ) The Disney icon.

#! I often eat chicken
u: ( ![ not never rarely ] I * ~ingest * ~meat ) You eat meat.

#! I really love chicken
u: ( !~negativeWords I * ~like * ~meat ) You like meat.

#! do you eat bacon?
?: ( do you eat _ [ ham eggs bacon] ) I eat '_0

#! do you like eggs or sushi?
?: ( do you like _* or _* ) I don't like '_0 so I guess that means I prefer '_1.

#! I adore kiwi.
s: ( ~like ~fruit ![~animal _bear] )  Vegan, you too...

#! do you eat steak?
?: ( do you eat _~meat ) No, I hate _0.

#! I eat fish.
s: ( I eat _*1 > ) 
  $food = '_0 
  I eat oysters.

Above example mentioned in article How to build your first chatbot using ChatScript.

Basic Features

  • Powerful pattern matching aimed at detecting meaning.
  • Simple rule layout combined with C-style general scripting.
  • Built-in WordNet dictionary for ontology and spell-checking.
  • Extensive extensible ontology of nouns, verbs, adjectives, adverbs.
  • Data as fact triples enables inferencing and supports JSON representation.
  • Rules can examine and alter engine and script behavior.
  • Remembers user interactions across conversations.
  • Document mode allows you to scan documents for content.
  • Ability to control local machines via popen/tcpopen/jsonopen.
  • Ability to read structured JSON data from websites.
  • Built in english pos-tagging and parsing
  • Postgres and Mongo databases support for big data or large-user-volume chatbots.

OS Features

  • Runs on Windows or Linux or Mac or iOS or Android
  • Fast server performance supports a thousand simultaneous users.
  • Multiple bots can cohabit on the same server.

Support Features

  • Mature technology in use by various parties around the world.
  • Integrated tools to support maintaining and testing large systems.
  • UTF8 support allows scripts written in any language
  • User support forum on chatbots.org
  • Issues or bugs on this repo

Getting started

Installation

Take this project and put it into some directory on your machine (typically we call the directory ChatScript, but you can name it whatever). That takes care of installation.

git clone https://github.com/ChatScript/ChatScript

Standalone mode - run locally on a console (for developement/test)

From your ChatScript home directory, go to the BINARIES directory:

cd BINARIES

And run the ChatScript engine

Windows

ChatScript

Linux

./LinuxChatScript64 local

Note: to set the file executable: chmod a+x ./LinuxChatScript64

MacOS

./MacChatScript local

This will cause ChatScript to load and ask you for a username. Enter whatever you want. You are then talking to the default demo bot Harry.

Server Mode (for production)

From your ChatScript home directory, go to the BINARIES directory and run the ChatScript engine as server

Run the server on Windows

ChatScript port=1024

Run the server on Linux

./LinuxChatScript64

Run the server on MacOS

./MacChatScript

This will cause ChatScript to load as a server.
But you also need a client (to test client-server communication). You can run a separate command window and go to the BINARIES directory and type

Run a client (test) on Windows

ChatScript client=localhost:1024 

Run a client (test) on Linux

./LinuxChatScript64 client=localhost:1024

Run a client (test) on MacOS

./MacChatScript client=localhost:1024

This will cause ChatScript to load as a client and you can talk to the server.

How to build a bot

Run ChatScript locally. From the ChatScript command prompt, type

:build Harry

or whatever other preinstalled bot exists. If you have revised basic data, you can first:

:build 0

How to compile the engine.

On windows if you have Visual Studio installed, launch VS2010/chatscript.sln or VS2015/chatscript.sln and do a build. The result will go in the BINARIES directory.

On Linux, go stand in the SRC directory and type make server (assuming you have make and g++ installed). This creates BINARIES/ChatScript, which can run as a server or locally. There are other make choices for installing PostGres or Mongo.

Docker image

Building the base Docker image

The Dockerfile in this repository provides a ChatScript server with no bots. To build and run it, run the following commands:

docker build -t chatscript .
docker run -it -p 1024:1024 chatscript

Note: You will probably want to replace the image tag chatscript with a more meaningful one for your purposes.

Building a Docker image containing bot data

Adding bot data to the base image above is as simple as writing a Dockerfile like the following one, which builds the Harry bot:

FROM chatscript

# Copy raw data needed for Harry
COPY ./RAWDATA/filesHarry.txt
COPY ./RAWDATA/HARRY /opt/ChatScript/RAWDATA/HARRY
COPY ./RAWDATA/QUIBBLE /opt/ChatScript/RAWDATA/QUIBBLE

# Build Harry
RUN /opt/ChatScript/BINARIES/LinuxChatScript64 local build1=filesHarry.txt

This Dockerfile can then be built and run in the same manner as the base chatscript image:

docker build -t chatscript-harry .
docker run -it chatscript-harry local

Full Documentation

ChatScript Wiki (user guides, tutorials, papers)

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

Last releases

changes.md

Author

chatscript's People

Contributors

andyhe-kore avatar chatscript avatar chatscriptnlp avatar claussa avatar ianbyrne avatar jordanqw avatar leamsi9 avatar maclenx avatar maffoobristol avatar rohanliston avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chatscript's Issues

^setcanon does not seem to be working

I'm trying to use a custom POS Tagger with ChatScript.

I am using the german bot for that, and replaced the ~xPOSTAGSENTENCE topic as such:

topic: ~xPOSTAGSENTENCE system()
t: (_* )
t: ( ) 
        ^setcanon(1 foo)
        ^settag(2 ~bar)

Then I build the bot and run :prepare a b c d.
The output I get is:

[...]

1: a (raw):
   +a(1-1)
       +~determinerlist(1-1)
       +~vowels(1-1)
       +~letters(1-1)
 //
1: A (canonical):    +A^(1-1)
 //    +~determiner(1-1)
       +~internal_concepts(1-1)
       +~determiner_bits(1-1)
         +~pos(1-1)
   +~kindergarten(1-1)


2: b (raw):
   +B^(2-2)
       +~letters(2-2)
 //
2: B (canonical):

   +~bar(2-2)
   +~noun(2-2)
       +~internal_concepts(2-2)
       +~pos(2-2)
   +~noun_proper_singular(2-2)
       +~singular(2-2)
       +~normal_noun_bits(2-2)
       +~noun_bits(2-2)
   +~noun_phrase(1-2)
[...]

As you can see the tag ~bar is set as expected on the second word, but the canonical form of the first is not set to foo.

Note that this only works the first time after a build, if I run again another :prepare neither the tag nor the canonical form are set, the topic does not seem to be run at all (I tried logging to a file and it only works once).

I reproduced the issue on Mac and Linux on the latest version (10.61).

Raspberry Pi OS Binary or Make Assistance

I have been "raising a robot" for a couple years now. In progressing toward a dialog-driven-learning triple-store knowledge base (using RDF/OWL and IEEE Robot Ontology), I would like to try out ChatScript on my bot.

The bot runs 32-bit Raspberry Pi OS (Linux Carl 5.4.72-v7+ #1356 SMP Thu Oct 22 13:56:54 BST 2020 armv7l GNU/Linux) on a Raspberry Pi 3B (1.2GHz ARM-Cortex A53 with 1GB RAM).

Is it possible to have someone generate the appropriate -arch "armvl7" or provide assistance with a makefile?

(Note: Raspberry Pi OS runs as 32-bit on Pi 2 and 3, and either 32-bit or 64-bit on Pi 4 - I need a 32-bit armvl7 executable.)

Attempting to make server gives fatal error:

json.cpp:522:10: fatal error: curl/curl.h: No such file or directory
 #include <curl/curl.h>
          ^~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:203: json.o] Error 1 

The folder and file do exist:

pi@Carl:~/Carl/Examples/Chatbots/ChatScript/ChatScript/SRC $ ls curl
curlbuild.h  curl.exe  curl.h  curlrules.h  curlver.h  easy.h  libcurld.dll  libcurld.lib  libcurl.dll  libcurl.exp  libcurl.lib  libssh2.x64.lib  mprintf.h  multi.h  zlib.x64.lib 

But since I don’t see any “-arch armv7” in the command and the "x64" libs being linked, I didn’t actually expect this to succeed.

Can't store a topic name as the object part of a fact

I'm trying to store a topic name inside a fact, but there seems to be a bug that prevents a fact from being created when the object field contains a valid topic name. It works if I store it in either the subject or verb field, or use a nonexistent topic name.

Consider the following table definition:

table: test_table(^topicName.KEEP_QUOTES)
createfact(^topicName test topic)    # Create a fact with ^topicName as the subject
createfact(test ^topicName topic)    # Create a fact with ^topicName as the verb
createfact(test topic ^topicName)    # Create a fact with ^topicName as the object
DATA:
~nonexistent_topic
~introductions

Then, if I :build and run :facts topic, I get this:

> :facts topic
216021: ( ~nonexistent_topic test topic x100000 )
216023: ( test topic ~nonexistent_topic x100000 )
216022: ( test ~nonexistent_topic topic x100000 )
216024: ( ~introductions test topic x100000 )
216025: ( test ~introductions topic x100000 )

There should be (test topic ~introductions), but the fact never gets created. ~nonexistent_topic can be stored in any slot, but ~introductions (an actual topic) only works as a subject or object.

I also tried putting the topic name in quotes, e.g. ^"~introductions", which does result in the fact being created ((test topic "^:~introductions")), but I can't seem to get queries to work when stored like that.

As a workaround, I'm currently storing the topic names without the tilde ~ and adding it back after retrieval.

Discrepancy between Linux and Windows in the loading of files for building bots

Version 8.31

Building a bot on Windows with the following structure works and is necessary to load files in subfolders
RAWDATA/BOTNAME/
RAWDATA/BOTNAME/SUBFOLDER1/
RAWDATA/BOTNAME/SUBFOLDER2/

Building the same bot on Linux throws errors because the first line already loads all subfolders, so the subsequent lines cause the subfolders to be compiled twice.

Result: All macros and topics contained in sub-folders are compiled twice on Linux. If the build file is changed to include only the parent folder, the subfolders no longer build on Windows.

Build from sources fail on 11.3 and master

Under linux, issuing make server from the SRC folder fails because cpp files are missing when on tag 11.3 and on branch master.

Maybe the build method have changed without updating the instructions ?

Concepts and set hierarchy are empty

I’m coming back to ChatScript after a bit of a break, so please forgive me if this is a dumb question. As I’m building a bot, I usually use the :concepts <word> command to find concepts that I could use to match user inputs. When I try that now on a new bot I’ve built, though, it doesn’t work. If I type :concepts eat, I get the following output:

eat: 
Botname: 

I can get output with :down ~eat, so I know the concept is there, but I just can’t find it with :concepts. Additionally, if I type :up eat, the Set hierarchy is empty.

I tried running :build 0 and it compiles with no errors, but doesn’t change the output. What am I missing? I’m on ChatScript 9.8

error or am I missing anything?

Tried on my Raspberry Pi (32Bit) running Raspbian stretch and a Laptop (64Bit) running Ubuntu 16.04, I haven't changed any source files and on both devices make server terminates with these errors,

************ LINUX VERSION ************
g++ -c -std=c++11 -Wall -funsigned-char -Wno-write-strings -Wno-char-subscripts -Wno-strict-aliasing -DLOCKUSERFILE=1 -DEVSERVER=1 -DEVSERVER_FORK=1 -DDISCARDPOSTGRES=1 -DDISCARDMONGO=1 -DDISCARDMYSQL=1 -Ievserver json.cpp -o json.o
json.cpp: In function ‘bool ConvertUnicode(char*)’:
json.cpp:189:7: warning: unused variable ‘len’ [-Wunused-variable]
int len = 0;
^
json.cpp: At global scope:
json.cpp:476:21: error: ‘CURL’ was not declared in this scope
static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
^
json.cpp:476:27: error: ‘handle’ was not declared in this scope
static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
^
json.cpp:476:35: error: ‘curl_infotype’ was not declared in this scope
static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
^
json.cpp:476:55: error: expected primary-expression before ‘char’
static int my_trace(CURL *handle, curl_infotype type, char data, size_t size, void userp)
^
json.cpp:476:74: error: expected primary-expression before ‘size’
static int my_trace(CURL handle, curl_infotype type, char data, size_t size, void userp)
^
json.cpp:476:80: error: expected primary-expression before ‘void’
static int my_trace(CURL handle, curl_infotype type, char data, size_t size, void userp)
^
json.cpp:476:91: error: expression list treated as compound expression in initializer [-fpermissive]
static int my_trace(CURL handle, curl_infotype type, char data, size_t size, void userp)
^
json.cpp:477:1: error: expected ‘,’ or ‘;’ before ‘{’ token
{
^
json.cpp:23:13: warning: ‘curl_done_init’ defined but not used [-Wunused-variable]
static bool curl_done_init = false;
^
json.cpp:37:14: warning: ‘curlBufferBase’ defined but not used [-Wunused-variable]
static char
curlBufferBase = NULL;
^
json.cpp:39:23: warning: ‘FunctionResult JSONpath(char
, char
, char
, bool, bool)’ declared ‘static’ but never defined [-Wunused-function]
static FunctionResult JSONpath(char
buffer, char
path, char
jsonstructure,bool raw,bool nofail);
^
json.cpp:40:16: warning: ‘MEANING jcopy(WORDP)’ declared ‘static’ but never defined [-Wunused-function]
static MEANING jcopy(WORDP D);
^
json.cpp:50:12: warning: ‘int JSONArgs()’ defined but not used [-Wunused-function]
static int JSONArgs()
^
json.cpp:371:13: warning: ‘void dump(const char
, FILE
, unsigned char
, size_t)’ defined but not used [-Wunused-function]
static void dump(const char text, FILE stream, unsigned char ptr, size_t size) // libcurl callback when verbose is on
^
json.cpp:452:12: warning: ‘int EncodingValue(char
, char
, int)’ defined but not used [-Wunused-function]
static int EncodingValue(char
name, char
field, int value)
^
json.cpp:476:12: warning: ‘my_trace’ defined but not used [-Wunused-variable]
static int my_trace(CURL *handle, curl_infotype type, char *data, size_t size, void *userp)
^
Makefile:166: recipe for target 'json.o' failed
make: *** [json.o] Error 1

Websockets +communication over Json-only

We implemented Chatscript succesfully where communication ran through passing strings with a "[oob] message" like structure. Now we wanted to unify the communication between all apps using 1. one websocket server with multiple clients (where chatscript is one of) and 2. json objects as the communication format.

Almost everything works fine except the following two issues:

  1. Is it possible to pass commands like :build or :reset via a json object? So the Json message looks like this:
    [{text: "some message", from: "app", to:"cs"}]
    While we can communicate with parsing the json and passing only the text content to analyze, system commands do not work (properly). I was able to start some build process using ^command(:build 0), but cs crashed afterwards. So i dont know, if i implemented this properly or if this is possible at all? Usually we start every conversation using a custom :build command following a :reset command.

  2. Is it possible to prevent cs of outputting a response? So we managed to convert the response inside a json object and giving it back to the ws like this : [{text: "some response", from: "cs", to:"app"}]. My problem is, i cannot output only the json object, but cs is giving the response any way like this: some message [{text: "some message", from: "app", to:"cs"}]. I read somewhere in the manual, that cs needs something before the json to give a response, but dont know if it is the same in this context? Would be nice, if one could return only the json-object.

CI / CD Pipeline running :verify

Hi,

I'd like to create a CI Pipeline which runs all tests for my ChatScript bot.

How can I start a local instance of chatscript and request it to :verify?

I tried but /opt/ChatScript/BINARIES/LinuxChatScript64 local debug=":verify" but it didn't work as expected.

Build bot from file outside of pwd

Instead of needing to name one's main file fileSomething.txt to run :build Something, it would be nice if we could put the file anywhere and call it with

:build /path/to/some/folder/project.txt

Using ^argument( n ) crashes Chatscript on Windows

Problem:
The macro ^argument causes the local Windows Chatscript process to crash on versions 9.31 and 9.62 (only tested those). It used to work on versions 8.?? when I initially wrote the macro that used this, but only noticed recently as I hadn't had a use for that macro in over a year.

Repro steps:

  • Download CS 9.62 release
  • Define a new macro that calls ^argument( n ) in Harry's topic files (e.g. childhood.top)
  • Add a call to that macro (e.g. on the first gambit)
  • Run Chatscript on Windows, and build Harry
  • Trigger the rule that calls that macro
  • Process crashes

Example first lines of childhood.top for this test

outputmacro: ^testmacro variable ( $_arg1 )
{
    $_argValue = ^argument( 1 )
    ^log( OUTPUT_ECHO $_argValue )
}

TOPIC: ~childhood (child childhood kid little memory young younger history "run away")
#!x  This topic is a sample of a simple topic, with good indentation style.
#!x  It is well commented with annotations for :abstract and :verify.

t: Did you run away from home when you were little? ^testmacro( abc )

    #! sure
    a: ( ~yes ) Was it fun? 

    #! never
    a: ( ~no ) You should try it some time. Travel broadens the mind. 

[question] Communicating with server without sockets

Hello everyone! The main example on server/client usage is based on PHP, and the messages are exchanged through sockets.

I'm experimenting with chatscript on a Django server, and using sockets does not feel very natural in Django. Is there any other way of exchanging messages with the master server, on the same machine, apart from using TCP sockets? Maybe by using internal pipes, or websockets, etc.

Thank you very much!

^eval() a variable containing the name of another variable doesn't work

The System Functions Manual indicates that I should be able to use ^eval()to get the value of a variable whose name I have built using ^join(), but this doesn't appear to work. When I print the result of the evaluation, I just get the variable name, not its value.

Relevant code:

$nox = 1
$$tmp = join($ no x)
$$val = eval($$tmp) # $$val = 1

When I execute the above and output $$val, it prints $nox instead of 1.

Tested on latest ChatScript version (10.0) as well as some older ones (9.0, 8.1). Using Ubuntu.

Can't :build stockpile

Thanks for ChatScript, very powerful.

":build stockpile" crashes on Windows 10 and Windows 7 at "Reading plan ^ferryoneload." Also, VS2017 build fails because STDTRACELOG is undefined. That is easily fixed.

Any help is appreciated.

skeleton.top does not exist

The ChatScript-Basic-User-Manual refers to a "RAWDATA/skeleton.top" file, but that file does not exist anywhere in the repo. This line in the doc should probably be removed, I guess?

new install fails

I've just downloaded chatscript both with a git clone and the .zip (after removing the git repo). For some reason, I can't make ChatScript work.

So, when I run ./BINARIES/LinuxChatScript64:

BINARIES/LinuxChatScript64 local
CommandLine: [...]/ChatScript
    local

ChatScript EVSERVER Version 10.7 pid: 10870 64 bit LINUX compiled Oct 21 2020 08:03:29 host=local
Params:   dict:2097151 fact:800000 text:100000kb hash:215127 
          buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000 loglimit:80000
WordNet: dict=201047  fact=86305  heap=11276512 Oct18'20-16:42:14
TOPIC 0 raw format read
Build0:  dict=0  fact=0  heap=120 Compiled: by version  ""
Failed to find set ~restrictive_adverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~modifyabletimenoun - POS tagger incomplete because build 0 not yet done.
Failed to find set ~timeadjmodifier - POS tagger incomplete because build 0 not yet done.
[...]
Failed to find set ~quotableverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~negative_adverb_starter - POS tagger incomplete because build 0 not yet done.
TOPIC 1 raw format read
Build1:  dict=0  fact=0  heap=120 Compiled: by version  ""
Used 44MB: dict 201,048 (17692kb) hashdepths 3567.14470.29280.38756.39640.31260.21420.12256.5958.2830.1045.360.117.28.45.16. words 201048 unusedbuckets 935 fact 86,305 (4142kb) heap 11401kb
           buffer (6400kb) cache (5000kb)
Free 122MB: dict 1,896,102 fact 713,695 stack/heap 88,598KB 


System created in 198 ms

Enter user name: myname

No such bot.

   >

So, apparently, I still need to build the bot, so let's try:

   >:build 0
ChatScript Version 10.7  compiled Oct 21 2020 08:03:29
No such directory No such file or directory

>>Reading folder RAWDATA/ONTOLOGY/

----Reading file internalconcepts.top   
Reading concept ~internal_concepts

<<end folder RAWDATA/ONTOLOGY

>>Reading folder RAWDATA/ONTOLOGY/ENGLISH//

----Reading file adjectivehierarchy.top   
Reading concept ~timeadjmodifier
Reading concept ~pretimeadjmodifier
Reading concept ~color_adjectives
[...]
Reading concept ~blowing
Reading concept ~interrogate
Reading table ^tbl:usable

----Reading file tools.tbl   
Reading table ^tbl:tool

----Reading file videogames.tbl   
Reading table ^tbl:videogames

<<end folder RAWDATA/WORLDDATA

WARNING SUMMARY: 
  line 432 of concepts.top: last character of keyword f*** is punctuation. Is this intended?
  line 435 of concepts.top: last character of keyword f*** is punctuation. Is this intended?
  line 460 of concepts.top: Word jews only known in upper case
  line 1804 of concepts.top: last character of keyword Google+ is punctuation. Is this intended?
4 serious warnings, 0 function warnings, 0 spelling warnings, 25 case warnings, 0 substitution warnings
    

Finished compile

ChatScript EVSERVER Version 10.7 pid: 10870 64 bit LINUX compiled Oct 21 2020 08:03:29 host=local
Params:   dict:2097151 fact:800000 text:100000kb hash:50000 
          buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000 loglimit:80000
WordNet: dict=201047  fact=86305  heap=11276512 Oct18'20-16:42:14
TOPIC 0 raw format read
Build0:  dict=68806  fact=129153  heap=1157668 Compiled:Oct21'20-20:53:10 by version 10.7 "0"
Failed to find set ~restrictive_adverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~restrictive_adverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~quotableverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~quotableverbs - POS tagger incomplete because build 0 not yet done.
TOPIC 1 raw format read
Build1:  dict=0  fact=0  heap=120 Compiled: by version  ""
Used 58MB: dict 269,854 (23747kb) hashdepths 1219.6790.17853.31664.43035.46518.41916.32120.21807.13250.7392.3420.1807.616.300.112.17.18. words 269854 unusedbuckets 240 fact 215,458 (10341kb) heap 12558kb
           buffer (6400kb) cache (5000kb)
Free 115MB: dict 1,827,296 fact 584,542 stack/heap 87,441KB 


System created in 649 ms

   >
No such bot.

Apparently, some things still failed because build 0 is not done yet? Not sure what that means. So well, let's continue:

  >:build Harry
ChatScript Version 10.7  compiled Oct 21 2020 08:03:29
No such directory No such file or directory

>>Reading folder RAWDATA/HARRY/

----Reading file childhood.top   
Reading topic ~childhood

   in childhood.top at 6: t: Did you run away from home when you were little? 
    Error opening utf8writeappend file VERIFY/childhood-b1.txt: No such file or directory
*** Error- line 6 col 2 of childhood.top: 
   in childhood.top at 6: t: Did you run away from home when you were little? 
    
Execution error (see LOGS/bugs.txt) - try again.
 ERROR SUMMARY: 
  Execution error (see LOGS/bugs.txt) - try again. - line 6 col 2 of childhood.top 


1 errors - press Enter to quit. Then fix and try again.

So well... it doesn't seem to work. Some file is not there?

What am I missing here?

Port Chatscript to Android?

Hello,
Title says it all :)

Is it possible or done already?
Background is, that we want to use it on-prem/offline for our Android Solution without cloud access.

Best

Using jsonopen to consume ASP.NET API fails due to invalid header.

The header by default contains "Accept-Encoding: Accept-Encoding:identit" and ASP.NET is really strict, so it returns a 400 error. I changed the line that contains
if (!*coding) strcpy(coding,(char*)"Accept-Encoding: identity");
to
if (!*coding) strcpy(coding,(char*)"identity,");
and that seems to have done the trick. The comma is at the end because the next line strips the last character.
Can you confirm that this is a good fix?

Error Build Windows VS2017

Hi, I trying build a new version of Chat Script Add a Module Database in ElasticSearch Library.... I Receive errors in javascript.obj ducktape.c file not found....

not is possible others peoples build this project???

Server displaying only one word,

This happened when I was trying to rebuild Bianca.

Sent 8 bytes of data to port 1024 - Sarah|
Pets?

This is for the following script:

t: Am I suppose to know you?
a: (Sarah) Hey I remember you!
a: Can't say I know you.

t: Do you have any pets?
a: (dog) Dogs like chasing after their tail.
a: (cat) Cats often climb up to high places.
a: (hamster) Hamsters, larger than gerbils. Still easy to crawl under a lawn mower.
a: (gerbil) Small like a rat, but more fur.
a: (pig) Oink! Oink! Oink! Not registering, who keeps a pig?

t: How about hobbies?
a: (drawing) I like drawing as well.
a: (writing) I like writing as well.
a: (programming) I like programming as well.

t: Do you have a job?
a: (lawnmowing) Lawn mowing is such unessessary work!
a: (fast food) Very easy to get fat in that line of work.

:quit

Segmentation Fault on Build 0 on Mac and Raspberry Pi (v11.1)

I have compiled version 11.1

  • on Raspberry Pi OS for armvl7 (Raspberry Pi 3B)
  • and for MacOS Big Sur v 11.0.1 on a Mac mini(2018) Intel Core i7 processor.

Both versions seg fault on a >:build 0 command
>:build 0 0 ChatScript Version 11.1 compiled Mar 2 2021 08:33:13

Back Trace when run in gdb:
`
user7: > :build 0
0 ChatScript Version 11.1 compiled Mar 2 2021 12:37:54

Program received signal SIGSEGV, Segmentation fault.
0x0017d388 in BugBacktrace (out=0x8a5a58) at os.cpp:1732
1732 if (frame->rule) strncpy(rule,frame->rule,50);
(gdb) where
#0 0x0017d388 in BugBacktrace (out=0x8a5a58) at os.cpp:1732
#1 0x0017f090 in BugLog (name=0x7eff0568 "LOGS/bugs.txt", folder=0x885fcc "LOGS", bug=0x8a5a58, located=0x7efef9b0 "") at os.cpp:2153
#2 0x0017fb90 in Log (channel=10, fmt=0x26e2d8 "No such directory %s\r\n") at os.cpp:2330
#3 0x0017b98c in getdir (dir="VERIFY", files=std::vector of length 0, capacity 0) at os.cpp:1203
#4 0x0017bc18 in WalkDirectory (directory=0x26f6b8 "VERIFY", function=0x1b5e80 <EmptyVerify(char*, uint64)>, flags=0, recursive=false) at os.cpp:1307
#5 0x001b6690 in ReadTopicFiles (name=0x7eff6ec0 "files0.txt", build=1048576, spell=1) at scriptCompile.cpp:7084
#6 0x001e2ddc in C_Build (input=0x7582700b "") at testing.cpp:4651
#7 0x001e9c2c in Command (input=0x75e9200f "0", buffer=0x8f4048 "", scripted=false) at testing.cpp:6334
#8 0x00201b58 in DoCommand (input=0x75e92008 ":build 0", output=0x8f4048 "", authorize=true) at testing.cpp:11576
#9 0x002500dc in ProcessInput (input=0x75e42008 ":build 0") at mainSystem.cpp:2662
#10 0x0024f6ac in PerformChat (user=0x75328c "user7", usee=0x752ea4 "test", incoming=0x75e6a009 ":build 0", ip=0x281df0 "", output=0x8f4048 "")
at mainSystem.cpp:2480
#11 0x0024c3ac in ProcessInputFile () at mainSystem.cpp:1667
#12 0x0024c870 in MainLoop () at mainSystem.cpp:1734
#13 0x00255048 in main (argc=2, argv=0x7efff4e4) at mainSystem.cpp:3694
(gdb)
`
OK - reason is directory VERIFY missing, created that folder and ":build 0" succeeds.

^pos(aux) doesn't work for all pronouns

^pos(aux) works for he, she, I, you, and it, but doesn't work for they or we.

user: > :do ^pos(aux do she)
bot:  Does
user: > :do ^pos(aux do he)
bot:  Does
user: > :do ^pos(aux do I)
bot:  Do
user: > :do ^pos(aux do you)
bot:  Do
user: > :do ^pos(aux do they)
bot:  Does
user: > :do ^pos(aux do we)
bot:  Does
user: > :do ^pos(aux have they)
bot:  Has
user: > :do ^pos(aux have we)
bot:  Has
user: > :do ^pos(aux be they)
bot:  Is
user: > :do ^pos(aux be we)
bot:  Is

I'm also wondering if it's possible to extend this to include more words than just have/be/do? For instance, given a pronoun like you, they, or we, there doesn't appear to be a way to get the right form of verbs like seem, e.g. you seem, they seem, he seems, she seems.

Random segfaults

======== Began EV server pid 699978 11.6 compiled: Nov 20 2021 16:00:07 on host: local port: 1024 at Tue Mar 01 18:02:13 2022 serverlog:0 userlog: 0
FATAL: Linux Signal code 11
myexit called with FATAL: Linux Signal code 11

crash exit

I have not figured out how to reproduce this error but it happens about one in three times I start Chatscript. Sometimes I can run for dozens of vollys, sometime it segfauts after only one.

table-tennis_racquet part of sets ~mammals ~weapon_medieval ~strongbadness ~verbal_disagree ~animate_thing ~rideable ~eatable ~animals_generic ~animal_kingdoms

:concepts table-tennis_racquet
table-tennis_racquet: ~holdable ~hitting_weapon ~mammals ~weapon_medieval ~strongbadness ~entirety_words ~goodness ~verbal_disagree ~nounroot ~weapon ~beings ~animals ~badness ~artifacts ~tool ~animate_thing ~rideable ~eatable ~burnable ~animals_generic ~animal_kingdoms ~objects ~human_data ~functions ~nounlist

Update doc for ^spell() system function

The doc for ^spell gives the function signature as

^spell(am*ic @1) will find American

The source code specifies

//- locates up to 100 words in dictionary matching pattern and stores them as facts in @0

I have verified that this is the case.

Interestingly

you can do an assignment to a fact set and it will contain the last item returned.

:do @12 = ^spell(step*) ^length(@12) ^writefactset(@12 )
returns
1 ( 1 word steppes x1000010 )

whereas
:do ^spell(step*) ^length(@0) ^writefactset(@0 )
returns
29 ( 1 word step x1000010 )\r\n( 1 word step-down x1000010 )\r\n( 1 word stepper x1000010 )\r\n( 1 word stepsister x1000010 )\r\n( 1 word stepbrother x1000010 )\r\n( 1 word step-up x1000010 )\r\n( 1 word stepwise x1000010 )\r\n( 1 word step-in x1000010 )\r\n( 1 word stepladder x1000010 )\r\n( 1 word stephanion x1000010 )\r\n( 1 word stephead x1000010 )\r\n( 1 word steppe x1000010 )\r\n( 1 word stepchild x1000010 )\r\n( 1 word stepchildren x1000010 )\r\n( 1 word stepdaughter x1000010 )\r\n( 1 word stepfather x1000010 )\r\n( 1 word stepmother x1000010 )\r\n( 1 word stepparent x1000010 )\r\n( 1 word stepson x1000010 )\r\n( 1 word stephanotis x1000010 )\r\n( 1 word steprelationship x1000010 )\r\n( 1 word step-daughter x1000010 )\r\n( 1 word step-son x1000010 )\r\n( 1 word step-child x1000010 )\r\n( 1 word step-brother x1000010 )\r\n( 1 word step-mother x1000010 )\r\n( 1 word step-by-step x1000010 )\r\n( 1 word stepped-on x1000010 )\r\n( 1 word steppes x1000010 )\r\n

How to change bots on a standalone ChatScript without losing data

I have multiple bots that are built using one files.txt

i.e

bot: botOne
RAWDATA/BOTONE/
bot: botTwo
RAWDATA/BOTTWO/
bot: botThree
RAWDATA/BOTTHREE/

When I want to change the bot to another, for example from botOne to botTwo I use :bot botTwo command.
The problem is that the bot is reset and is repeating the topics that have been done before.
Is there a way to keep the memory of the bots so that it won't repeat the gambits even after changing to another bot?

Official Docker Hub repository

With Docker build support now merged in (#36), it would be great to have an official ChatScript repository on Docker Hub.

This could be set up to automatically build a new image each time this repo is tagged, which would mean that the effort to release new versions would remain the same as it is currently.

I can help with this if required; let us know and I will get in touch directly.

^jsonwrite does not print the field names

using the code:

$_tmp = ^jsoncreate(object)
$_tmp.name = "Todd Kuebler"
$_tmp.phone = "555-1212"
^jsonwrite( $_tmp )

the output is:
{"": "Todd Kuebler", "": "555-1212"}

Expected output:
{"name": "Todd Kuebler", "phone": "555-1212"}

The same is true using the code:
$_jsonObject = ^jsoncreate(object)
ˆjsonobjectinsert( $_jsonObject name “Todd Kuebler” )
ˆjsonobjectinsert( $_jsonObject phone “555-1212” )
ˆjsonwrite ( $_jsonObject ) \n

Feature request: Extend ^counttopic to support querying gambits and responders in isolation

I am building a bot for educational purposes and need to measure how many responders the user has hit within a given topic, in order to know when the user has explored a topic to a satisfactory extent.

I've created a function to do this, but it currently requires three calls to ^counttopic and is a bit clunky:

outputmacro: ^respondersUsed(^topic)
	$$_rulesUsed = ^counttopic(^topic used)
	$$_gambitsUsed = ^compute(^counttopic(^topic gambit) - ^counttopic(^topic available))
	^compute($$_rulesUsed - $$_gambitsUsed)

Would it be feasible to extend ^counttopic to allow us to choose whether we want to count gambits, responders, or both? For backwards compatibility reasons, I guess we would be limited to adding more options for the what argument, but in case you're interested in an alternative API:

^counttopic(topic what kind), where:

  • topic is the topic name
  • what is one of gambit, responder or rule (gambits + responders)
  • kind is one of available, used, or total.

Found a solution, but need help.

Did someone previously mention how to autobuild a chatbot at after ./linuxchatscript?

I'm currently experimenting with creating a simple Ruby decisiontree, and have that decide which seperate chatscript to run based on prior established training examples:

training = [
  [1.0, "pets"], [2.0, "hobbies"],
  [3.0, "jobs"], [4.0, "skills"],
  [5.0, "weather"], [6.0, "likes"],
  [7.0, "dislikes"],
]

Each one would go to different chatscript. Eacb of these would be a different chatscript. I have a copy of the source code, if there is any confusion.

I guess I'm wondering is if you do something like: ./linuxchatscript build Millie or if it's something a little more specific? In this case it's using Ruby as a back-end, not a front-end.

pets, hobbies, and so on would be a different chatbot with the same chatbot name, so you only have a small chatscript per personality component to edit, rather than 50,000 words.

Building bot prior to running LinuxChatScript64

Is there a way build the chatbot prior to executing LinuxChatScript64? I'm thinking in the case of wanting to using external scripts like Ruby, Python, C++ or whatever, where the back end is some other language than the chatbot.

Otherwise, you're pretty much building it after you type in your name.

It's one of the reason I implemented my chatbot in ruby first, because I see no way of building the chatbot automatically.

Not sure where else to ask this, as there is no forum or website

Allow glob of .top files

It would simplify chatbot development slightly if one could specify

RAWDATA/botname/*.top

instead of needing to specify the path of each individual .top file

fresh download but build error with Harry

Updated: Issue closed
a stupid error, but fixable.
took me some time reading, but found the issue.
Consider this matter closed.
Not sure if I should divulge the solution.
As that would defeat the purpose of have so many documents :-)
Thank you so much for this.
You're a programmer in the true-est sense.
good coding and loads of comments and information

Hey,
an acquaintance send me the link to your repo.
haven't check out everything yet, but so far, i like it.
Thanks for the hard work you did. I hope to be off some help in the project.
as I grasp the basics ?: is for unprovoked input from the user.
what i didn't find yet is the next part (<< && >>)
Was hoping you could help me with the following.
on following your small start-up tutorial.
download with git clone.
started LinuxChatScript64 local
:build 0
works just great.
can't say about :build Harry
Not sure what going on?
No such file or directory? -> VERIFY/keywordless-b1.txt:

:build Harry
ChatScript Version 11.0 compiled Jan 1 2021 13:54:53
No such directory No such file or directory

Reading folder RAWDATA/HARRY/

----Reading file keywordless.top
Reading topic ~keywordless

in keywordless.top at 9: ?: ( << what nature of life >>) If you believe in reincarnation, then life is currently just a charity shop of used souls.
Error opening utf8writeappend file VERIFY/keywordless-b1.txt: No such file or directory

*** Error- line 9 col 2 of keywordless.top: INFO: Execution error (see LOGS/bugs.txt) - try again.

ERROR SUMMARY:
INFO: Execution error (see LOGS/bugs.txt) - try again. ended line 9 col 2 of keywordless.top

1 errors - press Enter to quit. Then fix and try again.

development cycle / :build xxx shortcut?

developing a bot the cycle for me is:

edit script
:build sname
go to command line
type stuff

basically 25% coding and 75% tedious testing steps

is there at least a way to automate the :build xxx shortcut?
for example like a watch script that would see any edits and recompile for you?
or at least a shortcut like :b to repeat the last build instruction.

this seems like a feature that should be an obvious requirement after using the system for more than 10 minutes so I assume I'm missing something...

Disabling interjections as per documentation doesn't seem to work

The documentation indicates that I can disable interjections so that I can use concepts like ~emohello, ~emohappy like regular concepts, and can match input before and after.

I have added the following to my control flags as instructed:

$cs_token -= #DO_INTERJECTIONS
$cs_token -= #DO_TEXTING

When I have a pattern like this:

u: (_~yes _*) 
    This matches.

beyond a doubt matches, but beyond a doubt i like apples does not match.

Newlines not working

Maybe I'm doing something wrong, but somehow newlines \n do not cause a line break. Instead, the characters are printed out. This is reproducible after adding \n to any of the RAWDATA/HARRY/introductions.top rules, rebuilding and resetting the bot, and triggering the altered rule.

Is this behavior intended? I tried this workaround, but that broke a few other things. Also, it felt wrong to have to use this 'hack' in order to achieve something seemingly simple as printing a newline.

Thanks in advance!

Issues walking directories rescursively in Linux during build

Running the Linux executable with a build0 commandline argument seems to ignore the // syntax in files0.txt.

The default files0.txt:

# underlying vocabulary organization
RAWDATA/ONTOLOGY/
RAWDATA/ONTOLOGY/ENGLISH//
# objects 
RAWDATA/WORLDDATA/

Note that RAWDATA/ONTOLOGY/ENGLISH// has a double slash in it, signifying that it should look at each file in that directory as well as any sub directories.

This works fine when building in Windows:

.\chatscript.exe local build0=files0.txt

CommandLine: D:\source\ChatScript
    local
    build0=files0.txt

ChatScript Release Version 10.3 pid: 0 32 bit Windows compiled May  2 2020 14:53:43 host=local
Params:   dict:2097151 fact:800000 text:100000kb hash:215127
          buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000 loglimit:80000
WordNet: dict=201022  fact=86305  heap=12006488 Apr18'20-10:20:26
Used 43MB: dict 201,022 (16081kb) hashdepths 934.3570.7235.9761.9695.7927.5205.3057.1532.662.283.95.30.9.2.3.1. words 201022 unusedbuckets 934 fact 86,305 (4142kb) heap 12006kb
           buffer (6400kb) cache (5000kb)
Free 122MB: dict 1,896,128 fact 713,695 stack/heap 87,993KB
[...]
----Reading file parsedata.top
Reading concept ~misc_parsedata
Reading concept ~causal_to_infinitive_verbs
Reading concept ~verbs_of_perception
Reading concept ~completeness_adjectives
Reading concept ~quotableverbs
Reading concept ~restrictive_adverbs

----Reading file timewords.top
Reading concept ~timewords
[...]

However running it in Linux, it seems to skip those two files in the subdirectory:

./LinuxChatScript64 local build0=files0.txt

A workaround is to alter the files0.txt file to include each subdirectory - seems to find the files fine then:

# underlying vocabulary organization
RAWDATA/ONTOLOGY/
RAWDATA/ONTOLOGY/ENGLISH/
RAWDATA/ONTOLOGY/ENGLISH/PARSER/
# objects 
RAWDATA/WORLDDATA/

VS2017 Build Issue

C:\Users\redacted\Desktop\ChatScript 9-12\treetagger\treetagger\treetagger\treetagger.vcxproj : error : The project file could not be loaded. Could not find a part of the path 'C:\Users\redacted\Desktop\ChatScript 9-12\treetagger\treetagger\treetagger\treetagger.vcxproj'. C:\Users\redacted\Desktop\ChatScript 9-12\treetagger\treetagger\treetagger\treetagger.vcxproj

Decimal "point" in German and other EU languages

I would like to write a simple maths bot in German. Thing is, German (and many other EU languages) uses the comma as decimal point. So we basically say "12 comma 4" for "12.4".

My code is as follows:

concept: ~rechnen ( durch mal geteilt plus minus und )

concept: ~plus (\+ plus und)

replace: ?_+ plus
replace: ?_, .

#! Was ist 10 plus 10?
u: PLUS ( _~number ~plus _~number ) ^keep() ^repeat() 
    $lastResult = ^compute(_0 + _1) 
    _0 plus _1 ist $lastResult

Unfortunately, that does not work for German number formats. Sadly, the replace from "," to "." doesn't work.

examples:
"4,7 plus 12" -> "7 plus 12 ist 19"
"3 plus 14,5" -> "3 plus 145 ist 148"

In one case the comma just cuts of the integer portion of the number, in the other case it is just omitted.

Any chance that this is not a bug and I just couldn't find the documentation to change number-matching? Any help will be appreciated.

[question] confused about which bot is running/available in server mode

I have installed ChatScript and added a very small own bot (based on https://blog.webbylab.com/how-we-built-ai-for-a-chatbot-in-javascript-and-chatscript/). So, I have an FOOD directory inside RAWDATA, with a copy of simplecontrol.top, in which I changed line 19 to $botprompt = ^"JENNY: ".

I can build the new bot running LinuxChatScript64 local and executing :build 0 and :build Food. However, I'm not sure how it works when running in server mode. Whenever I run in server mode and I send a message to the Food bot, I get a message No such bot. How to choose the bots to run in server mode?

$ ./BINARIES/LinuxChatScript64 
evcalled pid: 89201
  evserver: running pid: 89201
ChatScript EVSERVER Version 10.7 pid: 89201 64 bit LINUX compiled Oct 21 2020 08:03:29 host=local
WordNet: dict=201047  fact=86305  heap=11276512 Oct18'20-16:42:14
Build0:  dict=68806  fact=129153  heap=1157588 Compiled:Oct23'20-01:26:20 by version 10.7 "0"
Failed to find set ~restrictive_adverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~restrictive_adverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~quotableverbs - POS tagger incomplete because build 0 not yet done.
Failed to find set ~quotableverbs - POS tagger incomplete because build 0 not yet done.
Build1:  dict=143  fact=1  heap=207852 Compiled:Oct23'20-01:26:26 by version 10.7 "Food"

System created in 289 ms


======== Began EV server pid 89201 10.7 compiled Oct 21 2020 08:03:29 on host local port 1024 at Fri Oct 23 01:46:27 2020 serverlog:1 userlog: 1

When running a client (nodejs)

$ cat connect.js 
const net    = require('net');
const prefix = 'johndoe\x00Food\x00';
const post   = '\x00'
const client = new net.Socket();

client.connect(1024, '127.0.0.1', (err) => {
   client.write(prefix + 'I want burger!' + post);
});

client.on('data', (data) => console.log(data.toString()));

$ node connect.js 
No such bot.

Why does it say No such bot when trying to connect to the Food-bot, but not when connecting to Harry, although I did compile the Food bot succesfully?

Can't run in Alpine Linux.

I can't seem to run start chatscript in a Alpine Linux Docker Image. When I sh into the container and run ldd I see the below. Is there a way to run LinuxChatScript64 in Alpine Linux? Thanks!

/chatscript/BINARIES # ldd LinuxChatScript64
/lib64/ld-linux-x86-64.so.2 (0x7f40c169a000)
librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f40c169a000)
libcurl.so.4 => /usr/lib/libcurl.so.4 (0x7f40c1626000)
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x7f40c14d1000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f40c169a000)
libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x7f40c14bd000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f40c169a000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f40c169a000)
libnghttp2.so.14 => /usr/lib/libnghttp2.so.14 (0x7f40c1499000)
libssh2.so.1 => /usr/lib/libssh2.so.1 (0x7f40c146f000)
libssl.so.1.1 => /lib/libssl.so.1.1 (0x7f40c13ef000)
libcrypto.so.1.1 => /lib/libcrypto.so.1.1 (0x7f40c1171000)
libz.so.1 => /lib/libz.so.1 (0x7f40c1157000)
Error relocating LinuxChatScript64: __isnan: symbol not found
Error relocating LinuxChatScript64: backtrace: symbol not found
Error relocating LinuxChatScript64: __finite: symbol not found
Error relocating LinuxChatScript64: backtrace_symbols_fd: symbol not found
/chatscript/BINARIES # exit

Arrow/home/end keys don't move cursor in local/client mode

OS: Ubuntu 16.04
ChatScript version: 8.8

When using the server in local or client mode, pressing the left/right/home/end keys doesn't move the cursor back and forth as one might expect. Instead, it just prints the escape sequence (e.g. ^[[D, ^[[C, etc).

This makes it difficult to correct typos or jump around when testing. Furthermore, if you press ENTER with one of these escape sequences entered, the client exits altogether.

Happy to try and help with this if I can.

Using Treetagger to rebuild the Foreign Language Dictionary

Thanks for sharing your enormous work to community.
Sorry but when I try to enable ChatScript to support another language (Korean), I found that the tutorial is not clear enough in the section of rebuild dictionary with TreeTagger support.

":buildforeign language can be used to rebuild a foreign dictionary given the rawwords data in TreeTagger directory (which you dont have) and"

I already install TreeTagger for Windows, suppose I have a wikitext data in .txt file, how could I proceed to rebuild dictionary for korean? I have tried running :buildforeign korean and got filenotfound error, so it would be the directory issue.

Thank you.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.