From 6266fbbfe82c814da87cba4fffed6c7e270be9fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 16:50:30 +0200 Subject: [PATCH 1/8] 2to3 --- .gitignore | 2 +- src/ConceptNetwork.py | 62 +++++++++++++++++++++---------------------- src/Ector.py | 60 ++++++++++++++++++++--------------------- src/Entry.py | 10 +++---- src/EntryTest.py | 4 +-- 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/.gitignore b/.gitignore index a63bc0b..3643812 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ *.log -src/*.pyc +src/**/*.pyc .vscode/ diff --git a/src/ConceptNetwork.py b/src/ConceptNetwork.py index cfae8f8..3be0d5f 100644 --- a/src/ConceptNetwork.py +++ b/src/ConceptNetwork.py @@ -225,7 +225,7 @@ def addState(self, state): """Add a state to the Concept Network""" self.__hasType(state, "State") stateId = state.id - if stateId in self.state.keys(): + if stateId in list(self.state.keys()): raise ConceptNetworkDuplicateState("The state (" + stateId + ") already exists!") self.state[stateId] = state @@ -248,11 +248,11 @@ def propagateActivations(self, state, raise ConceptNetworkBadParameter("normalNumberComingLinks must be > 1") # Set the old activation values as the current ones # Increment age of the nodes - for symbol, nodeState in state.nodeState.iteritems(): + for symbol, nodeState in state.nodeState.items(): self.__hasType(nodeState, "NodeState") nodeState.ageActivationValues() - for (symbol, typeName), node in self.node.iteritems(): + for (symbol, typeName), node in self.node.items(): influence = 0 nbIncomings = 0 nodeState = state.getNodeState(symbol, typeName) @@ -295,12 +295,12 @@ def fastPropagateActivations(self, state, memoryPerf: memory performance (the higher, the better)""" influenceValues = {} # (symbol, type) => influence value influenceNb = {} # (symbol, type) => influence nb - for _, nodeState in state.nodeState.iteritems(): + for _, nodeState in state.nodeState.items(): nodeState.ageActivationValues() ## Fill influence table ## # Get the nodes influenced by others - for (symbol, typeName), node in self.node.iteritems(): + for (symbol, typeName), node in self.node.items(): if symbol: ov = state.getNodeOldActivationValue(symbol, typeName) #links = self.getLinksFrom(node) @@ -324,7 +324,7 @@ def fastPropagateActivations(self, state, + 1 ## For all nodes in the state ## - influenceValueKeys = influenceValues.keys() + influenceValueKeys = list(influenceValues.keys()) for (symbol, typeName) in state.nodeState: nodeState = state.getNodeState(symbol, typeName) oldAV = nodeState.getOldActivationValue() @@ -377,9 +377,9 @@ def removeStatesExcept(self, stateId): def showStates(self): """Show all states id""" - print "States (%d)" % (len(self.state)) + print("States (%d)" % (len(self.state))) for id in self.state: - print "\t%s" % (id) + print("\t%s" % (id)) class Node: @@ -453,9 +453,9 @@ def addLabelingLink(self, link): def show(self): """Display the node""" - print "%s (%s): %d" % (self.getSymbol().encode(ENCODING), + print("%s (%s): %d" % (self.getSymbol().encode(ENCODING), self.getTypeName(), - self.getOcc()) + self.getOcc())) class Link: @@ -511,20 +511,20 @@ def show(self, state): """Display the link, using state to compute labeled link weight.""" if self.label: if not state: - print "%10s -(%10s %d)-> %10s" % (self.fro.getSymbol().encode(ENCODING), + print("%10s -(%10s %d)-> %10s" % (self.fro.getSymbol().encode(ENCODING), self.label.getSymbol().encode(ENCODING), self.getWeight() * 100, - self.to.getSymbol().encode(ENCODING)) + self.to.getSymbol().encode(ENCODING))) else: - print "%10s -(%10s %d)-> %10s" % (self.fro.getSymbol().encode(ENCODING), + print("%10s -(%10s %d)-> %10s" % (self.fro.getSymbol().encode(ENCODING), self.label.getSymbol().encode(ENCODING), self.getWeight(state) * 100, - self.to.getSymbol().encode(ENCODING)) + self.to.getSymbol().encode(ENCODING))) else: - print "%10s ------(%d, %d)-------> %10s" % (self.fro.getSymbol().encode(ENCODING), + print("%10s ------(%d, %d)-------> %10s" % (self.fro.getSymbol().encode(ENCODING), self.getWeight() * 100, self.getCoOcc(), - self.to.getSymbol().encode(ENCODING)) + self.to.getSymbol().encode(ENCODING))) class State: @@ -591,7 +591,7 @@ def getNodeOldActivationValue(self, symbol, type="basic"): def getAverageActivationValue(self): "Get the average activation value" activationValues = [nodeState.getActivationValue() - for _, nodeState in self.nodeState.iteritems()] + for _, nodeState in self.nodeState.items()] nb = len(activationValues) total = sum(activationValues) if nb: @@ -605,7 +605,7 @@ def getMaximumActivationValue(self, cn, typeNames): typeNames: names of the types to take into account cn: Concept Network containing the nodes""" activationValues = [nodeState.getActivationValue() - for (_, typeName), nodeState in self.nodeState.iteritems() + for (_, typeName), nodeState in self.nodeState.items() if typeName in typeNames] return max(activationValues) @@ -617,7 +617,7 @@ def getActivatedTypedNodes(self, cn, typeNames, threshold=90): Return a list of tuples (node,activation value)""" nodes = [] - for nodeId, node in cn.node.iteritems(): + for nodeId, node in cn.node.items(): (symbol, typeName) = nodeId av = self.getNodeActivationValue(symbol, typeName) if av > threshold: @@ -634,18 +634,18 @@ def __hasType(self, obj, strType): def checkNodes(self): "Check that the nodes are NodeState s" - for _, nodeState in self.nodeState.iteritems(): + for _, nodeState in self.nodeState.items(): self.__hasType(nodeState, "NodeState") def showNodes(self): "Print the node states" - print "oldav\tav\tage\tNode" + print("oldav\tav\tage\tNode") for (symbol, typeName) in self.nodeState: nodeState = self.nodeState[(symbol, typeName)] - print "%d\t%d\t%d\t%s(%s)" % (nodeState.getOldActivationValue(), + print("%d\t%d\t%d\t%s(%s)" % (nodeState.getOldActivationValue(), nodeState.getActivationValue(), nodeState.getAge(), - symbol.encode(ENCODING), typeName) + symbol.encode(ENCODING), typeName)) def clean(self): """Clean the state from the non-activated nodes""" @@ -808,26 +808,26 @@ def main(): if line[:9] == "@addnode ": node = Node(line[9:]) cn.addNode(node) - print "Node \"%s\" added" % (line[9:]) + print("Node \"%s\" added" % (line[9:])) elif line[:9] == "@addlink ": params = line[9:].split() if len(params) == 2: try: node1 = cn.getNode(params[0]) except ConceptNetworkUnknownNode: - print "The node \"%s\" does not exist!" % (params[0]) + print("The node \"%s\" does not exist!" % (params[0])) continue try: node2 = cn.getNode(params[1]) except ConceptNetworkUnknownNode: - print "The node \"%s\" does not exist!" % (params[1]) + print("The node \"%s\" does not exist!" % (params[1])) continue - print cn.addLink(node1, node2) + print(cn.addLink(node1, node2)) elif len(params) == 3: node1 = cn.getNode(params[0]) node2 = cn.getNode(params[1]) node3 = cn.getNode(params[2]) - print cn.addLink(node1, node2, node3) + print(cn.addLink(node1, node2, node3)) elif line[:10] == "@shownodes": cn.showNodes() elif line[:10] == "@showlinks": @@ -857,11 +857,11 @@ def main(): file = open("state_1.pkl", "w") pickle.dump(state, file, 0) file.close() - print "Concept Network saved in \"%s\"" % (filename) + print("Concept Network saved in \"%s\"" % (filename)) elif line.startswith("@quit"): return 0 elif line[:5] == "@help": - print """@help give this help + print("""@help give this help @addnode name: add the node given @addlink node1 node2 [label]: add a link from node1 to node2 @activate name [activation value]: activate a node from its name @@ -870,7 +870,7 @@ def main(): @showlinks: show the links in the ConceptNetwork @showstate: show the state of the nodes @save: save the Concept Network and its state -@quit: quit without saving""" +@quit: quit without saving""") if __name__ == "__main__": import sys diff --git a/src/Ector.py b/src/Ector.py index 32b8789..87958e3 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -96,12 +96,12 @@ def incrementEndOccurrence(self): def show(self): """Display the node""" - print "%10s (%8s): %d (%d,%d,%d)" % (self.getSymbol().encode(ENCODING), + print("%10s (%8s): %d (%d,%d,%d)" % (self.getSymbol().encode(ENCODING), self.getTypeName(), self.getOcc(), self.getBeginningOccurrence(), self.getMiddleOccurrence(), - self.getEndOccurrence()) + self.getEndOccurrence())) class SentenceNode(Node): @@ -130,11 +130,11 @@ def getDecay(self): def show(self): """Display the node Display the number of times it was on top of a dialogue.""" - print "%10s (%8s): %d (%d)" % (self.getSymbol().encode(ENCODING), + print("%10s (%8s): %d (%d)" % (self.getSymbol().encode(ENCODING), self.getTypeName(), self.getOcc(), self.beg - ) + )) class ExpressionNode(Node): @@ -203,13 +203,13 @@ def addNode(self, node): def show(self): """Display the node Display the last time the utterer talked""" - print "%10s (%8s): %d (%d/%d/%d)" % (self.getSymbol(), + print("%10s (%8s): %d (%d/%d/%d)" % (self.getSymbol(), self.getTypeName(), self.getOcc(), self.__lastTime[0], self.__lastTime[1], self.__lastTime[2] - ) + )) class Ector: @@ -509,12 +509,12 @@ def cleanState(self): def logEntry(filename, utterer, entry, encoding=ENCODING): """Log the utterer's entry in the file""" - f = file(filename, "a") + f = open(filename, "a") t = time.localtime() - print >> f, "%4d/%2d/%2d - %2d:%2d:%2d\t%s\t%s" % (t[0], t[1], t[2], + print("%4d/%2d/%2d - %2d:%2d:%2d\t%s\t%s" % (t[0], t[1], t[2], t[3], t[4], t[5], utterer, - entry.encode(encoding)) + entry.encode(encoding)), file=f) f.close() @@ -570,11 +570,11 @@ def main(): previousSentenceNode = None nodes = None - print """pyECTOR version %s, Copyright (C) 2008 Francois PARMENTIER + print("""pyECTOR version %s, Copyright (C) 2008 Francois PARMENTIER pyECTOR comes with ABSOLUTELY NO WARRANTY; for details type `@show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `@show c' for details. -@help gives a basic help on pyECTOR commands.""" % (version) +@help gives a basic help on pyECTOR commands.""" % (version)) ector_path = os.path.dirname(sys.argv[0]) license_path = os.path.abspath(ector_path + "/../LICENSE") @@ -602,7 +602,7 @@ def main(): for i in range(57, 256): stdout.write(license[i]) elif entry[:6] == "@usage": - print usage.replace("%prog", "Ectory.py") + print(usage.replace("%prog", "Ector.py")) elif entry[:7] == "@status": ector.showStatus() elif entry[:8] == "@person ": @@ -612,7 +612,7 @@ def main(): botname = entry[6:].strip() ector.setName(botname) elif entry[:8] == "@version": - print "pyECTOR version %s" % (version) + print("pyECTOR version %s" % (version)) elif entry[:6] == "@write": ector.dump() elif entry[:5] == "@quit" or entry[:5] == "@exit" or entry[:4] == "@bye": @@ -627,39 +627,39 @@ def main(): ector.cleanState() elif entry.startswith("@log "): logfilename = entry[5:] - print "Log file: %s" % (logfilename) + print("Log file: %s" % (logfilename)) elif entry == "@log" or entry == "@logoff": - print "Log off (%s)" % logfilename + print("Log off (%s)" % logfilename) logfilename = '' elif entry.lower() == "@sentence on": sentence_mode = True generate_mode = False # sentence and generate modes are not compatible - print "Sentence reply mode ON" + print("Sentence reply mode ON") elif entry.lower() == "@sentence off": sentence_mode = False - print "Sentence reply mode OFF" + print("Sentence reply mode OFF") elif entry.lower() == "@sentence": - print "Sentence reply mode", sentence_mode and "ON" or "OFF" + print("Sentence reply mode", sentence_mode and "ON" or "OFF") elif entry.lower() == "@generate on": sentence_mode = False generate_mode = True # sentence and generate modes are not compatible - print "Generate reply mode ON" + print("Generate reply mode ON") elif entry.lower() == "@generate off": generate_mode = False - print "Sentence reply mode OFF" + print("Sentence reply mode OFF") elif entry.lower() == "@generate": - print "Generate reply mode", generate_mode and "ON" or "OFF" + print("Generate reply mode", generate_mode and "ON" or "OFF") elif entry.lower() == "@debug on": debug = True - print "Debug mode ON" + print("Debug mode ON") elif entry.lower() == "@debug off": debug = False - print "Debug mode OFF" + print("Debug mode OFF") elif entry.lower() == "@debug": - print "Debug mode", debug and "ON" or "OFF" + print("Debug mode", debug and "ON" or "OFF") # Help elif entry[:5] == "@help": - print """You can just start typing phrases. + print("""You can just start typing phrases. But there are some commands you can use: - @usage : print the options of the Ector.py command - @quit : quit @@ -677,11 +677,11 @@ def main(): - @status : show the status of Ector (Concept Network, states) - @sentence [ON|OFF]: set the sentence reply mode - @generate [ON|OFF]: set the generate reply mode - - @debug [ON|OFF]: set the debug mode on or off""" + - @debug [ON|OFF]: set the debug mode on or off""") elif entry.startswith("@"): - print "There is no command", entry + print("There is no command", entry) elif entry: - entry = unicode(entry, ENCODING) + # entry = str(entry, ENCODING) lastSentenceNode = ector.addEntry(entry) if previousSentenceNode: ector.cn.addLink(previousSentenceNode, lastSentenceNode) @@ -720,12 +720,12 @@ def main(): reply = reply.replace("@user@", botname) previousSentenceNode = None if reply: - print "%s>" % (ector.botname), reply.encode(ENCODING) + print("%s>" % (ector.botname), reply.encode(ENCODING)) if logfilename: logEntry(logfilename, botname, reply) else: if debug: - print "No entry given." + print("No entry given.") if __name__ == "__main__": diff --git a/src/Entry.py b/src/Entry.py index 7046573..651f16f 100644 --- a/src/Entry.py +++ b/src/Entry.py @@ -35,11 +35,11 @@ import re -reSENTENCES_SEPARATORS = re.compile(r'[?!\.]+\s*', re.LOCALE|re.UNICODE) +reSENTENCES_SEPARATORS = re.compile(r'[?!\.]+\s*', re.UNICODE) # From http://www.regular-expressions.info/email.html reMAIL = re.compile(r"([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum))", re.IGNORECASE|re.MULTILINE|re.UNICODE) -reACRONYMS = re.compile(r'(?:[A-Z]\.)+', re.LOCALE|re.UNICODE) +reACRONYMS = re.compile(r'(?:[A-Z]\.)+', re.UNICODE) reURL = re.compile(r"(?:http|ftp|file)://(?:[a-z0-9]+\.){1,3}[a-z0-9]+", re.IGNORECASE|re.UNICODE) #reURL = re.compile(r"([^:/?#]+:)?(?://[^/?#]*)?[^?#]*(?:\?[^#]*)?(?:#.*)?", re.IGNORECASE) @@ -95,8 +95,8 @@ def __init__(self,entry,username="User",botname="Ector"): # Use a re, with \b around names to avoid replacing part of words, # like director -> dir@bot@. # See http://docs.python.org/dev/howto/regex.html - reBotname = re.compile(r'\b'+botname+r'\b', re.IGNORECASE|re.LOCALE) - reUsername = re.compile(r'\b'+username+r'\b', re.IGNORECASE|re.LOCALE) + reBotname = re.compile(r'\b'+botname+r'\b', re.IGNORECASE) + reUsername = re.compile(r'\b'+username+r'\b', re.IGNORECASE) self.entry = reBotname.sub('@bot@', entry) self.entry = reUsername.sub('@user@', self.entry) self.sentences = None @@ -222,4 +222,4 @@ def getTokens(self, sentence): if __name__ == "__main__": e = Entry("Un. Deux? Trois!! Quatre.") - print e.getSentences() \ No newline at end of file + print(e.getSentences()) \ No newline at end of file diff --git a/src/EntryTest.py b/src/EntryTest.py index 3c21187..052d59c 100644 --- a/src/EntryTest.py +++ b/src/EntryTest.py @@ -140,9 +140,9 @@ def testTokensSmiley(self): def testTokensUnicode(self): """Get tokens with accented characters""" - line = u"Comment ça va?" + line = "Comment ça va?" e = Entry(line) - self.assertEqual([u"Comment",u"ça",u"va",u"?"], e.getTokens(line)) + self.assertEqual(["Comment",u"ça",u"va",u"?"], e.getTokens(line)) if __name__ == "__main__": From 94d7f6bb2dde821815180b2da84d0905c7063f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 16:59:48 +0200 Subject: [PATCH 2/8] Remove overenconding --- src/Ector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ector.py b/src/Ector.py index 87958e3..a7bebf3 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -720,7 +720,7 @@ def main(): reply = reply.replace("@user@", botname) previousSentenceNode = None if reply: - print("%s>" % (ector.botname), reply.encode(ENCODING)) + print("%s>" % (ector.botname), reply) if logfilename: logEntry(logfilename, botname, reply) else: From 754f09f5b78cb18bc4994f6b860a9d8433aa7553 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:05:59 +0200 Subject: [PATCH 3/8] Update README --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bb7c413..a187c4d 100644 --- a/README.md +++ b/README.md @@ -21,18 +21,20 @@ It's to you to teach it. ## Prerequisites pyECTOR is written in Python so you need a Python interpreter -(version 2.5 or later) to execute pyECTOR. Python is installed by +(version 3 or later) to execute pyECTOR. Python is installed by default in most Linux distributions. You can download Python from the official Python website http://www.python.org. ## Obtaining pyECTOR The latest pyECTOR version and online documentation can be found at -http://pyector.googlecode.com/ +- https://github.com/parmentf/pyector/ (program) +- https://code.google.com/archive/p/pyector/ (documentation) ## Installation Once you've downloaded the file, untar it like that: + ```bash tar -xvzf pyector-0.4.tar.gz . ``` @@ -43,11 +45,11 @@ grammatically. Be indulgent with it, consider it like a child, learning to speak. ```bash -python ConceptNetwork.py +python3 ConceptNetwork.py ``` It allows one to play with its internal mechanism: the -[Concept Network](http://code.google.com/p/pyector/wiki/ConceptNetwork). +[Concept Network](https://code.google.com/archive/p/pyector/wikis/ConceptNetwork.wiki). You can `@addnode` (add a node), `@addlink` (add a link between two existing nodes), and even `@activate` a node, so you can @@ -60,7 +62,7 @@ See [document on Concept Network Module](./doc/html/ConceptNetworkModule.html). # Usage ```bash -python Ector.py [-p username][-n botname=Ector][-v|-q][-l logfilepath=ector.log][-s|-g][-h] +python3 Ector.py [-p username][-n botname=Ector][-v|-q][-l logfilepath=ector.log][-s|-g][-h] ``` Be aware that ECTOR does not know anything at the beginning (first launch). From 3ae55a8b1528fc73611eccebdb6de6ad6675865d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:24:40 +0200 Subject: [PATCH 4/8] Fix @write problem --- .gitignore | 1 + src/Ector.py | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index 3643812..0445198 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ *.log src/**/*.pyc .vscode/ +*.pkl diff --git a/src/Ector.py b/src/Ector.py index a7bebf3..078510f 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -219,7 +219,7 @@ def __init__(self, botname="Ector", username="User"): self.botname = botname self.username = username if os.path.exists("cn.pkl"): - f = open("cn.pkl", "r") + f = open("cn.pkl", "rb") self.cn = pickle.load(f) f.close() else: @@ -231,13 +231,13 @@ def dump(self): Save the ConceptNetwork in cn.pkl, and the state in usernameState.pkl""" # Save the ConceptNetwork - f = open("cn.pkl", "w") + f = open("cn.pkl", "wb") self.cn.dump(f) f.close() # Save username's state if self.username: filename = self.__getStateId() - f = open(filename, "w") + f = open(filename, "wb") state = self.cn.getState(self.username) pickle.dump(state, f) f.close() @@ -271,7 +271,7 @@ def loadUserState(self): if self.username: filename = self.__getStateId() if os.path.exists(filename): - f = open(filename, "r") + f = open(filename, "rb") state = pickle.load(f) f.close() else: From 83d3e4b465e8657d3eff4eca3b0f3ce0f988934e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:43:00 +0200 Subject: [PATCH 5/8] Fix user prompt --- src/Ector.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Ector.py b/src/Ector.py index 078510f..88b8e0d 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -583,6 +583,7 @@ def main(): if stdin.closed: break stdout.write(username + ">") + stdout.flush() entry = stdin.readline().strip() # No Warranty From e8df78942c05b180c9d949b6f3b7fa674686c08c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:48:54 +0200 Subject: [PATCH 6/8] Fix log --- src/Ector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ector.py b/src/Ector.py index 88b8e0d..2b097d4 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -514,7 +514,7 @@ def logEntry(filename, utterer, entry, encoding=ENCODING): print("%4d/%2d/%2d - %2d:%2d:%2d\t%s\t%s" % (t[0], t[1], t[2], t[3], t[4], t[5], utterer, - entry.encode(encoding)), file=f) + entry), file=f) f.close() From c13396ac7c36401f5263f6ff2359506dd95bf104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:52:46 +0200 Subject: [PATCH 7/8] Better time in log --- src/Ector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Ector.py b/src/Ector.py index 2b097d4..f0c4077 100644 --- a/src/Ector.py +++ b/src/Ector.py @@ -511,7 +511,7 @@ def logEntry(filename, utterer, entry, encoding=ENCODING): """Log the utterer's entry in the file""" f = open(filename, "a") t = time.localtime() - print("%4d/%2d/%2d - %2d:%2d:%2d\t%s\t%s" % (t[0], t[1], t[2], + print("%4d/%02d/%02d - %02d:%02d:%02d\t%s\t%s" % (t[0], t[1], t[2], t[3], t[4], t[5], utterer, entry), file=f) From 6b64175e06ea5956ada123087cc965f1587742e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Parmentier?= Date: Sun, 24 Jun 2018 17:58:55 +0200 Subject: [PATCH 8/8] Fix tests --- src/ConceptNetworkTest.py | 8 ++++---- src/EctorTest.py | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/ConceptNetworkTest.py b/src/ConceptNetworkTest.py index 5fbe3e3..c2c8e1a 100644 --- a/src/ConceptNetworkTest.py +++ b/src/ConceptNetworkTest.py @@ -183,15 +183,15 @@ def testDumpLoad(self): conceptNetwork.addState(state) state.setNodeActivationValue(100,"From") conceptNetwork.fastPropagateActivations(state,2) - av = state.getNodeActivationValue("To1") + state.getNodeActivationValue("To1") - f = open("cntest.data","w") + f = open("cntest.data","wb") try: conceptNetwork.dump(f,0) finally: f.close() - f = open("cntest.data") + f = open("cntest.data", "rb") try: cnLoaded = pickle.load(f) finally: @@ -302,7 +302,7 @@ def testAging(self): state = State(1) conceptNetwork.addState(state) state.setNodeActivationValue(100,"From","basic") - for i in range(0,51): + for _ in range(0,51): conceptNetwork.fastPropagateActivations(state,2) state.setNodeActivationValue(0, "From", "basic") self.assertRaises(KeyError,state.nodeState.__getitem__,("From","basic")) diff --git a/src/EctorTest.py b/src/EctorTest.py index aefa942..325c097 100644 --- a/src/EctorTest.py +++ b/src/EctorTest.py @@ -43,7 +43,7 @@ def testAddSentence(self): """Add a sentence in the Concept Network of Ector""" ector = Ector() ector.addSentence("Hello.") - expectedNodeSymbols = ["User", "Hello", ".", "Hello."] + expectedNodeSymbols = ["User", "Hello.", "Hello", "."] nodeSymbols = [symbol for (symbol, typeName) in ector.cn.node] self.assertEqual(expectedNodeSymbols,nodeSymbols) @@ -51,7 +51,7 @@ def testAddEntry(self): """Add an entry in Ector""" ector = Ector() ector.addEntry("Hello.") - expectedNodeSymbols = ["User", "Hello", ".", "Hello."] + expectedNodeSymbols = ["User", "Hello.", "Hello", "."] nodeSymbols = [symbol for (symbol, typeName) in ector.cn.node] self.assertEqual(expectedNodeSymbols,nodeSymbols)