# -*- coding: utf-8 -*- import re, math from collections import Counter # user_said = "maman je voudrais ecouter ACDC" # order = "je voudrais ecouter {{ artist_name }}" user_said = "s'il te plait regle le reveil pour dix huit heures et dix neuf minutes trente trois secondes cent quatre vingt dix " user_said_list = [" regle le reveil pour neuf heures et quinze minutes trente trois secondes ", "s'il te plait regle le reveil pour dix huit huf minutes trente trois secondes cent quatre vingt dix ", "regle pour dix huit heures et trente trois secondes cent quatre vingt dix ", "s'il te plait regle le reveil poutes trente trois secondes cent quatre vingt dix ", "RIEN A VOIR", " minutes neuf trente reveil regle secondes quinze le heures et trois pour " ] order = "{{ politesse }} regle le reveil pour {{ hour}} heures et {{minute }} minutes {{ seconde }} secondes {{mili}}" order_list = ["regle le reveil pour heures et minutes secondes ", "{{ politesse }} regle le reveil pour {{ hour}} heures et {{minute }} minutes {{ seconde }} secondes {{mili}}", "politesse regle le reveil pour hour heures et minute minutes seconde secondes mili", " reveil pour {{ hour}} et {{minute }} minutes secondes {{mili}}", "{{ politesse }} regle le reveil pour " ] # take a look to each order WORD = re.compile(r'\w+') def get_cosine(vec1, vec2): intersection = set(vec1.keys()) & set(vec2.keys()) numerator = sum([vec1[x] * vec2[x] for x in intersection]) sum1 = sum([vec1[x]**2 for x in vec1.keys()]) sum2 = sum([vec2[x]**2 for x in vec2.keys()]) denominator = math.sqrt(sum1) * math.sqrt(sum2) if not denominator: return 0.0 else: return float(numerator) / denominator def text_to_vector(text): words = WORD.findall(text) return Counter(words) def _is_containing_bracket(sentence): # print "sentence to test %s" % sentence pattern = r"{{|}}" # prog = re.compile(pattern) bool = re.search(pattern, sentence) if bool is not None: return True return False def _get_next_value_list(list): ite = list.__iter__() next(ite, None) return next(ite, None) # check if the order contain bracket if _is_containing_bracket(order): # remove white space between {{ and }} # get a table of word said list_word_in_order = re.sub('\s+(?=[^\{\{\}\}]*\}\})', '',order).split() print "order matched: %s" % list_word_in_order # get the order, defined by the first words before {{ the_order = order[:order.find('{{')] print "the order catched %s" % the_order # remove sentence before order nb = user_said[user_said.find(the_order):] truncate_list_word_said = nb.split() print "truncate_list_word_said : %s" % truncate_list_word_said # make dict var:value dictVar = {} for idx, ow in enumerate(list_word_in_order): if _is_containing_bracket(ow): # remove bracket et key dict varname = ow.replace("{{","").replace("}}", "") stopValue = _get_next_value_list(list_word_in_order[idx:]) if stopValue is None: dictVar[varname] = " ".join(truncate_list_word_said) break for word_said in truncate_list_word_said: if word_said == stopValue: break if varname in dictVar: dictVar[varname] += " " + word_said truncate_list_word_said = truncate_list_word_said[1:] else: dictVar[varname] = word_said truncate_list_word_said = truncate_list_word_said[1:] print "The dict Var : %s" % dictVar for us in user_said_list: for od in order_list: vector1 = text_to_vector(us) vector2 = text_to_vector(od) cosine = get_cosine(vector1, vector2) print "Cosine -> ", cosine, " for usersaid: ",us, " ,order:", od