290 lines
16 KiB
Python
290 lines
16 KiB
Python
|
|
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."
|
|
]
|
|
} |