Advertisement
Houshalter

AMAbot.js (2)

Feb 9th, 2014
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var http = require('http');
  2. var natural = require('natural');
  3. fs = require('fs')
  4. brain = require('brain')
  5.  
  6. // Create the configuration
  7. var config = {
  8.     channels: ["##bottest", "#futurology", "#mybots", "#reddit"],
  9.     server: "irc.snoonet.org",
  10.     botName: "AMAbot",
  11.     sasl: false,
  12.     secure: false,
  13.     password: 'password here if any'
  14. };
  15.  
  16. var maxLength = 500;
  17. var released = 0;
  18. var subredditList = ["askreddit+AskHistorians+askscience+explainlikeimfive", "askmen+askwomen+askculinary", "futurology+philosophy+psychonaut+MachineLearning+learnprogramming", "all"];
  19. var activeChannels = {};
  20. var rawDataset = [];
  21. var defaultChannelSetting = {};
  22. var networkSettings = {
  23.     layers: [4, 3, 2],
  24.     learningRate: 0.1,
  25.     threshold: 0.000001,
  26.     iterations: 20000
  27. }
  28. /*var networkSettings = {"layers":[3,6,3,3,3,5,3,1],"learningRate":0.009193395357579001,"threshold":0.2702860541099906,"iterations":19212.502439972013};
  29. var networkSettings = {"layers":[8,19,9,22,24,1,6,7,2,16,3,2,5,7,1,2,4,1],"learningRate":0.0033243911806494705,"threshold":0.7047150845097602,"iterations":40797.12532903068};
  30. var networkSettings = {"layers":[9,20,9,21,24,1,10,9,1,11,1,2,5,6,3],"learningRate":0.002924735611304713,"threshold":0.7961916553246081,"iterations":43209.032842190936};
  31. var networkSettings = {"layers":[2,4,1,2],"learningRate":0.008147467230446723,"threshold":0.22654134919105473,"iterations":46747.36615619622};
  32. */
  33. //var networkSettings = {"layers":[4,5,2],"learningRate":0.00023194521199911694,"threshold":0.000001078763395664282,"iterations":20034.78908073157};
  34. //var networkSettings = {"layers":[4,5,2],"learningRate":0.00023194521199911694,"threshold":0.0000010562829725909978,"iterations":19797.069663880393};
  35. /*var networkSettings = {"layers":[3,5,2,1,2,1,4],"learningRate":0.14381794724613428,"threshold":0.0000010224730655085295,"iterations":18688.28935455531};
  36. var networkSettings = {"layers":[3,5,2,1,2,1],"learningRate":0.1711220392258838,"threshold":8.262058848747984e-7,"iterations":18793.842338956892};
  37. var networkSettings = {"layers":[3,3,3,1,3],"learningRate":0.0035125559894367345,"threshold":0.0010001768320446372,"iterations":20093.089742818847};
  38. */
  39. //var networkSettings = {"layers":[4,2,2],"learningRate":0.00023194521199911694,"threshold":0.0000012831276768585669,"iterations":19920.421788701788};
  40. //var networkSettings = {"layers":[],"learningRate":0.0002504901404011595,"threshold":0.0000012533658032377527,"iterations":25414.23598228595};
  41.  
  42.  
  43. var networkSettings = {"layers":[],"learningRate":0.019543054905444283,"threshold":0.1,"iterations":1000.198314515295};
  44. var networkSettings = {"layers":[],"learningRate":0.02371273614254603,"threshold":0.1080865932999755,"iterations":6808.866671373775};
  45. var networkSettings = {"layers":[1],"learningRate":0.031357327018297194,"threshold":0.0757713085276743,"iterations":7010.153680644004};
  46. var networkSettings = {"layers":[1],"learningRate":0.02930038359341617,"threshold":0.06959408669598949,"iterations":7586.342043816811};
  47. var networkSettings = {"layers":[2,1],"learningRate":0.02991200765536878,"threshold":0.062440579693873156,"iterations":8036.404564736056};
  48. var networkSettings = {"layers":[2],"learningRate":0.02710111697056981,"threshold":0.057042649478990404,"iterations":8703.008759251212};
  49. var networkSettings = {"layers":[4,3],"learningRate":0.04114500238704092,"threshold":0.0611729400814995,"iterations":5443.051571087624}
  50. var networkSettings = {"layers":[],"learningRate":0.03521817724270217,"threshold":0.05562827149940124,"iterations":6551.885643714466};
  51. var networkSettings = {"layers":[3,2,1],"learningRate":0.026519552102619342,"threshold":0.035693828430759994,"iterations":6965.243219611451};
  52. var networkSettings = {"layers":[],"learningRate":0.023396226697915284,"threshold":0.035693828430759994,"iterations":6628.1487504702045};
  53. var networkSettings = {"layers":[],"learningRate":0.02523913035089666,"threshold":0.036409500997588884,"iterations":7160.281104233691};
  54. var networkSettings = {"layers":[6,2,4,2],"learningRate":0.030078094240842526,"threshold":0.05356082839949051,"iterations":11418.317464719004};
  55. var networkSettings = {"layers":[4,4],"learningRate":0.031054105722877038,"threshold":0.05066490997169323,"iterations":12599.905669422802};
  56. var networkSettings = {"layers":[4,4],"learningRate":0.031054105722877038,"threshold":0.05066490997169323,"iterations":12599.905669422802};
  57. var networkSettings =  {"layers":[4,4],"learningRate":0.031054105722877038,"threshold":0.05066490997169323,"iterations":12599.905669422802};
  58. var networkSettings = {"layers":[],"learningRate":0.029689335672511794,"threshold":0.051498690923560554,"iterations":16635.94919009061};
  59. var net;
  60.  
  61. function makeNet(networkSettings, dataset){
  62.     var net = new brain.NeuralNetwork({
  63.         hiddenLayers: networkSettings.layers,
  64.         learningRate: networkSettings.learningRate
  65.     });
  66.     var result = net.train(dataset, {
  67.       errorThresh: networkSettings.threshold,  // error threshold to reach
  68.       iterations: networkSettings.iterations,   // maximum training iterations
  69.       log: false,           // console.log() progress periodically
  70.       logPeriod: 5000        // number of iterations between logging
  71.     })
  72.     console.log(JSON.stringify(result));
  73.     return net;
  74. }
  75.  
  76. //randomly split dataset some percent
  77. //create a random network setup
  78. //train network on training data
  79. //test on validation set
  80. //mutate network
  81. //repeat
  82. //if mutated network settings do better, choose previous
  83. //repeat
  84. function hillClimb(rawDataset, percentValidation, gens, mutationRate, callback, timeinterval, maxtime){
  85.     var dataset = extract(rawDataset);
  86.     var validationset = [];
  87.     var trainingset = [];
  88.     for (key in dataset){
  89.         value = dataset[key]
  90.         if (Math.random() < percentValidation){
  91.             validationset.push(value);
  92.         } else {
  93.             trainingset.push(value);
  94.         }
  95.     }
  96.     //
  97.     function testNet(net){
  98.         var err = 0;
  99.         for (key in validationset){
  100.             var result = net.run(validationset[key].input)[0];
  101.             err += Math.abs(validationset[key].output - result);
  102.         }
  103.         return err;
  104.     }
  105.     function testNets(newNet, oldNet){
  106.         var probNew = 0.5;
  107.         for (key in validationset){
  108.             var dat = validationset[key];
  109.             var oldResult = newNet.run(dat.input)[0];
  110.             var newResult = oldNet.run(dat.input)[0];
  111.             var probDataOld = 1 - Math.abs(dat.output - oldResult);
  112.             var probDataNew = 1 - Math.abs(dat.output - newResult);
  113.             probNew = (probDataNew*probNew)/(probDataOld*(1-probNew)+probDataNew*probNew);
  114.             //console.log(probNew, probDataOld, probDataNew);
  115.         }
  116.         return probNew;
  117.     }
  118.     function mutate(networkSettings){
  119.         function mutateVal(val, amount, min, max){
  120.             var newVal = val;
  121.             if (Math.random()<mutationRate){
  122.                 newVal += (Math.random()*val/4)-(val/4)/2;
  123.                 if (newVal > max || newVal < min){
  124.                     newVal = val;
  125.                 }
  126.             }
  127.             return newVal;
  128.         }
  129.         var layers = networkSettings.layers
  130.         var newLayers = []
  131.         for (key in layers){
  132.             var nodes;
  133.             if (Math.random()<mutationRate/layers.length){
  134.                 nodes = layers[key]+Math.round((Math.random()*4)-2);
  135.                 if (nodes <= 1){
  136.                     nodes = 1;
  137.                 }
  138.             } else {
  139.                 nodes = layers[key]
  140.             }
  141.             newLayers[key] = nodes;
  142.         }
  143.         if (Math.random()<mutationRate){
  144.             newLayers.push(Math.round(Math.random()*3+1));
  145.         }
  146.         if (Math.random()<mutationRate){
  147.             newLayers.pop();
  148.         }
  149.         var newLearningRate = mutateVal(networkSettings.learningRate, 0.1, 0, 1);
  150.         var newThreshold = mutateVal(networkSettings.threshold, 0.0000003, 0, 1);
  151.         var newIterations = mutateVal(networkSettings.iterations, 1000, 1, 10000000);
  152.        
  153.         return {layers: newLayers, learningRate: newLearningRate, threshold: newThreshold, iterations: newIterations};
  154.     }
  155.     function begin(i, callback){
  156.         var newSettings = mutate(networkSettings);
  157.         console.log("NewSettings:", JSON.stringify(newSettings));
  158.         var clock = Date.now()
  159.         var newNet = makeNet(newSettings, trainingset);
  160.         var newTime = Date.now() - clock;
  161.         function callback2(){
  162.             var clock = Date.now()
  163.             var oldNet = makeNet(networkSettings, trainingset);
  164.             var oldTime = Date.now() - clock;
  165.             console.log("NewTime: ", newTime/1000, "OldTime:", oldTime/1000);
  166.             //var errNew = testNet(newNet);
  167.             //var errOld = testNet(oldNet);
  168.             var probNew = testNets(newNet, oldNet)
  169.             var newBetter = Math.random()<probNew;
  170.             console.log("Probability of New settings:", probNew)
  171.             if ((newBetter && newTime < maxtime*1000) || (oldTime > maxtime*1000 && newTime < oldTime && newBetter)){
  172.                 networkSettings = newSettings;
  173.                 console.log("Switching to new settings!")
  174.                 //console.log(JSON.stringify(newSettings));
  175.                 //console.log(errNew/validationset.length);
  176.             }
  177.             if (i<gens){
  178.                 setTimeout(function(){begin(i+1, callback);},timeinterval)
  179.             } else {
  180.                 callback();
  181.             }
  182.         }
  183.         setTimeout(callback2, timeinterval);
  184.     }
  185.     begin(1, callback);
  186. }
  187.  
  188. function test(){
  189.     console.log("done saving");
  190.  
  191.     for (k in rawDataset){
  192.         if (!("threadNum" in rawDataset[k])){
  193.             rawDataset[k].threadNum = 1;
  194.             rawDataset[k].commentNum = 1;
  195.             console.log("FIXING?")
  196.         }
  197.     }
  198.  
  199.     /*var dataset = extract(rawDataset)
  200.     console.log(dataset)
  201.     for (k in dataset){
  202.         console.log(dataset[k]);
  203.     }*/
  204.    
  205.     /*for (k in rawDataset){
  206.         if (rawDataset[k].thread.id == "feqqk"){
  207.             console.log("Removing Entry About Moon.");
  208.         }
  209.     }*/
  210.    
  211.     //hillClimb(rawDataset, 0.3, 10, 0.5)
  212.     var dataset = extract(rawDataset);
  213.     /*var result = net.train(datasets, {
  214.       errorThresh: 0.000001,  // error threshold to reach
  215.       iterations: 20000,   // maximum training iterations
  216.       log: true,           // console.log() progress periodically
  217.       logPeriod: 500        // number of iterations between logging
  218.     })*/
  219.     net = makeNet(networkSettings, dataset)
  220.     //var json = net.toJSON();
  221.  
  222.     //net = net.fromJSON(json);
  223.    
  224.     //console.log(result);
  225.     //setTimeout(function(){bot.say("NickServ", "identify 1robot");}, 5000);
  226. }
  227.  
  228. function load(){
  229.     fs.readFile("C:\\Users\\Daniel\\Documents\\Programming\\AMAbotData.txt", "utf8", function (err,data) {
  230.       if (err) {
  231.         return console.log(err);
  232.       }
  233.       rawDataset = JSON.parse(data);
  234.       console.log("loadedData")
  235.       test();
  236.     });
  237. }
  238.  
  239. function arraysEqual(arr1, arr2) {
  240.     if(arr1.length !== arr2.length)
  241.         return false;
  242.     for(var i = arr1.length; i--;) {
  243.         if(arr1[i] !== arr2[i])
  244.             return false;
  245.     }
  246.  
  247.     return true;
  248. }
  249.  
  250. var tokenizer = new natural.TreebankWordTokenizer();
  251. var NGrams = natural.NGrams;
  252. function tokenize(text){
  253.     return tokenizer.tokenize(text.toLowerCase())
  254. }
  255.  
  256. function matchMarkov(search, text, n){
  257.     var search = tokenize(search);
  258.     var text = tokenize(text);
  259.     var searchgrams = NGrams.ngrams(search, n);
  260.     var textgrams = NGrams.ngrams(text, n);
  261.     var count = 0;
  262. for (textgramNum in textgrams){
  263.         for (searchgramNum in searchgrams){
  264.             if (arraysEqual(searchgrams[searchgramNum], textgrams[textgramNum])){
  265.                 count += 1;
  266.             }
  267.         }
  268.     }
  269.     return count;
  270. }
  271.  
  272. function matchMarkovPercent(search, text, n){
  273.     var search = tokenize(search);
  274.     var text = tokenize(text);
  275.     var searchgrams = NGrams.ngrams(search, n);
  276.     var textgrams = NGrams.ngrams(text, n);
  277.     var count = 0;
  278.     for (searchgramNum in searchgrams){
  279.         for (textgramNum in textgrams){
  280.             if (arraysEqual(searchgrams[searchgramNum], textgrams[textgramNum])){
  281.                 count += 1;
  282.                 break;
  283.             }
  284.         }
  285.     }
  286.     return (searchgrams.length > 0 ? count/searchgrams.length : 0);
  287. }
  288.  
  289. function numwords(text){
  290.     return tokenize(text).length;
  291. }
  292.  
  293. function segmentMatches(search, text, n){
  294.     search = search.toLowerCase()
  295.     text = text.toLowerCase()
  296.     for (i=0;i<n;i++){
  297.         var rand1 = Math.round(Math.random()*search.length-1);
  298.         var rand2 = Math.round(Math.random()*search.length-1);
  299.         if (rand1 > rand2){
  300.             text.indexOf(search.splice(rand1, search.length));
  301.         } else {
  302.            
  303.         }
  304.     }
  305. }
  306.  
  307. function wordMatches(words, text){
  308.     words = words.toLowerCase();
  309.     text = text.toLowerCase();
  310.     wordsArray = words.split(" ");
  311.     textArray = text.split(" ");
  312.     wordsArray = wordsArray.filter(function(elem, pos) {
  313.         return wordsArray.indexOf(elem) == pos;
  314.     })
  315.     var count = 0;
  316.     for (k in wordsArray){
  317.         for(var i = 0; i < textArray.length; ++i){
  318.             if(textArray[i] == wordsArray[k])
  319.                 count++;
  320.         }
  321.     }
  322.     return count
  323. }
  324.  
  325. function wordMatchesPercent(words, text){
  326.     words = words.toLowerCase();
  327.     text = text.toLowerCase();
  328.     wordsArray = words.split(" ");
  329.     textArray = text.split(" ");
  330.     wordsArray = wordsArray.filter(function(elem, pos) {
  331.         return wordsArray.indexOf(elem) == pos;
  332.     })
  333.     var count = 0;
  334.     for (k in wordsArray){
  335.         for(var i = 0; i < textArray.length; ++i){
  336.             if(textArray[i] == wordsArray[k])
  337.                 count++;
  338.         }
  339.     }
  340.     return (textArray.length > 0 ? count/textArray.length : 0)
  341. }
  342.  
  343. function sigmoid(t) {
  344.     return 1/(1+Math.pow(Math.E, -t));
  345. }
  346.  
  347. function scale(n, max){
  348.     return (n > max ? 1 : (n < 0 ? 0 : n/max));
  349. }
  350.  
  351. function getInput(rawExample){
  352.     var example = rawExample.thread;
  353.     var question = rawExample.question;
  354.     var featureVector = {
  355.         totalResults: (rawExample.totalResults ? rawExample.totalResults : 0),
  356.         resultsRecorded: (rawExample.totalResults ? 1 : 0),
  357.         /*isFirst: (rawExample.threadNum == 0 ? 1 : 0),
  358.         firstAnswers: 1-scale(rawExample.threadNum, 7),*/
  359.         noComments: (example.num_comments == 0 ? 1 : 0),
  360.         manyComments: scale(example.num_comments, 5),
  361.         searchRank: 1-rawExample.threadNum/100,
  362.         score: scale(example.score, 3000),
  363.         /*downs: scale(example.downs, 3000),
  364.         ups: scale(example.ups, 3000),
  365.         edited: (example.edited ? 1 : 0),*/
  366.         is_self: (example.is_self ? 1 : 0),
  367.         comments: scale(example.num_comments,20000),
  368.         over_18: (example.over_18 ? 1 : 0),
  369.         questionLength: scale(numwords(question),200/5),
  370.         selfTextLength: scale(numwords(example.selftext),10000/5),
  371.         titleLength: scale(numwords(example.title), 300/5),
  372.         Title1gramMatches: matchMarkovPercent(question, example.title, 1),
  373.         Title2gramMatches: matchMarkovPercent(question, example.title, 2),
  374.         Title3gramMatches: matchMarkovPercent(question, example.title, 3),
  375.         Self1gramMatches: matchMarkovPercent(question, example.selftext, 1),
  376.         Self2gramMatches: matchMarkovPercent(question, example.selftext, 2),
  377.         Self3gramMatches: matchMarkovPercent(question, example.selftext, 3),
  378.         /*titleWordMatches: scale(wordMatches(question, example.title), 15),
  379.         selfTextWordMatches: scale(wordMatches(question, example.selftext),30),
  380.         titleWordMatchesPercent: wordMatchesPercent(question, example.title),
  381.         selfTextWordMatchesPercent: wordMatchesPercent(question, example.selftext)*/
  382.     };
  383.     return featureVector;
  384. }
  385.  
  386. //extract features
  387. function extract(rawDataset){
  388.     var dataset = [];
  389.     for (k in rawDataset){
  390.         var example = rawDataset[k].thread;
  391.         if ("label" in rawDataset[k]){
  392.             var question = rawDataset[k].question;
  393.             var featureVector = getInput(rawDataset[k]);
  394.                 var trainExample = {input: featureVector, output: (rawDataset[k].label == "positive" ? [1] : [0])};
  395.             dataset.push(trainExample);
  396.         }
  397.     }
  398.     console.log("Done extracting.");
  399.     return dataset;
  400. }
  401.  
  402. function save(data, filename){
  403.     fs.writeFile(filename, data, function(err) {
  404.     if(err) {
  405.         console.log(err);
  406.     } else {
  407.         console.log("The file was saved!");
  408.     }
  409. });
  410. }
  411.  
  412. // Get the lib
  413. var irc = require("irc");
  414.  
  415. // Create the bot name
  416. var bot = new irc.Client(config.server, config.botName, {
  417.     channels: config.channels,
  418.     sasl: config.sasl,
  419.     secure: config.secure,
  420.     userName: config.botName,
  421.     nick: config.botName,
  422.     password: config.password
  423. });
  424.  
  425. function getCommand(text){
  426.     if (text.indexOf("!") == 0){
  427.         if (text.indexOf(" ") > 0){
  428.             return [text.slice(1, text.indexOf(" ")), text.slice(text.indexOf(" ")+1, text.length)];
  429.         } else {
  430.             return [text.slice(1, text.length), ""];
  431.         }
  432.     } else {
  433.         return ["", text];
  434.     }
  435. }
  436.  
  437. function answer(to, question){
  438.     console.log("answering")
  439.     var callback1 = function(output, threadDat, threadNum, commentDat, commentNum, totalResults, prob){
  440.         if (threadDat){
  441.             rawDataset.push({question: question, thread: threadDat, comment: commentDat, threadNum: threadNum, commentNum: commentNum, totalResults: totalResults});
  442.             if (!commentDat){
  443.                 rawDataset[rawDataset.length-1].label = "negative";
  444.             }
  445.             if (!(to in activeChannels)){
  446.                 activeChannels[to] = {};
  447.                 //console.log("adding " + to + " to active channels");
  448.             }
  449.             activeChannels[to].last = rawDataset.length-1;
  450.             //console.log("Changing " + to + ".last to " + (rawDataset.length-1));
  451.             //console.log(JSON.stringify(activeChannels));
  452.             activeChannels[to].details = {Title: threadDat.title, Link: "http://www.reddit.com"+threadDat.permalink, SearchResultNumber: threadNum+1, CommentNumber: commentNum+1, TotalResults: totalResults, EstimatedProbability: prob};
  453.             //console.log(JSON.stringify(activeChannels));
  454.             //console.log("Changing " + to + ".details to " + activeChannels[to].details);
  455.         }
  456.         bot.say(to, output);
  457.     }
  458.     if (released < 2000){
  459.         getSearch(question, subredditList, callback1);
  460.     } else {
  461.         setTimeout(function(){answer(to, question);}, released+10);
  462.     }
  463. }
  464.  
  465. // Listen for any message
  466. bot.addListener("message", function(from, to, text, message) {
  467.     //detect command and splice command
  468.     var commandCut = getCommand(text);
  469.     var command = commandCut[0];
  470.     var text = commandCut[1];
  471.     console.log(command, text);
  472.     if (to == config.botName){
  473.         var replyTo = from;
  474.     } else {
  475.         var replyTo = to;
  476.     }
  477.     if (command == "boobs"){
  478.         bot.say(replyTo, "(.Y.)")
  479.     }
  480.     if (command == "hillclimb"){
  481.         bot.say(replyTo, "Climbing hills!...");
  482.         var gens = 100;
  483.         if (text){
  484.             vals = JSON.parse("["+text+"]");
  485.             if (vals[0]) {
  486.                 gens = vals[0];
  487.             }
  488.         }
  489.         var callback = function(){bot.say(replyTo, JSON.stringify(networkSettings));};
  490.         hillClimb(rawDataset, 0.3, gens, 0.5, callback, (vals[1] ? vals[1]*1000 : 0), (vals[2] ? vals[2] : 60))
  491.     }
  492.     //if (command == "review")
  493.        
  494.     //
  495.     if (command == "say"){
  496.         var txt = text.split(" ");
  497.         bot.say(txt[0], txt.splice(1,text.length).join(" "))
  498.     }
  499.     if (command == "results"){
  500.         if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  501.             bot.say(replyTo, "Picked " + activeChannels[replyTo].details.SearchResultNumber.toString() + " of " + activeChannels[replyTo].details.TotalResults.toString() + " results.");
  502.         }
  503.     }
  504.     if (command == "prob"){
  505.         if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  506.             bot.say(replyTo, "Estimated Probability: " + (activeChannels[replyTo].details.EstimatedProbability *100).toString().slice(0, 3) + "%");
  507.         }
  508.     }
  509.     if (command == "title"){
  510.         if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  511.             bot.say(replyTo, activeChannels[replyTo].details.Title);
  512.         }
  513.     }
  514.     if (command == "KickTheBucket"){
  515.         bot.say(replyTo, "/me kicks pail.");
  516.     }
  517.     if (command == "train"){
  518.         if (text.length > 0){
  519.             var value = JSON.parse("["+text+"]");
  520.             networkSettings.layers = value[0];
  521.             networkSettings.learningRate = (value[1] ? value[1] : networkSettings.learningRate);
  522.             networkSettings.threshold = (value[2] ? value[2] : networkSettings.threshold);
  523.             /*net = new brain.NeuralNetwork({
  524.                 hiddenLayers: values[0],
  525.                 learningRate: (values[1] ? values[1] : 0.3)
  526.             })*/;}
  527.         var dataset = extract(rawDataset);
  528.         //net = makeNet(networkSettings, dataset);
  529.         var result = net.train(dataset, {
  530.           errorThresh: networkSettings.threshold,  // error threshold to reach
  531.           iterations: networkSettings.iterations,   // maximum training iterations
  532.           log: true,           // console.log() progress periodically
  533.           logPeriod: 5000        // number of iterations between logging
  534.         })
  535.         bot.say(replyTo, JSON.stringify(result));
  536.         //bot.say(replyTo, "Trained");
  537.     }
  538.     if (command == "details"){
  539.         console.log("This part is working, command details recognized.")
  540.         //console.log(JSON.stringify(activeChannels));
  541.         if (replyTo in activeChannels && "details" in activeChannels[replyTo]){
  542.             bot.say(replyTo, JSON.stringify(activeChannels[replyTo].details));
  543.         }
  544.     }
  545.     if (command == 'ShowMeYourBrain'){
  546.         bot.say(replyTo, JSON.stringify(net.toJSON()));
  547.     }
  548.     if (command == "login"){
  549.         bot.say("NickServ", "nick AMAbot");
  550.         setTimeout(function(){bot.say("NickServ", "identify 1robot");}, 5000);
  551.     }
  552.     if (command == "save"){
  553.         console.log("saving...");
  554.         bot.say(replyTo, "Saving...")
  555.         save(JSON.stringify(rawDataset), "C:\\Users\\Daniel\\Documents\\Programming\\AMAbotData.txt");
  556.     }
  557.     if (command == "yes" || command == "no"){
  558.         if (replyTo in activeChannels && "last" in activeChannels[replyTo]){
  559.             rawDataset[activeChannels[replyTo].last].label = (command == "yes" ? "positive" : "negative")
  560.         }
  561.     } else if (to == config.botName && from != config.botName && command == ""){
  562.         console.log(from, command, text);
  563.         answer(from, text);
  564.     } else if (command == "ask"){
  565.         console.log(from, command, text);
  566.         answer(replyTo, text);
  567.     }
  568. });
  569.  
  570. function getSearch(question, subreddits, callback1){
  571.     question2 = encodeURIComponent(question);
  572.     var options = {
  573.       host: 'www.reddit.com',
  574.       path: '/r/'+subreddits[0]+'/search.json?q=' + question2 + '&restrict_sr=on&sort=relevance&t=all&limit=100',
  575.       headers: {'user-agent': '/u/Noncomment IRC bot \'AMAbot\'; #futurology, #bottest'}
  576.     };
  577.  
  578.     callback = function(response) {
  579.       var str = '';
  580.  
  581.       //another chunk of data has been recieved, so append it to `str`
  582.       response.on('data', function (chunk) {
  583.         str += chunk;
  584.       });
  585.  
  586.       //the whole response has been recieved
  587.       response.on('end', function () {
  588.         var search = JSON.parse(str);
  589.         if (search.data.children.length < 1){
  590.             if (subreddits.length>1){
  591.                 subreddits = subreddits.slice(1, subreddits.length);
  592.                 setTimeout(function(){getSearch(question, subreddits, callback1);}, 50);
  593.             } else {
  594.                 callback1("Sorry I don't know.", false, 0, false, 0, 0, 0);
  595.             }
  596.         } else {
  597.             var children = search.data.children;
  598.             var best = 0;
  599.             var bestNum = 0;
  600.             var bestThread = children[0].data;
  601.             var bestDat;
  602.             for (num=0;num<children.length;num++){
  603.                 var threadDat = children[num].data;
  604.                 var example = {question: question, thread: threadDat, threadNum: num};
  605.                 var test = getInput(example);
  606.                 var prob = net.run(test)[0];
  607.                 console.log(num, prob);
  608.                 if (prob > best){
  609.                     best = prob;
  610.                     bestNum = num;
  611.                     bestThread = threadDat;
  612.                     bestDat = test;
  613.                 }
  614.             }
  615.             console.log(bestDat);
  616.             console.log("Picking: ", bestNum, best);
  617.             setTimeout(function(){getComment(bestThread.permalink, callback1, bestThread, bestNum, children.length, best);}, 50);
  618.         }
  619.       });
  620.     }
  621.     released += 2000;
  622.     setTimeout(function(){released += -2000;}, 2000);
  623.     http.request(options, callback).end();
  624. }
  625.  
  626. function getComment(permalink, callback1, threadDat, threadNum, totalResults, prob){
  627.     console.log(permalink)
  628.     var options = {
  629.       host: 'www.reddit.com',
  630.       path: permalink + ".json",
  631.       headers: {'user-agent': '/u/Noncomment IRC bot \'AMAbot\'; #futurology, #bottest'}
  632.     };
  633.  
  634.     callback = function(response) {
  635.       var str = '';
  636.  
  637.       //another chunk of data has been recieved, so append it to `str`
  638.       response.on('data', function (chunk) {
  639.         str += chunk;
  640.       });
  641.  
  642.       //the whole response has been recieved
  643.       response.on('end', function () {
  644.         var search = JSON.parse(str);
  645.         var i = 0;
  646.         var comments = search[1].data.children;
  647.         while (i<comments.length){
  648.             var comment = comments[i].data.body;
  649.             console.log(comment);
  650.             var completed = false
  651.             if (!(comment == "[deleted]") && comment.length < maxLength){
  652.                 commentDat = comments[i].data;
  653.                 callback1(comment, threadDat, threadNum, commentDat, i, totalResults, prob);
  654.                 completed = true;
  655.                 break;
  656.             }
  657.             i++
  658.         }
  659.         if (!completed){
  660.             callback1("Sorry this knowledge is forbidden.", threadDat, threadNum, false, 0, totalResults, prob)
  661.         }
  662.       });
  663.     }
  664.     released += 2000;
  665.     setTimeout(function(){released += -2000;}, 2000);
  666.     http.request(options, callback).end();
  667. }
  668. load()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement