from langchain.document_loaders import DataFrameLoader from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.pydantic_v1 import BaseModel from langchain.schema.embeddings import Embeddings from scipy.spatial import distance from typing import List import sqlite3 import pandas as pd import shutil import re import numpy as np import inspect import time from unidecode import unidecode from nltk.corpus import stopwords class CustomEmbedding(Embeddings, BaseModel): """embedding model with preprocessing""" size=20 def _get_embedding(self,text) -> List[float]: #print(text,"text") text=remove_unwanted(text) Sal=emb.embed_query(text) return Sal def embed_documents(self, texts: List[str]) -> List[List[float]]: Sal=[] for text in texts: Sal.append(self._get_embedding(text)) return Sal def embed_query(self, text: str) -> List[float]: return self._get_embedding(text) def remove_emoji(string): emoji_pattern = re.compile("[" u"\U0001F600-\U0001F64F" # emoticons u"\U0001F300-\U0001F5FF" # symbols & pictographs u"\U0001F680-\U0001F6FF" # transport & map symbols u"\U0001F1E0-\U0001F1FF" # flags (iOS) u"\U00002702-\U000027B0" u"\U000024C2-\U0001F251" "]+", flags=re.UNICODE) return emoji_pattern.sub(r' ', string) def remove_unwanted(document,stopOk=False): # remove user mentions document = re.sub("@[A-Za-z0-9_]+"," ", document) # remove URLS document = re.sub(r'http\S+', ' ', document) # remove hashtags document = re.sub("#[A-Za-z0-9_]+","", document) # remove emoji's document = remove_emoji(document) # remove punctuation for sig in [".",",","!","¿","?","=","(",")"]: document=document.replace(sig," ") #document = re.sub("[^0-9A-Za-z ]", "" , document) # remove double spaces #print(document) document=unidecode(document) words=document.split(" ") if stopOk: stop_words = set(stopwords.words('spanish')) words = [w for w in words if not w in stop_words] document=" ".join(words) document = document.replace(' ',"") #print(document) return document.strip().lower() def loadmodelEmb(model_name = "embeddings/all-MiniLM-L6-v2",model_kwargs = {'device': 'cpu'}): hf = HuggingFaceEmbeddings( model_name=model_name, model_kwargs=model_kwargs ) return hf def loadCopysAndData(pathsqlite="motor.sqlite"): con = sqlite3.connect(pathsqlite) copies_df = pd.read_sql_query("SELECT * from copies", con) copiesT = copies_df[copies_df.copy_start =="T"] copiesT=copiesT[["copy_message","id","name"]] data = copiesT B=DataFrameLoader(data,page_content_column="copy_message") B2=DataFrameLoader(data,page_content_column="name") documents=B.load() documents2=B2.load() return documents,documents2 def makeFaissdb(documents,folder_path,embedding): try: shutil.rmtree(folder_path) except: pass db = FAISS.from_documents(documents, embedding) FAISS.save_local(db,folder_path=folder_path) return [db,folder_path] def FinderDbs(query,dbs,filtred=False,th=1.2): AllData={} for dbt in dbs: Sal = dbt.similarity_search_with_score(query,4) for output in Sal: if output[0].metadata["id"] in AllData.keys(): AllData[output[0].metadata["id"]]["d"]=min([AllData[output[0].metadata["id"]]["d"]-0.1,output[1]-0.1]) else: AllData[output[0].metadata["id"]]={"d":output[1],"page_content":output[0].page_content} #for item in AllData.items(): # print(item) if filtred: filtredData={} for row in AllData.keys(): if AllData[row]["d"]<1.2: filtredData[row]=AllData[row] filtredData=dict(sorted(filtredData.items(), key=lambda item: item[1]["d"])) return filtredData,filtredData.keys() else: AllData=dict(sorted(AllData.items(), key=lambda item: item[1]["d"])) return AllData,AllData.keys() models=["all-MiniLM-L12-v2","paraphrase-MiniLM-L3-v2" , "all-MiniLM-L6-v2","all-mpnet-base-v2","multi-qa-mpnet-base-dot-v1"] queries=["Quiero reportar un bacheo", "reportar un bache en mi comunidad", "¿Como reporto un bacheo en mi comunidad?", "Quiero informar sobre un hoyo en la calle cerca de mi hogar.", "Necesito reportar un bache en la vía cercana a mi residencia.", "Estoy preocupado por un hueco en la carretera que está cerca de donde vivo.", "Me gustaría notificar sobre un desnivel en la carretera en las inmediaciones de mi domicilio.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi casa.", "Estoy interesado en denunciar una irregularidad en la calle cercana a mi vivienda.", "Necesito dar aviso sobre un problema en la carretera próxima a mi residencia.", "Estoy observando un inconveniente en la carretera cerca de donde vivo y quisiera reportarlo.", "Me gustaría informar sobre un obstáculo en la vía que está cerca de mi casa.", "Quiero señalar un desperfecto en la carretera cercana a mi hogar.", "Necesito poner en conocimiento de las autoridades un bache en la calle adyacente a mi domicilio.", "Estoy solicitando la atención de las autoridades viales para solucionar un problema en la vía cerca de mi vivienda.", "Me gustaría expresar mi preocupación acerca de un bache en la carretera que está cerca de donde resido.", "Quiero dejar constancia de un deterioro en la calle cercana a mi casa.", "Estoy interesado en informar sobre un desperfecto vial en la carretera cercana a mi hogar.", "Necesito notificar sobre un agujero en la carretera que conduce a mi residencia.", "Me gustaría alertar sobre un bache en la vía cerca de mi hogar.", "Quiero dar aviso sobre un desnivel en la calle próxima a mi vivienda.", "Estoy buscando reportar un problema vial en la carretera cercana a mi casa.", "Necesito informar sobre un obstáculo en la vía que está cerca de mi domicilio.", "Me gustaría señalar una irregularidad en la carretera adyacente a mi residencia.", "Quiero presentar una queja sobre un desperfecto en la calle cercana a mi hogar.", "Estoy interesado en denunciar un socavón en la vía que conduce a mi casa.", "Necesito notificar sobre un inconveniente en la carretera próxima a mi residencia.", "Me gustaría informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi casa.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia.", "Me gustaría alertar sobre un agujero en la carretera cerca de mi hogar.", "Quiero notificar sobre un desnivel en la calle adyacente a mi domicilio.", "Estoy buscando reportar un desperfecto en la carretera que está cerca de mi casa.", "Necesito dar aviso sobre un obstáculo en la vía próxima a mi hogar.", "Me gustaría señalar una irregularidad en la carretera cercana a mi residencia.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi residencia.", "Estoy interesado en denunciar un inconveniente en la carretera próxima a mi casa.", "Necesito informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi vivienda.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia.", "Me gustaría alertar sobre un agujero en la carretera cerca de mi hogar.", "Quiero notificar sobre un desnivel en la calle adyacente a mi domicilio.", "Estoy buscando reportar un desperfecto en la carretera que está cerca de mi casa.", "Necesito dar aviso sobre un obstáculo en la vía próxima a mi hogar.", "Me gustaría señalar una irregularidad en la carretera cercana a mi residencia.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi residencia.", "Estoy interesado en denunciar un inconveniente en la carretera próxima a mi casa.", "Necesito informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi vivienda.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia." ] # for model in models: # emb=loadmodelEmb(model_name = model) # emb2=CustomEmbedding() # #print(inspect.getsource(HuggingFaceEmbeddings)) # documents,documents2=loadCopysAndData() # db=makeFaissdb(documents,"TCopies",emb2) # db2=makeFaissdb(documents2,"Tnames",emb2) # for Fdb in [db,db2]: # for query in queries: # point=0 # AllData=FinderDbs(query,[Fdb[0]]) # print(model) # print(Fdb[1]) # if 32 in AllData[1]: # point+=1 # if 32 == list(AllData[1])[0]: # point+=9 # print(AllData[1],point) copies_text=["Saber sobre actividades culturales.", "Saber sobre talleres.", "Información sobre talleres de literatura.", "Información sobre talleres de formación artistica.", "Obtener la certificación de uso de suelos.", "Reportar un bacheo.", "Saber dónde pago un parquímetro.", ] for model in models: print(model) print(""" """) t=time.time() for copy_text in copies_text: emb=loadmodelEmb(model_name = model) emb2=CustomEmbedding() sal=[] for query in queries: sal.append(distance.cosine(emb2.embed_query(query),emb2.embed_query(copy_text))) print(model,",",copy_text,",",np.mean(sal),",",np.std(sal),",",(time.time()-t)/len(queries)) { "formas_de_reportar_bache": [ "Quiero informar sobre un hoyo en la calle cerca de mi hogar.", "Necesito reportar un bache en la vía cercana a mi residencia.", "Estoy preocupado por un hueco en la carretera que está cerca de donde vivo.", "Me gustaría notificar sobre un desnivel en la carretera en las inmediaciones de mi domicilio.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi casa.", "Estoy interesado en denunciar una irregularidad en la calle cercana a mi vivienda.", "Necesito dar aviso sobre un problema en la carretera próxima a mi residencia.", "Estoy observando un inconveniente en la carretera cerca de donde vivo y quisiera reportarlo.", "Me gustaría informar sobre un obstáculo en la vía que está cerca de mi casa.", "Quiero señalar un desperfecto en la carretera cercana a mi hogar.", "Necesito poner en conocimiento de las autoridades un bache en la calle adyacente a mi domicilio.", "Estoy solicitando la atención de las autoridades viales para solucionar un problema en la vía cerca de mi vivienda.", "Me gustaría expresar mi preocupación acerca de un bache en la carretera que está cerca de donde resido.", "Quiero dejar constancia de un deterioro en la calle cercana a mi casa.", "Estoy interesado en informar sobre un desperfecto vial en la carretera cercana a mi hogar.", "Necesito notificar sobre un agujero en la carretera que conduce a mi residencia.", "Me gustaría alertar sobre un bache en la vía cerca de mi hogar.", "Quiero dar aviso sobre un desnivel en la calle próxima a mi vivienda.", "Estoy buscando reportar un problema vial en la carretera cercana a mi casa.", "Necesito informar sobre un obstáculo en la vía que está cerca de mi domicilio.", "Me gustaría señalar una irregularidad en la carretera adyacente a mi residencia.", "Quiero presentar una queja sobre un desperfecto en la calle cercana a mi hogar.", "Estoy interesado en denunciar un socavón en la vía que conduce a mi casa.", "Necesito notificar sobre un inconveniente en la carretera próxima a mi residencia.", "Me gustaría informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi casa.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia.", "Me gustaría alertar sobre un agujero en la carretera cerca de mi hogar.", "Quiero notificar sobre un desnivel en la calle adyacente a mi domicilio.", "Estoy buscando reportar un desperfecto en la carretera que está cerca de mi casa.", "Necesito dar aviso sobre un obstáculo en la vía próxima a mi hogar.", "Me gustaría señalar una irregularidad en la carretera cercana a mi residencia.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi residencia.", "Estoy interesado en denunciar un inconveniente en la carretera próxima a mi casa.", "Necesito informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi vivienda.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia.", "Me gustaría alertar sobre un agujero en la carretera cerca de mi hogar.", "Quiero notificar sobre un desnivel en la calle adyacente a mi domicilio.", "Estoy buscando reportar un desperfecto en la carretera que está cerca de mi casa.", "Necesito dar aviso sobre un obstáculo en la vía próxima a mi hogar.", "Me gustaría señalar una irregularidad en la carretera cercana a mi residencia.", "Quiero presentar una queja sobre un socavón en la vía que conduce a mi residencia.", "Estoy interesado en denunciar un inconveniente en la carretera próxima a mi casa.", "Necesito informar sobre un deterioro en la carretera cerca de donde vivo.", "Quiero expresar mi preocupación acerca de un bache en la calle que está cerca de mi domicilio.", "Estoy solicitando la atención de las autoridades para solucionar un problema vial en las inmediaciones de mi vivienda.", "Necesito poner en conocimiento de las autoridades competentes un bache en la vía cercana a mi residencia." ] }