from pymongo import MongoClient import Ela_Spacy as ls import prj_common as mycommon import inspect client = MongoClient("mongodb://localhost:27017/") # database db = client["cherifdb"] # collection ''' Cette fonction indexe une formation ''' def ela_index_class(external_code="", source_field = ""): try: collection = db["myclass"] if( len(str(source_field)) == 0): source_field = 'default' for doc in collection.find({"external_code":external_code}): if ( str(source_field) == "default" ): chaine = doc["title"]+" - "+doc["description"] #mycommon.myprint(" external_code = "+str(doc["external_code"])+" ==> "+str(chaine)) retval = ls.ela_index_record_field(chaine, str(doc["external_code"]), source_field) ''' # Apres indexation, on met a jour la formation pour # mettre le champ "indexe" a 1. ''' if( retval ): # mise à jour du champ "indexed" myobjectif = {} myobjectif['indexed'] = '1' ret_val2 = collection.find_and_modify(query={"external_code":external_code}, update={"$set": myobjectif} ) if (ret_val2 and ret_val2['_id']): mycommon.myprint("La formation indexée (champs par defaut) =" + str(ret_val2['_id'])) return True else: return False elif ( str(source_field) == "title" ): chaine = doc["title"] # mycommon.myprint(" external_code = "+str(doc["external_code"])+" ==> "+str(chaine)) retval = ls.ela_index_record_field(chaine, str(doc["external_code"]), source_field) ''' # Apres indexation, on met a jour la formation pour # mettre le champ "indexe" a 1. ''' if (retval): # mise à jour du champ "indexed" myobjectif = {} myobjectif['indexed_title'] = '1' ret_val2 = collection.find_and_modify(query={"external_code": external_code}, update={"$set": myobjectif} ) if (ret_val2 and ret_val2['_id']): mycommon.myprint("La formation indexée (champ title) =" + str(ret_val2['_id'])) return True else: return False elif ( str(source_field) == "description" ): chaine = doc["description"] # mycommon.myprint(" external_code = "+str(doc["external_code"])+" ==> "+str(chaine)) retval = ls.ela_index_record_field(chaine, str(doc["external_code"]), source_field) ''' # Apres indexation, on met a jour la formation pour # mettre le champ "indexe" a 1. ''' if (retval): # mise à jour du champ "indexed" myobjectif = {} myobjectif['indexed_desc'] = '1' ret_val2 = collection.find_and_modify(query={"external_code": external_code}, update={"$set": myobjectif} ) if (ret_val2 and ret_val2['_id']): mycommon.myprint("La formation indexée (champ description) =" + str(ret_val2['_id'])) return True else: return False elif ( str(source_field) == "objectif" ): chaine = doc["objectif"] # mycommon.myprint(" external_code = "+str(doc["external_code"])+" ==> "+str(chaine)) retval = ls.ela_index_record_field(chaine, str(doc["external_code"]), source_field) ''' # Apres indexation, on met a jour la formation pour # mettre le champ "indexe" a 1. ''' if (retval): # mise à jour du champ "indexed" myobjectif = {} myobjectif['indexed_obj'] = '1' ret_val2 = collection.find_and_modify(query={"external_code": external_code}, update={"$set": myobjectif} ) if (ret_val2 and ret_val2['_id']): mycommon.myprint("La formation indexée (champs objectif) =" + str(ret_val2['_id'])) return True else: return False return True except Exception as e: mycommon.myprint(e) return False ''' La fonction "ela_index_all_classes" va aller chercher chaque cours dans la BDD et créer les mots clées qui sont ensuite enregister dans la table "elaindex" ''' def ela_index_all_classes(): # Making a Connection with MongoClient try: # collection collection = db["myclass"] ''' ATTENTION ATTENTION /!\ : avant l'indexation, on vide la table des indexes. cette logique est tres gourmande. ce quil faudrait faire : - si une formation est indexée, mettre un fag pour dire : indexé => OK - si on met à jour une formation ==> Mettre le flag à KO - si on ajoute une formation, mettre le flag à KO Pour mutualiser le process entre l'indexation des tous les champs ou l'indexation de uniquement de certain champs ex : indexation du champ 'title' ou du champ 'objectif', je vais introduitre la notion de 'source_fied' pour l'indexation title, 'source_fied' = 'title' pour l'indexation objectif, 'source_fied' = 'objectif' apres pour l'indexation, il ne faudra indexer que les formation dont le flag est KO. aussi, avant d'indexer une formation, supprimer tous les index de la dite formation pour remplacer tous les anciens et eviter un doublon ''' nb_class_indexed = 0 for doc in collection.find({'indexed':'0'}): chaine = doc["title"]+" - "+doc["description"] mycommon.myprint(" external_code = "+str(doc["external_code"])+" ==> "+str(chaine)) retval = ela_index_class(str(doc["external_code"])) print(" apres : ela_index_class retval = "+str(retval)) if( retval is False): mycommon.myprint("IMPOSSIBLE d'indexer la formation = " + str(doc["external_code"])) else: nb_class_indexed = nb_class_indexed+1 #retval = ls.ela_index_record_field(chaine, str(doc["external_code"])) mycommon.myprint(str(nb_class_indexed)+" ont été indexes") return True, str(nb_class_indexed)+" ont été indexes " except Exception as e: mycommon.myprint(e) return False, "Impossible d'indexer la BDD des formations ==> KO" ''' La fonction "ela_index_all_classes_title" va aller chercher chaque cours dans la BDD et créer les mots clées des title qui sont ensuite enregister dans la table "elaindex" ''' def ela_index_all_classes_title(): # Making a Connection with MongoClient try: client = MongoClient("mongodb://localhost:27017/") # database db = client["cherifdb"] # collection collection = db["myclass"] ''' ATTENTION ATTENTION /!\ : avant l'indexation, on vide la table des indexes. cette logique est tres gourmande. ce quil faudrait faire : - si une formation est indexée, mettre un fag pour dire : indexé => OK - si on met à jour une formation ==> Mettre le flag à KO - si on ajoute une formation, mettre le flag à KO ex : indexation du champ 'title' ou du champ 'objectif', je vais introduitre la notion de 'source_fied' pour l'indexation title, 'source_fied' = 'title' pour l'indexation objectif, 'source_fied' = 'objectif' apres pour l'indexation, il ne faudra indexer que les formation dont le flag est KO. aussi, avant d'indexer une formation, supprimer tous les index de la dite formation pour remplacer tous les anciens et eviter un doublon ''' nb_class_indexed = 0 for doc in collection.find({'indexed_title': '0'}): chaine = doc["title"] mycommon.myprint(" external_code = " + str(doc["external_code"]) + " ==> " + str(chaine)) retval = ela_index_class(str(doc["external_code"]), "title") print(" apres : ela_index_all_classes_title retval = " + str(retval)) if (retval is False): mycommon.myprint("IMPOSSIBLE d'indexer la formation = " + str(doc["external_code"])) else: nb_class_indexed = nb_class_indexed + 1 # retval = ls.ela_index_record_field(chaine, str(doc["external_code"])) mycommon.myprint(str(nb_class_indexed) + " ont été indexes") return True, str(nb_class_indexed) + " ont été indexes " except Exception as e: mycommon.myprint(e) return False, "Impossible d'indexer la BDD des formations ==> KO" ''' La fonction "ela_index_all_classes_desc" va aller chercher chaque cours dans la BDD et créer les mots clées des "description" qui sont ensuite enregister dans la table "elaindex" ''' def ela_index_all_classes_desc(): # Making a Connection with MongoClient try: client = MongoClient("mongodb://localhost:27017/") # database db = client["cherifdb"] # collection collection = db["myclass"] ''' ATTENTION ATTENTION /!\ : avant l'indexation, on vide la table des indexes. cette logique est tres gourmande. ce quil faudrait faire : - si une formation est indexée, mettre un fag pour dire : indexé => OK - si on met à jour une formation ==> Mettre le flag à KO - si on ajoute une formation, mettre le flag à KO ex : indexation du champ 'title' ou du champ 'objectif', je vais introduitre la notion de 'source_fied' pour l'indexation title, 'source_fied' = 'title' pour l'indexation objectif, 'source_fied' = 'objectif' apres pour l'indexation, il ne faudra indexer que les formation dont le flag est KO. aussi, avant d'indexer une formation, supprimer tous les index de la dite formation pour remplacer tous les anciens et eviter un doublon ''' nb_class_indexed = 0 for doc in collection.find({'indexed_desc': '0'}): chaine = doc["description"] mycommon.myprint(" external_code = " + str(doc["external_code"]) + " ==> " + str(chaine)) retval = ela_index_class(str(doc["external_code"]), "description") print(" apres : ela_index_all_classes_title retval = " + str(retval)) if (retval is False): mycommon.myprint("IMPOSSIBLE d'indexer la formation = " + str(doc["external_code"])) else: nb_class_indexed = nb_class_indexed + 1 # retval = ls.ela_index_record_field(chaine, str(doc["external_code"])) mycommon.myprint(str(nb_class_indexed) + " ont été indexes - champ description") return True, str(nb_class_indexed) + " ont été indexes - champ description " except Exception as e: mycommon.myprint(e) return False, "Impossible d'indexer la BDD des formations ==> KO" ''' La fonction "ela_index_all_classes_desc" va aller chercher chaque cours dans la BDD et créer les mots clées des "objectif" qui sont ensuite enregister dans la table "elaindex" ''' def ela_index_all_classes_obj(): # Making a Connection with MongoClient try: # collection collection = db["myclass"] ''' ATTENTION ATTENTION /!\ : avant l'indexation, on vide la table des indexes. cette logique est tres gourmande. ce quil faudrait faire : - si une formation est indexée, mettre un fag pour dire : indexé => OK - si on met à jour une formation ==> Mettre le flag à KO - si on ajoute une formation, mettre le flag à KO ex : indexation du champ 'title' ou du champ 'objectif', je vais introduitre la notion de 'source_fied' pour l'indexation title, 'source_fied' = 'title' pour l'indexation objectif, 'source_fied' = 'objectif' apres pour l'indexation, il ne faudra indexer que les formation dont le flag est KO. aussi, avant d'indexer une formation, supprimer tous les index de la dite formation pour remplacer tous les anciens et eviter un doublon ''' nb_class_indexed = 0 for doc in collection.find({'indexed_obj': '0'}): chaine = doc["objectif"] mycommon.myprint(" external_code = " + str(doc["external_code"]) + " ==> " + str(chaine)) retval = ela_index_class(str(doc["external_code"]), "objectif") print(" apres : ela_index_all_classes_title retval = " + str(retval)) if (retval is False): mycommon.myprint("IMPOSSIBLE d'indexer la formation = " + str(doc["external_code"])) else: nb_class_indexed = nb_class_indexed + 1 # retval = ls.ela_index_record_field(chaine, str(doc["external_code"])) mycommon.myprint(str(nb_class_indexed) + " ont été indexes - champ objectif") return True, str(nb_class_indexed) + " ont été indexes - champ objectif " except Exception as e: mycommon.myprint(e) return False, "Impossible d'indexer la BDD des formations ==> KO" ''' Cette fonction recherche une chaine de caractère dans la base de données. cette recherche concerne les 'tuple' avec "source_field":"default" ==> l'indexation par defaut. Elle retourne l'id_externe de la formation ''' def ela_recherche_tokens(sentence): tab_training_id = [] tab_tokens = ls.Ela_Tokenize(sentence) tab_tokens2 = ls.Ela_remove_stop_words(tab_tokens) tab_tokens3 = ls.Ela_remove_pronoun(tab_tokens2) tab_tokens4 = ls.Ela_stemmize(tab_tokens3) tab_tokens4.sort() ''' tab_tokens4 contient la liste des mots à rechercher. En suite pour chaque mot de "tab_tokens4" on regarde dans la table "elaindex" a quoi cela pourrait correspondre. ''' # collection collection = db["elaindex"] for token in tab_tokens4: print(token) for doc in collection.find({"mots":token, "source_field":"default"}): #print(" Trouvé dans le cours N° "+str(doc["id_formation"])) if str(doc["id_formation"]) not in tab_training_id : tab_training_id.append(str(doc["id_formation"])) print(" Pour la phrase "+str(sentence)+", voici les formations correspondantes") print(tab_training_id) return tab_training_id ''' Cette fonction recherche une chaine de caractère dans la base, mais sur indexation bien precise. par exemple, pour gerer les recherche par tips :'title':'sentense', le système cherchera a identifier les mots de "sentense" dans les indexation des titre. Cela revient a chercher "sentence" dans la table "ela_index", where "source_field" = "title" Elle retourne l'id_externe de la formation ''' def ela_recherche_tokens_source_field(sentence, source_fied=""): if( len(str(source_fied)) == 0): mycommon.myprint(str(inspect.stack()[0][3])+" - source_fied est vide") return False # Verification que source_field correspond a la bonne colonne field_list = ['default', 'title', 'description','objectif'] if source_fied not in field_list: mycommon.myprint(str(inspect.stack()[0][3])+" - Le champ '" + source_fied + "' n'existe pas, requete annulée") return False tab_training_id = [] tab_tokens = ls.Ela_Tokenize(sentence) tab_tokens2 = ls.Ela_remove_stop_words(tab_tokens) tab_tokens3 = ls.Ela_remove_pronoun(tab_tokens2) tab_tokens4 = ls.Ela_stemmize(tab_tokens3) tab_tokens4.sort() ''' tab_tokens4 contient la liste des mots à rechercher. En suite pour chaque mot de "tab_tokens4" on regarde dans la table "elaindex" a quoi cela pourrait correspondre. ''' collection = db["elaindex"] for token in tab_tokens4: print(token) for doc in collection.find({"mots":token, "source_field":source_fied}): #print(" Trouvé dans le cours N° "+str(doc["id_formation"])) if str(doc["id_formation"]) not in tab_training_id : tab_training_id.append(str(doc["id_formation"])) print(" Pour la phrase "+str(sentence)+", voici les formations correspondantes") print(tab_training_id) return tab_training_id