LLm2Node/metrics.py

448 lines
24 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 sentence_transformers import SentenceTransformer
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
import seaborn as sns
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file", help="Nombre de archivo a procesar")
parser.add_argument("-d", "--distance", default="distance")
parser.add_argument("-m", "--models", default="All")
args = parser.parse_args()
# if args.file:
# print ("El nombre de archivo a procesar es: ", )
class CustomEmbedding(Embeddings, BaseModel,):
"""embedding model with preprocessing"""
def _get_embedding(self,text) -> List[float]:
#print(text,"text")
text=remove_unwanted(text,punctuationOK=True,stopOK=True)
Sal=emb.encode(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,punctuationOK=False,xtrasOK=False, emojiOk=False, unidecodeOK=False):
if punctuationOK:
# remove punctuation
for sig in [".",",","!","¿","?","=","(",")"]:
document=document.replace(sig," ")
if xtrasOK:
# 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)
if emojiOk:
# remove emoji's
document = remove_emoji(document)
#document = re.sub("[^0-9A-Za-z ]", "" , document)
# remove double spaces
#print(document)
if unidecodeOK:
document=unidecode(document)
if stopOK:
words=document.split(" ")
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'}):
st = SentenceTransformer(model_name)
return st
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()
if args.models=="All":
models=["all-MiniLM-L12-v2","paraphrase-MiniLM-L3-v2" , "all-MiniLM-L6-v2","all-mpnet-base-v2","multi-qa-mpnet-base-dot-v1"]
else:
models=["all-mpnet-base-v2"]
queries_bacheo=["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)
queries_Categoricos={
"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."
],
"formas_de_preguntar_agenda_cultural_puebla": [
"¿Me podrías proporcionar información sobre los eventos culturales en Puebla?",
"Quiero estar al tanto de lo que está pasando en la escena cultural de Puebla.",
"¿Dónde puedo encontrar detalles sobre las actividades culturales en Puebla?",
"Estoy interesado en saber qué eventos culturales hay en Puebla.",
"Me gustaría conocer la programación cultural de Puebla.",
"¿Puedes decirme cuáles son los eventos culturales próximos en Puebla?",
"Estoy buscando información sobre la oferta cultural en Puebla.",
"¿Dónde puedo obtener información sobre la vida cultural de Puebla?",
"Estoy buscando recomendaciones sobre eventos culturales en Puebla.",
"¿Qué está pasando en el ámbito cultural en Puebla?",
"Me gustaría estar al tanto de los eventos culturales en Puebla.",
"¿Puedes proporcionarme la agenda de la cultura en Puebla?",
"Quiero saber cuáles son las propuestas culturales en Puebla.",
"¿Cuáles son los eventos culturales destacados en Puebla?",
"Estoy interesado en la escena cultural de Puebla, ¿dónde puedo encontrar información?",
"¿Dónde puedo consultar los eventos culturales que se celebrarán en Puebla?",
"Necesito saber qué actividades culturales puedo disfrutar en Puebla.",
"¿Me puedes indicar los acontecimientos culturales en Puebla?",
"Quiero informarme acerca de la oferta cultural de Puebla.",
"¿Dónde puedo obtener un listado de los eventos culturales en Puebla?",
"Estoy buscando información sobre la vida artística en Puebla.",
"¿Qué opciones culturales hay disponibles en Puebla en estos momentos?",
"Me gustaría conocer los eventos culturales previstos en Puebla.",
"¿Puedes recomendarme actividades culturales en Puebla?",
"Quiero enterarme de las novedades culturales de Puebla.",
"¿Cuál es la agenda de eventos culturales en Puebla?",
"Estoy interesado en asistir a eventos culturales en Puebla, ¿dónde puedo encontrar información?",
"¿Dónde puedo consultar la programación cultural actual de Puebla?",
"Necesito saber cuáles son las propuestas culturales más recientes en Puebla.",
"¿Me puedes decir qué eventos culturales están en marcha en Puebla?",
"Estoy buscando opciones para disfrutar de la cultura en Puebla.",
"¿Qué actividades culturales se ofrecen en Puebla en este momento?",
"Me gustaría estar al tanto de los espectáculos culturales en Puebla.",
"¿Puedes proporcionarme información sobre los eventos culturales próximos en Puebla?",
"Quiero saber qué está pasando en la escena cultural de Puebla.",
"¿Cuál es la oferta cultural actual en Puebla?",
"Estoy interesado en conocer los eventos culturales destacados de Puebla.",
"¿Dónde puedo encontrar la programación cultural más completa de Puebla?",
"Necesito detalles sobre la agenda cultural de Puebla.",
"¿Me podrías decir cuáles son las opciones culturales en Puebla en estos días?",
"Quiero informarme sobre los eventos culturales que no me puedo perder en Puebla.",
"¿Puedes recomendarme eventos culturales en Puebla?",
"Estoy buscando información sobre la agenda cultural y artística de Puebla."
],
"formas_de_solicitar_informacion_musica": [
"Estoy interesado en obtener datos sobre talleres de música.",
"Necesito información acerca de cursos de música.",
"Quiero conocer más sobre talleres de formación musical.",
"¿Puede proporcionarme detalles sobre programas de música?",
"Me gustaría recibir información sobre clases de música.",
"Estoy buscando datos acerca de talleres para aprender música.",
"¿Puede darme detalles sobre cursos de instrucción musical?",
"Quiero saber más sobre oportunidades de aprendizaje musical.",
"Estoy interesado en talleres para desarrollar habilidades musicales.",
"Necesito información sobre clases prácticas de música.",
"¿Puede brindarme datos sobre programas de formación musical?",
"Me gustaría conocer opciones para aprender música.",
"Estoy en busca de talleres musicales, ¿puede ayudarme?",
"Quiero obtener detalles sobre cursos de música disponibles.",
"Necesito información sobre talleres de instrucción musical.",
"¿Puede proporcionarme datos sobre clases para músicos?",
"Me gustaría saber más sobre oportunidades de formación musical.",
"Estoy interesado en aprender música, ¿puede orientarme?",
"Quiero conocer más sobre talleres para mejorar en música.",
"Necesito información sobre programas de capacitación musical.",
"¿Puede darme detalles sobre cursos de formación en música?",
"Estoy buscando opciones para aprender a tocar instrumentos.",
"Me gustaría recibir información sobre clases de educación musical.",
"Estoy interesado en talleres de música, ¿puede asesorarme?",
"Quiero obtener datos sobre oportunidades de estudio musical.",
"Necesito información sobre talleres de música en mi área.",
"¿Puede proporcionarme detalles sobre cursos de música locales?",
"Me gustaría saber más sobre clases de música para principiantes.",
"Estoy en busca de talleres de formación musical asequibles.",
"Quiero conocer opciones para mejorar mis habilidades musicales.",
"Estoy interesado en aprender música de manera profesional.",
"Necesito información sobre talleres de música para niños.",
"¿Puede darme datos sobre cursos de música para adultos?",
"Me gustaría recibir información sobre clases de canto.",
"Estoy buscando oportunidades de instrucción musical avanzada.",
"Quiero obtener detalles sobre talleres de producción musical.",
"Necesito información sobre programas de educación musical en línea.",
"¿Puede proporcionarme detalles sobre cursos de música en vivo?",
"Me gustaría saber más sobre clases de composición musical.",
"Estoy interesado en talleres de música clásica.",
"Quiero conocer opciones para estudiar teoría musical.",
"Necesito información sobre talleres de música contemporánea.",
"¿Puede darme datos sobre cursos de improvisación musical?",
"Me gustaría recibir información sobre clases de jazz.",
"Estoy buscando oportunidades de formación en música electrónica.",
"Quiero obtener detalles sobre talleres de guitarra.",
"Necesito información sobre programas de educación musical para la infancia.",
"¿Puede proporcionarme detalles sobre cursos de producción de música electrónica?",
"Me gustaría saber más sobre clases de música para adultos mayores.",
"Estoy interesado en talleres de música étnica y world music."
]
}
copies_text=["Saber agenda cultural de Puebla",
"Información de talleres de musica",
"Informacion de talleres de danza urbana",
"Obtener uso de suelo",
"Reportar un bacheo.",
"Informacion general de parquimetros",
"Informacion Parque Benito Juárez"
]
def plotVioin(Sal,Listqueries):
NewData=pd.DataFrame.from_dict(Sal)
plt=sns.violinplot(data=NewData, x="model", y="distance", hue="copy_test",fill=False,inner=None,width=0.5)
plt.set_xticklabels(plt.get_xticklabels(), rotation=45,horizontalalignment='right')
fig=plt.get_figure()
fig.set_size_inches(17.7, 12.27)
fig.savefig('sns_violin_plot%s.png'%(Listqueries), dpi=300)
NewData.to_csv("NewData%s.csv"%(Listqueries))
def plotViointime(Sal,Listqueries):
NewData=pd.DataFrame.from_dict(Sal)
plt=sns.violinplot(data=NewData, x="model", y="time",fill=False,inner=None,width=0.5)
plt.set_xticklabels(plt.get_xticklabels(), rotation=45,horizontalalignment='right')
fig=plt.get_figure()
fig.set_size_inches(17.7, 12.27)
fig.savefig('sns_violin_plot_time%s.png'%(Listqueries), dpi=300)
NewData.to_csv("NewData%s.csv"%(Listqueries))
def queries_CatPlot(Listqueries):
Sal=[]
queries=queries_Categoricos[Listqueries]
for model in models:
for copy_text in copies_text:
global emb
emb=loadmodelEmb(model_name = model)
emb2=CustomEmbedding()
emb2.embed_query("test 123321")
sal=[]
for query in queries:
t=time.time()
A={"model":model,
"query":query,
"copy_test":copy_text,
"distance":distance.cosine(emb2.embed_query(query),emb2.embed_query(copy_text)),
"time":time.time()-t
}
Sal.append(A)
if args.distance=="distance":
plotVioin(Sal,Listqueries)
if args.distance=="time":
plotViointime(Sal,Listqueries)
queries_CatPlot(args.file)