From 450d675a249f3f6d41193b5e157988640fbac6fb Mon Sep 17 00:00:00 2001 From: ugik Date: Sat, 30 Sep 2017 16:41:25 -0400 Subject: [PATCH] Rx chat-bot --- Rx_training_data | Bin 0 -> 2269 bytes Rxmodel.tflearn.data-00000-of-00001 | Bin 0 -> 5373 bytes Rxmodel.tflearn.index | Bin 0 -> 887 bytes Rxmodel.tflearn.meta | Bin 0 -> 131013 bytes Tensorflow Rx chat-bot (build model).ipynb | 271 ++++++ Tensorflow Rx chat-bot (response).ipynb | 909 +++++++++++++++++++++ Tensorflow chat-bot model.ipynb | 38 +- Tensorflow chat-bot response.ipynb | 51 +- checkpoint | 4 +- intents_Rx.json | 31 + tflearn toy ANN-2.ipynb | 40 +- training_data | Bin 4055 -> 4055 bytes 12 files changed, 1284 insertions(+), 60 deletions(-) create mode 100644 Rx_training_data create mode 100644 Rxmodel.tflearn.data-00000-of-00001 create mode 100644 Rxmodel.tflearn.index create mode 100644 Rxmodel.tflearn.meta create mode 100644 Tensorflow Rx chat-bot (build model).ipynb create mode 100644 Tensorflow Rx chat-bot (response).ipynb create mode 100644 intents_Rx.json diff --git a/Rx_training_data b/Rx_training_data new file mode 100644 index 0000000000000000000000000000000000000000..ab9ebdf5e62a4b1b10cb62969a5ba7c49ec0c0b3 GIT binary patch literal 2269 zcmb7^*K^uH5XOaZOYgl`E6wS>_dW?3DyCd-HmS&dR|Y6^yCG$LDHfRa=Bd@_2@$n|24=i6 zr5#bnEPJA+AFPC!6W$Ef2eMZWF<-?7*PEhzp@WSo2(ig4QN_n*R{B9qqqcCu^{Q>r+kikohQ z0`)`bE!E``rMGSI9b0_Y7T>ee``YVNN`!i#Q#JRYPF43&lBSE0__3WnvBgjA?laZZ zJ3rTAHRy%eH81i9FROS(7kRA>$r%z#x`#T-$V@3pxt@8~HzqW_?+`kx>qw8*19Y99 zbe6XnR0|D3y05B?>!&J$zB3MFA(BH(hS4KaH9;%crsjr4xY2c8jD$>V*(v-T1%1Z5%iPs*Oz`MQ)I^3@T6*YjQ1kw=Sg1Qu;hM2M!*UB z#fBEnAA%JQBIs8eS}0wGnq$paJCpxP-_{G&X8p{A6X^Hx(7a9K3Z4Z0p`nvmi&RFP lpg%R#{EmiX^_Ka)OidP3M9^OuG;g!>%xKq#G9mhl{{iWgpBDfC literal 0 HcmV?d00001 diff --git a/Rxmodel.tflearn.data-00000-of-00001 b/Rxmodel.tflearn.data-00000-of-00001 new file mode 100644 index 0000000000000000000000000000000000000000..d8f8bce545035274a92d263b920779ebfb2885b3 GIT binary patch literal 5373 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 literal 0 HcmV?d00001 diff --git a/Rxmodel.tflearn.meta b/Rxmodel.tflearn.meta new file mode 100644 index 0000000000000000000000000000000000000000..8519b7184a4646f3c602c33c4eb618cae9a4b5ac GIT binary patch literal 131013 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\", state_begin)\n", + "\n", + " return {\"city\": resp[city_begin:city_end], \"state\":resp[state_begin:state_end] }\n", + "\n", + " return\n", + "\n", + "# scrape YP for business address information\n", + "def find_biz(term, location, debug=False):\n", + " biz_list = []\n", + " term_url = term.replace(' ', '+')\n", + " location = location.replace(' ', '+')\n", + "\n", + " url = \"http://www.yellowpages.com/search?search_terms=%s&geo_location_terms=%s&s=distance\" % (term_url, location)\n", + " if debug: print (url)\n", + " \n", + " status, response = http.request(url)\n", + " r = response.decode(\"utf-8\")\n", + " \n", + " body = r.index('Any of these sound right?\")\n", + " any_loc = resp.index('\">', any_loc) +2\n", + " suggest = resp[any_loc:resp.index('<', any_loc)]\n", + " # if multiple words, return first\n", + " if len(suggest.split(\" \")) > 1:\n", + " return suggest.split(\" \")[0]\n", + " else:\n", + " # if name is correct then return it\n", + " return suggest\n", + " except:\n", + " # return blank if any issues\n", + " print (\"error in look_for_suggestions()\")\n", + " return \"\"\n", + "\n", + "# find prices for Rx in the soup content\n", + "def find_prices(soup):\n", + " priceRows = soup.find_all(\"div\", {\"event-id\": \"priceRow\"})\n", + " price_list = []\n", + " \n", + " for p in priceRows:\n", + " line = {}\n", + " line['store'] = p.find(\"div\", {\"class\": \"store-name\"}).string\n", + " if p.find(\"div\", {\"class\": \"drug-qualifier\"}):\n", + " line['qualifier'] = p.find(\"div\", {\"class\": \"drug-qualifier\"}).string\n", + " else:\n", + " line['qualifier'] = ''\n", + "\n", + " # the 1st price is cash, 2nd (if applicable) is coupon\n", + " if p.find(\"span\", {\"class\": \"drug-price\"}):\n", + " line['price'] = p.findAll(\"span\", {\"class\": \"drug-price\"})[-1].find(\"span\", {\"class\":\"font-weight-medium\"}).string\n", + " else:\n", + " line['price'] = \"0\"\n", + " \n", + " if len(p.find(\"span\", {\"class\": \"drug-price\"})) == 2:\n", + " line['cash-price'] = p.findAll(\"span\", {\"class\": \"drug-price\"})[0].find(\"span\", {\"class\":\"font-weight-medium\"}).string\n", + " else:\n", + " line['cash-price'] = \"0\"\n", + "\n", + " coupon_section = p.find(\"button\")\n", + " \n", + " if coupon_section.has_attr('data-href'):\n", + " line['href'] = \"https://www.goodrx.com\" +coupon_section['data-href']\n", + " else:\n", + " line['href'] = ''\n", + " \n", + " # ignore membership types\n", + " if 'Membership' not in line['qualifier'] and line['price'] != '$':\n", + " price_list.append(line)\n", + "\n", + " return price_list\n", + "\n", + "# scrape GoodRx for name of Rx\n", + "def lookup_GoodRx_name(drug, r=None):\n", + " if not r:\n", + " status, response = http.request(\"https://www.goodrx.com/%s\" % drug.replace(' ','+') )\n", + " r = response.decode(\"utf-8\")\n", + " # check for failed lookup\n", + " if \"everywhere\" in r:\n", + " return look_for_suggestions(r)\n", + " else:\n", + " return drug\n", + "\n", + "# scrape GoodRx for drug prices\n", + "def lookup_GoodRx_prices(drug, dosage=None):\n", + " prices = []\n", + " if dosage:\n", + " status, response = http.request(\"https://www.goodrx.com/%s?dosage=%s\" % (drug, dosage))\n", + " else:\n", + " status, response = http.request(\"https://www.goodrx.com/%s\" % drug)\n", + " \n", + " soup = BeautifulSoup(response, 'html.parser')\n", + " resp = response.decode(\"utf-8\")\n", + " # check for failed lookup\n", + " if lookup_GoodRx_name(drug, resp) != drug:\n", + " print (\"do you mean '%s'?\" % lookup_GoodRx_name(drug, resp))\n", + " else:\n", + " price_list = find_prices(soup)\n", + " price_list = sorted(price_list, key=lambda k: float(k['price']))\n", + " price_range = \"Price range: $%s - $%s\" % (price_list[0]['price'], price_list[len(price_list)-1]['price'])\n", + " prices.append(price_range)\n", + " for p in price_list:\n", + " prices.append({\"store\": p['store'], \"price\": p['price'], \"cash-price\": p['cash-price'], \"qualifier\": p['qualifier'], \"href\": p['href']})\n", + " return prices\n", + "\n", + "# lookup location for business near city/state on a price list\n", + "def lookup_biz_list(price_list, city, state, debug=False):\n", + " if not price_list:\n", + " return {}\n", + " \n", + " PRICE_RANGE = 1.3 # within 30% of lowest price\n", + " result_list = []\n", + " low_price = 0\n", + " # skip 1st entry (price range)\n", + " for p in price_list[1:]:\n", + " store = p['store']\n", + " # clean up store labels\n", + " if \"(CVS)\" in store:\n", + " store = store.replace('(CVS)', '')\n", + " if \"Pharmacy\" in store:\n", + " store = store.replace('Pharmacy', '')\n", + " if 'Sams' in store:\n", + " store = store.replace('Sams', \"Sam's\")\n", + " if 'Rite-Aid' in store:\n", + " store = store.replace('Rite-Aid', 'Rite Aid')\n", + "\n", + " if debug: print (store, city, state)\n", + " biz = find_biz(term = store, location = city + '+' + state, debug=debug)\n", + " \n", + " if biz:\n", + " #print (p['store'], '$'+p['price'], biz[0]['city'], biz[0]['state'], biz[0]['address'], \"{0:.2f}mi\".format(biz[0]['distance']) )\n", + " result_list.append({\"store\": p['store'], \"price\": p['price'], \"cash-price\": p['cash-price'], \"city\": biz[0]['city'], \"address\": biz[0]['address'], \"state\": biz[0]['state'], \"coupon\": p['href']})\n", + " if low_price == 0 or float(p['price']) < low_price * PRICE_RANGE:\n", + " low_price = float(p['price'])\n", + " else:\n", + " break\n", + "\n", + " if result_list:\n", + " cheapest_coupon = sorted([r for r in result_list if float(r['price']) < float(result_list[0]['price'])*PRICE_RANGE], key=lambda k: float(k['price']))\n", + " cheapest_cash = sorted([r for r in result_list if float(r['price']) < float(result_list[0]['price'])*PRICE_RANGE], key=lambda k: float(k['cash-price']))\n", + "\n", + " return {\"best-coupon\": cheapest_coupon[0], \"best-cash\": cheapest_cash[0], \"list\": result_list}\n", + " \n", + "# figure out best price\n", + "def best_price(price_list, city, state):\n", + " best_coupon = lookup_biz_list(price_list, city, state, debug=False)['best-coupon']\n", + " best_cash = lookup_biz_list(price_list, city, state, debug=False)['best-cash']\n", + " \n", + " # try comparing prices, if error return coupon price\n", + " try:\n", + " if float(best_cash['cash-price']) <= float(best_coupon['price']):\n", + " best_cash['price'] = best_cash['cash-price']\n", + " best_cash['type'] = 'cash'\n", + " best_cash.pop(\"cash-price\", 'one price')\n", + " best_cash.pop(\"coupon\", 'no coupon')\n", + " return best_cash\n", + " else:\n", + " best_coupon['type'] = 'coupon'\n", + " best_coupon.pop(\"cash-price\", 'no price')\n", + " return best_coupon\n", + " except:\n", + " best_coupon['type'] = 'coupon'\n", + " best_coupon.pop(\"cash-price\", 'no price')\n", + " return best_coupon\n", + "\n", + "# lookup price range from a price list\n", + "def lookup_price_range(price_list):\n", + " return price_list[0]\n", + "\n", + "# lookup best price from a price list\n", + "def lookup_best_price(price_list, city, state):\n", + " return lookup_biz_list(price_list, city, state)['best']\n", + "\n", + "# list of best prices from a price list\n", + "def lookup_best_prices(price_list,city, state):\n", + " return lookup_biz_list(price_list, city, state)['list']\n" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# restore all of our data structures\n", + "import pickle\n", + "data = pickle.load( open( \"Rx_training_data\", \"rb\" ) )\n", + "words = data['words']\n", + "classes = data['classes']\n", + "train_x = data['train_x']\n", + "train_y = data['train_y']\n", + "\n", + "# import our chat-bot intents file\n", + "import json\n", + "with open('intents_Rx.json') as json_data:\n", + " intents = json.load(json_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "# Build neural network structure\n", + "net = tflearn.input_data(shape=[None, len(train_x[0])])\n", + "net = tflearn.fully_connected(net, 8)\n", + "net = tflearn.fully_connected(net, 8)\n", + "net = tflearn.fully_connected(net, len(train_y[0]), activation='softmax')\n", + "net = tflearn.regression(net)\n", + "\n", + "# Define model and setup tensorboard\n", + "model = tflearn.DNN(net, tensorboard_dir='tflearn_logs')" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "# clean up a sentence with stemming and lower-case\n", + "def clean_up_sentence(sentence):\n", + " # tokenize the pattern\n", + " sentence_words = nltk.word_tokenize(sentence)\n", + " # stem each word\n", + " sentence_words = [stemmer.stem(word.lower()) for word in sentence_words]\n", + " return sentence_words\n", + "\n", + "# return bag of words array: 0 or 1 for each word in the bag that exists in the sentence\n", + "def bow(sentence, words, show_details=False):\n", + " # tokenize the pattern\n", + " sentence_words = clean_up_sentence(sentence)\n", + " # bag of words\n", + " bag = [0]*len(words) \n", + " for s in sentence_words:\n", + " for i,w in enumerate(words):\n", + " if w == s: \n", + " bag[i] = 1\n", + " if show_details:\n", + " print (\"found in bag: %s\" % w)\n", + "\n", + " return(np.array(bag))" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# load our saved model\n", + "model.load('./Rxmodel.tflearn')" + ] + }, + { + "cell_type": "code", + "execution_count": 178, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# create a dictionary to hold user context\n", + "context = {}\n", + "\n", + "# ignore classifications with a probability BELOW a set threshold \n", + "ERROR_THRESHOLD = 0.25\n", + "\n", + "# generate an intent classification for a sentence\n", + "def classify(sentence):\n", + " # generate probabilities from the model\n", + " results = model.predict([bow(sentence, words)])[0]\n", + " # filter out predictions below a threshold\n", + " results = [[i,r] for i,r in enumerate(results) if r>ERROR_THRESHOLD]\n", + " # sort by strength of probability\n", + " results.sort(key=lambda x: x[1], reverse=True)\n", + " return_list = []\n", + " for r in results:\n", + " return_list.append((classes[r[0]], r[1]))\n", + " # return tuple of intent and probability\n", + " return return_list\n", + "\n", + "# process contextual response, userID is unique cell # (eg. SMS conversation)\n", + "def response(sentence, userID='5612779900', show_details=False):\n", + " # establish a context for each unique userID (cell #)\n", + " if userID not in context:\n", + " context[userID] = {}\n", + " \n", + " # check if the most recent context is a get... if so we take the response\n", + " if 'context' in context[userID] and 'get' in context[userID]['context']:\n", + " # the label is what's after the 'get'\n", + " label = context[userID]['context'].replace('get', '')\n", + " context[userID][label] = sentence\n", + " # transfer control to the corresponding intent to handle the response\n", + " next_intent = \"handle%s\" % label\n", + " results = [(next_intent, 1.0)]\n", + " \n", + " else:\n", + " results = classify(sentence)\n", + " # loop as long as there are matches to process\n", + " while results:\n", + " for i in intents['intents']:\n", + " # find a tag matching the first result\n", + " if i['tag'] == results[0][0]:\n", + " # set context for this intent if necessary\n", + " if 'context' in i:\n", + " if show_details: print ('context:', i['context'])\n", + " \n", + " # handle an informational context\n", + " if 'handle' in i['context']:\n", + " label = i['context'].replace('handle', '')\n", + " location = lookup_number(userID)\n", + " if show_details:\n", + " print (' location', userID, location) \n", + " \n", + " # get GoodRx store/price list\n", + " price_list = lookup_GoodRx_prices(lookup_GoodRx_name(context[userID][label]))\n", + " if show_details:\n", + " print (' looking up', context[userID][label])\n", + "\n", + " best = None\n", + " if price_list:\n", + " # determine the best price for our location\n", + " best = best_price(price_list, location['city'], location['state'])\n", + "\n", + " if show_details:\n", + " print (best)\n", + " if best:\n", + " # formulate response\n", + " response = \"best price on %s is $%s (%s) at %s, %s %s\" % \\\n", + " (lookup_GoodRx_name(context[userID][label]), best['price'], best['type'], \\\n", + " best['store'], best['address'], best['city'])\n", + " if 'coupon' in best:\n", + " context[userID]['coupon'] = best['coupon']\n", + " del context[userID]['context']\n", + " return response\n", + " \n", + " # handle a coupon request\n", + " elif 'coupon' in i['context']:\n", + " if 'coupon' in context[userID]:\n", + " response = \"use this coupon: %s\" % context[userID]['coupon']\n", + " del context[userID]['coupon']\n", + " return response\n", + "\n", + " else:\n", + " context[userID]['context'] = i['context']\n", + "\n", + " if show_details: print ('tag:', i['tag'])\n", + " # a random response from the intent\n", + " if i['responses']:\n", + " return print(random.choice(i['responses']))\n", + "\n", + " results.pop(0)" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'city': 'JUPITER', 'state': 'FL'}" + ] + }, + "execution_count": 160, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lookup_number('5612779900')" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'address': '2144 W Indiantown Rd',\n", + " 'city': 'Jupiter',\n", + " 'state': 'FL',\n", + " 'zip': '33458'}]" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "find_biz('Walmart', 'Jupiter FL')" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'Lipitor'" + ] + }, + "execution_count": 162, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lookup_GoodRx_name('lipator')" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "['Price range: $40.56 - $61.65',\n", + " {'cash-price': '40.56',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/MxNK-p_B5GtFbCNoh-vXQR1zrU_dds2hx0zObPdIom_4s9H-etlAAio9ZaTkVeozOZuJH-ljFOV2eYdovJ3ZeXi66kay0foN5FatwkOYtK83aUEL-Gn6fQ%3D%3D',\n", + " 'price': '40.56',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'Costco'},\n", + " {'cash-price': '110',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/MVfDKLwA4HANVkrJn0s71mKnF_KSjOONDNOaT9vIwXb83rou29G7DStCnY_HatZXcIVtxJtTrJIn0CtFwwBvuwOpBZ6FZSGsQ5SoP-EgfdcYZH3yH77Epw%3D%3D',\n", + " 'price': '40.66',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'Safeway'},\n", + " {'cash-price': '103',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/glBGo9W1U1hjQieIANd-lXl16idtN5soHUqR5E5tGR-RvWCuk3XtLIYmRl3kD3jv9CAFQ8W6VIk7_MtDJkjLYaO_8Y8KnUsSu8VINYvZrdfTXsrU',\n", + " 'price': '40.91',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'Kroger Pharmacy'},\n", + " {'cash-price': '41.00',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/ygLcy7C92X9PFZoCkstiMtXyfjV3DRnH2HJXFsRV43BdTiBdZbN0AYVQ5s4kJeK4aeCl138xqpSxU3Es8UNdo66rgzOqzE4iuAoi',\n", + " 'price': '41.00',\n", + " 'qualifier': 'with free Discount',\n", + " 'store': 'Walgreens'},\n", + " {'cash-price': '84',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/kUqHrgLaM6CP2tUESw5F4kvXh3Cp8gWBTzU_91YFCCZEmVH8gDQ4JPpom-N37gilcUNUl_PII-adJ24HW4JUuDG7RQq77oW3MRpZfQ5CU_07',\n", + " 'price': '45.46',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'CVS Pharmacy'},\n", + " {'cash-price': '84',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/XNPa-_13azxQsmBJsnbYCakWX6hAiSf3-5pKHLkntKXowh8zh84sxIbgxr94vSQNBBz5EkmDAaF7jUId7NALrE__bbfixd_RGcc%3D',\n", + " 'price': '48.10',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'Target (CVS)'},\n", + " {'cash-price': '55.70',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/ZelwqQnhxopzPOUL0iUewj_uxic1T1CZ-D9RADheZJZZqGXGyjFNZ3b1LWbr1_MCH7dyFkcXE8S-asVGXjcPpvTPIUX86ZBQZL8%3D',\n", + " 'price': '55.70',\n", + " 'qualifier': 'with free Discount',\n", + " 'store': 'Walmart'},\n", + " {'cash-price': '61.65',\n", + " 'href': 'https://www.goodrx.com/coupon/dispatch/lE8PvKeTZVo0oGXYTFJUlbQRaWQP1PyJchDq0Sos8HCHDC-VNQtzZIBp-o-G0bl42_E2FzO69a8R04s_G_JvYSrK6Ne8nVuGffOZMd0F',\n", + " 'price': '61.65',\n", + " 'qualifier': 'with free Coupon',\n", + " 'store': 'Kmart'}]" + ] + }, + "execution_count": 183, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "lookup_GoodRx_prices('Adderall')" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'address': '1201 S Dixie Hwy',\n", + " 'city': 'Lantana',\n", + " 'coupon': 'https://www.goodrx.com/coupon/dispatch/leInNbCoEnRpqn1eMXVdopKKx4rEVDBrFp_a_nUaN52ySrkLasbkrhT7FLycOEfHDphVdCn-OIq5kCgVpe271Tlq373rgks_UPXn',\n", + " 'price': '8.63',\n", + " 'state': 'FL',\n", + " 'store': 'Kmart',\n", + " 'type': 'coupon'}" + ] + }, + "execution_count": 163, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "name = \"ambien\"\n", + "price_list = lookup_GoodRx_prices(lookup_GoodRx_name(name))\n", + "if price_list:\n", + " best = best_price(price_list, \"Jupiter\", \"FL\")\n", + "\n", + "best" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[('greeting', 0.9999843835830688)]" + ] + }, + "execution_count": 164, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "classify('hi there, anyone home?')" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hi there\n" + ] + } + ], + "source": [ + "response('hi there, anyone home?')" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "What's the name of the medication?\n" + ] + } + ], + "source": [ + "response('looking for inexpensive meds')" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "context: handleRx\n", + " location 5612779900 {'state': 'FL', 'city': 'JUPITER'}\n", + " looking up lipitor\n", + "{'price': '10.55', 'type': 'coupon', 'store': 'Safeway', 'city': 'Jupiter', 'address': '709 Commerce Way W', 'state': 'FL', 'coupon': 'https://www.goodrx.com/coupon/dispatch/8BI34djdRjZfhn6VCTT8TcV_AueHH5T6ZLelmRA0TCbB-6lLA5jM_u7D08QeW_TNcCWhSTkdnwFk732U-sNQsjPLr1IP64kp5LUy9mIWdKMZtw%3D%3D'}\n" + ] + }, + { + "data": { + "text/plain": [ + "'best price on lipitor is $10.55 (coupon) at Safeway, 709 Commerce Way W Jupiter'" + ] + }, + "execution_count": 167, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response('lipitor', show_details=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'5612779900': {'Rx': 'lipitor',\n", + " 'coupon': 'https://www.goodrx.com/coupon/dispatch/8BI34djdRjZfhn6VCTT8TcV_AueHH5T6ZLelmRA0TCbB-6lLA5jM_u7D08QeW_TNcCWhSTkdnwFk732U-sNQsjPLr1IP64kp5LUy9mIWdKMZtw%3D%3D'}}" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "context" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "context: coupon\n" + ] + }, + { + "data": { + "text/plain": [ + "'use this coupon: https://www.goodrx.com/coupon/dispatch/8BI34djdRjZfhn6VCTT8TcV_AueHH5T6ZLelmRA0TCbB-6lLA5jM_u7D08QeW_TNcCWhSTkdnwFk732U-sNQsjPLr1IP64kp5LUy9mIWdKMZtw%3D%3D'" + ] + }, + "execution_count": 169, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response('can I have the coupon?', show_details=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'5612779900': {'Rx': 'lipitor'}}" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "context" + ] + }, + { + "cell_type": "code", + "execution_count": 181, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "What's the name of the medication?\n" + ] + } + ], + "source": [ + "response('looking for inexpensive meds')" + ] + }, + { + "cell_type": "code", + "execution_count": 182, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'best price on Adderall is $40.56 (cash) at Costco, 3250 Northlake Blvd Palm Beach Gardens'" + ] + }, + "execution_count": 182, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "response('Aderal')" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "{'5612779900': {'Rx': 'aderrall'}}" + ] + }, + "execution_count": 173, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "context" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No coupon available\n" + ] + } + ], + "source": [ + "response('may I have the coupon?')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/Tensorflow chat-bot model.ipynb b/Tensorflow chat-bot model.ipynb index c679ea0..eb99a15 100644 --- a/Tensorflow chat-bot model.ipynb +++ b/Tensorflow chat-bot model.ipynb @@ -2,11 +2,19 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": { "collapsed": false }, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "hdf5 is not supported on this machine (please install/reinstall h5py for optimal experience)\n" + ] + } + ], "source": [ "# things we need for NLP\n", "import nltk\n", @@ -22,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -36,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": { "collapsed": false }, @@ -83,7 +91,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "metadata": { "collapsed": false }, @@ -124,7 +132,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": { "collapsed": false, "scrolled": true @@ -134,10 +142,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training Step: 3999 | total loss: \u001b[1m\u001b[32m1.00123\u001b[0m\u001b[0m | time: 0.009s\n", - "| Adam | epoch: 1000 | loss: 1.00123 - acc: 0.9098 -- iter: 24/27\n", - "Training Step: 4000 | total loss: \u001b[1m\u001b[32m0.91795\u001b[0m\u001b[0m | time: 0.013s\n", - "| Adam | epoch: 1000 | loss: 0.91795 - acc: 0.9188 -- iter: 27/27\n", + "Training Step: 3999 | total loss: \u001b[1m\u001b[32m0.54986\u001b[0m\u001b[0m | time: 0.008s\n", + "| Adam | epoch: 1000 | loss: 0.54986 - acc: 0.9616 -- iter: 24/27\n", + "Training Step: 4000 | total loss: \u001b[1m\u001b[32m0.50465\u001b[0m\u001b[0m | time: 0.011s\n", + "| Adam | epoch: 1000 | loss: 0.50465 - acc: 0.9654 -- iter: 27/27\n", "--\n", "INFO:tensorflow:/home/gk/gensim/notebooks/model.tflearn is not in all_model_checkpoint_paths. Manually adding it.\n" ] @@ -162,7 +170,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 6, "metadata": { "collapsed": true }, @@ -193,7 +201,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -216,7 +224,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": { "collapsed": false }, @@ -225,7 +233,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[0.01907932758331299, 1.0800805583244255e-08, 0.0016339969588443637, 1.445684461032215e-09, 0.6044806838035583, 1.0841611128853401e-06, 2.067307436348642e-09, 6.506108093162766e-06, 0.37479835748672485]]\n" + "[[5.111963474746517e-08, 0.00029038049979135394, 0.19395901262760162, 4.018096966262874e-10, 0.7987914085388184, 0.0005724101793020964, 8.153344310812827e-08, 5.96670907127006e-11, 0.0063865589909255505]]\n" ] } ], @@ -235,7 +243,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 9, "metadata": { "collapsed": false }, diff --git a/Tensorflow chat-bot response.ipynb b/Tensorflow chat-bot response.ipynb index 6ec243e..5b55d19 100644 --- a/Tensorflow chat-bot response.ipynb +++ b/Tensorflow chat-bot response.ipynb @@ -195,7 +195,7 @@ { "data": { "text/plain": [ - "[('opentoday', 0.9596946239471436)]" + "[('opentoday', 0.7987914085388184)]" ] }, "execution_count": 8, @@ -218,7 +218,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "We're open every day from 9am-9pm\n" + "Our hours are 9am-9pm every day\n" ] } ], @@ -237,7 +237,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "We accept VISA, Mastercard and AMEX\n" + "We accept most major credit cards\n" ] } ], @@ -256,7 +256,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "We have Piaggio, Vespa and Yamaha mopeds\n" + "We rent Yamaha, Piaggio and Vespa mopeds\n" ] } ], @@ -266,7 +266,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 12, "metadata": { "collapsed": false }, @@ -275,7 +275,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Bye! Come back again soon.\n" + "Have a nice day\n" ] } ], @@ -285,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { "collapsed": false }, @@ -296,7 +296,7 @@ "{}" ] }, - "execution_count": 12, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -307,7 +307,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 14, "metadata": { "collapsed": false }, @@ -326,7 +326,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 15, "metadata": { "collapsed": false }, @@ -337,7 +337,7 @@ "{'123': 'rentalday'}" ] }, - "execution_count": 21, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -349,7 +349,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 16, "metadata": { "collapsed": false }, @@ -358,7 +358,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "For rentals today please call 1-800-MYMOPED\n" + "We accept most major credit cards\n" ] } ], @@ -368,7 +368,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false }, @@ -376,10 +376,10 @@ { "data": { "text/plain": [ - "[('today', 0.5943121910095215)]" + "[('payments', 0.32852643728256226), ('today', 0.3266606032848358)]" ] }, - "execution_count": 16, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -390,7 +390,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 18, "metadata": { "collapsed": false }, @@ -401,7 +401,7 @@ "text": [ "context: \n", "tag: greeting\n", - "Hi there, how can I help?\n" + "Hello, thanks for visiting\n" ] } ], @@ -412,18 +412,25 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "We accept VISA, Mastercard and AMEX\n" + ] + }, { "data": { "text/plain": [ - "[('today', 0.5943121910095215)]" + "[('payments', 0.32852643728256226), ('today', 0.3266606032848358)]" ] }, - "execution_count": 24, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -435,7 +442,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 20, "metadata": { "collapsed": false }, diff --git a/checkpoint b/checkpoint index 1028e31..2fa98a6 100644 --- a/checkpoint +++ b/checkpoint @@ -1,2 +1,2 @@ -model_checkpoint_path: "/home/gk/gensim/notebooks/model.tflearn" -all_model_checkpoint_paths: "/home/gk/gensim/notebooks/model.tflearn" +model_checkpoint_path: "/home/gk/gensim/notebooks/Rxmodel.tflearn" +all_model_checkpoint_paths: "/home/gk/gensim/notebooks/Rxmodel.tflearn" diff --git a/intents_Rx.json b/intents_Rx.json new file mode 100644 index 0000000..0191be4 --- /dev/null +++ b/intents_Rx.json @@ -0,0 +1,31 @@ +{"intents": [ + {"tag": "greeting", + "patterns": ["Hi", "How are you", "Is anyone there?", "Hello", "Good day"], + "responses": ["Hello, thanks for visiting", "Good to see you again", "Hi there"] + }, + {"tag": "goodbye", + "patterns": ["Bye", "See you later", "Goodbye"], + "responses": ["See you later", "Have a nice day", "Bye! Come back again soon."] + }, + {"tag": "thanks", + "patterns": ["Thanks", "Thank you", "That's helpful"], + "responses": ["Happy to help!", "Any time!", "My pleasure"] + }, + {"tag": "med", + "patterns": ["I'm looking for cheap meds", "want to find a deal", "where are the cheapest meds", "where can I buy meds for less money" ], + "responses": ["What's the name of the medication?"], + "context": "getRx" + }, + {"tag": "handleRx", + "patterns": [], + "responses": [], + "context": "handleRx" + }, + {"tag": "coupon", + "patterns": ["what is the coupon", "send me the coupon"], + "responses": ["Sorry, no coupon", "No coupon available"], + "context": "coupon" + } + ] +} + diff --git a/tflearn toy ANN-2.ipynb b/tflearn toy ANN-2.ipynb index f9c337b..737b2a1 100644 --- a/tflearn toy ANN-2.ipynb +++ b/tflearn toy ANN-2.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 28, + "execution_count": 34, "metadata": { "collapsed": false }, @@ -22,8 +22,8 @@ " features.append([[1, 0, 4, 6, 7], [0,1]])\n", " features.append([[1, 0, 3, 7, 8], [0,1]])\n", " features.append([[8, 9, 5, 2, 5], [1,0]])\n", - " features.append([[3, 0, 1, 4, 6], [1,0]])\n", - " features.append([[5, 2, 0, 1, 4], [1,0]])\n", + " features.append([[3, 0, 3, 4, 6], [1,0]])\n", + " features.append([[5, 2, 1, 4, 4], [1,0]])\n", " features.append([[7, 3, 3, 2, 0], [1,0]])\n", " \n", " # shuffle our features and turn into np.array\n", @@ -39,7 +39,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 35, "metadata": { "collapsed": false }, @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 36, "metadata": { "collapsed": false, "scrolled": true @@ -60,10 +60,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "Training Step: 299 | total loss: \u001b[1m\u001b[32m0.00429\u001b[0m\u001b[0m | time: 0.005s\n", - "| Adam | epoch: 100 | loss: 0.00429 - acc: 0.9999 -- iter: 8/9\n", - "Training Step: 300 | total loss: \u001b[1m\u001b[32m0.00418\u001b[0m\u001b[0m | time: 0.008s\n", - "| Adam | epoch: 100 | loss: 0.00418 - acc: 0.9999 -- iter: 9/9\n", + "Training Step: 299 | total loss: \u001b[1m\u001b[32m0.00507\u001b[0m\u001b[0m | time: 0.006s\n", + "| Adam | epoch: 100 | loss: 0.00507 - acc: 1.0000 -- iter: 8/9\n", + "Training Step: 300 | total loss: \u001b[1m\u001b[32m0.00527\u001b[0m\u001b[0m | time: 0.009s\n", + "| Adam | epoch: 100 | loss: 0.00527 - acc: 1.0000 -- iter: 9/9\n", "--\n" ] } @@ -87,7 +87,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 37, "metadata": { "collapsed": false }, @@ -96,25 +96,23 @@ "name": "stdout", "output_type": "stream", "text": [ - "[[0.5716620087623596, 0.42833802103996277]]\n", - "[[5.728960604756139e-05, 0.9999426603317261]]\n", - "[[0.7641104459762573, 0.2358895242214203]]\n", - "[[1.0, 9.998809558098287e-10]]\n", - "[[1.0, 1.2301314480933634e-11]]\n", - "[[0.3441952168941498, 0.6558047533035278]]\n", - "[[0.05228094384074211, 0.9477190375328064]]\n" + "[[0.14985743165016174, 0.8501425385475159]]\n", + "[[0.0002913394710049033, 0.9997085928916931]]\n", + "[[0.6994397640228271, 0.30056023597717285]]\n", + "[[1.0, 1.7667502999322605e-14]]\n", + "[[0.15181590616703033, 0.8481840491294861]]\n", + "[[0.019126782193779945, 0.980873167514801]]\n" ] } ], "source": [ "print(model.predict([[0, 1, 0, 6, 2]]))\n", "print(model.predict([[1, 0, 8, 7, 4]]))\n", - "print(model.predict([[0, 1, 0, 0, 2]])) # wrong\n", + "print(model.predict([[0, 1, 0, 0, 2]])) \n", "\n", - "print(model.predict([[8, 2, 0, 3, 5]]))\n", "print(model.predict([[9, 4, 1, 7, 2]]))\n", - "print(model.predict([[1, 1, 0, 8, 9]])) # wrong\n", - "print(model.predict([[0, 0, 2, 5, 1]])) # wrong" + "print(model.predict([[1, 1, 0, 8, 9]])) \n", + "print(model.predict([[0, 0, 2, 5, 1]]))" ] }, { diff --git a/training_data b/training_data index 875a0c1334c68b29e7ea85cc47c4d53f8376f0df..e2753d159139f8d52e275f90158c459604d194ec 100644 GIT binary patch literal 4055 zcmbVPS9jAe6iz6#l)d*}4SVms_g-cMP-8VVNv&MlZO8-X@YA`vvMM>2lfdCYSKs}H zWIILrGxi%QHE*I)sWjRwNq7R)IxJF1QwV>$$6?G{iv4EHc^XDdSnMsqX&~m}1eSQ? zSkHmJ2eYFs>nRWW3( z9b#JjfoeXi?^4N-bt=TjP34lthaY!XvHcg%)PH7H-})z1|3o~DI&Ib zaMv*99-?=lZL5V( zUUza|9)|23J;Ye(xbjhRam0{ac1W2>OUn8KaSYjA9x|GBk);rg%XhNJ4$%$w$_96h zM)EWlM-16pBS3?O>aH|Tj&^O>8eKpzWS_m0g~q@9DbKhCbB$xj{$hw;Wtq&ilya_o zCkKil%0$V^#jYqPh9L*bLY#t;9%J9aFyxROqT6~L9yFXOAJ>!}GTgMBQ5uIKH9Mq~ zIN&iAHF>1UIUQrWBF3}u;W`|td5iEoJmtetRU~lCt0KbSIGui3qrt;@I6*QN^+W_G ziOFI(<&7azp1x00)nE~v@fIW2V6hKpvoZM_PpH|aE;gjZ+GB2c?BWdP#7Nl;ieLaF5IF`g>ai#VFGuE z)e0jY?h>obQn;t8um$(MWw?!5mZUtU%{-tMULxQjS%?{Uq>2b0tD*x>$W-1Q;3@GF z&fytVDQm%Vb%l`k33x$Nyj!I3GAnruuM`(|@tQnS0dJIuE-P;d>~eTVlCD(0&q^M_ z2cmX^uo1vV1&g=^9;tc)K9PG*%)w{-0@H&pb@+-Gn7aJ@@*j-+!}`tsD&>cb6okKP z*is<;!)?MeTm3RfgY0QHyJ534e`Na#wgPD-T(hkPvS-wP2)Umk!c8|EXp{T`LpS@U zdnGMxl3z*N&7PI8#gsp6TwtV4tR}+34R;JIS59`whCHlaT5Q8vG_n&37gv(n?CiN9 Xd(MW9$-E6`Ye9C`zzYeS&z<-Sdxy%c literal 4055 zcmb_fX?GJx5R`0;Z9+m0Lc)-^isb z(`*BFMN7C$)K*@=QnVZMP1Toi0lTABTwtD+Di%XnroO%yZX!~^3UPDHMGsbKQ6?hm z7O;mDP16gKc2nje%^nP4ZyR20wc(}KdZYSjnoPD~pMgg}1;1?BRSDUzXt)9@_N!s` zYZlhl)Q2Mb!y>OU+tEk%fiV0=7=DxC%5c4bA_rUJyC(RMVLOHdA9h8|r8QCH$T*CB z2)`AE-ws(-3h=y%Wx zO+KGy!p(jwqjN?y`J&!rUg;3eV*24vxhA$WZI{eyRyWUVuGlxh3YwgDO_*#Vw{Y~U zo>1WVxvo!gX3|89^6$8C-MVfgsDvhGCr#>vEIuwdzP3zba?UlGMs^$Bysn3FeUkI8 ziQByMoaILfXmUZDjKP6toXx0JL6eLB*GcNOp|9)GER(wCxvvvVzVuE0v*hGeqse98 zq<()pwnvjI=Kqd)C77q9o7>GXS|Mn1)ttnZY*x`GuYeF{aZBPnGZ|HJJeu?hqpp+Yp)2QucZZ?h-qZy*}I{tt5rN42Gj8{B4@l0NQk@ z6z&r%E#LvMx@i`}Kg8;Z5`@XpE