All Code unstable, feat: code with config archive, finetuning, download models and extract data of db.

This commit is contained in:
Mario Gil 2023-12-21 13:23:01 -05:00
parent 9c0b1ce654
commit ceaa20af06
9 changed files with 530 additions and 330 deletions

18
.gitignore vendored
View File

@ -18,5 +18,19 @@ sns_violin*
NewData* NewData*
motor05102023.csv motor05102023.csv
run.sh run.sh
Modelo_embedding_Mexico_Puebla/all-mpnet-base-v2/model/*
Finetuning/embeddings/all-mpnet-base-v2/* 3pasos/paraphrase-multilingual-mpnet-base-v2/Sta/EvalClass.csv
3pasos/paraphrase-multilingual-mpnet-base-v2/model/*
9pasos/paraphrase-multilingual-mpnet-base-v2/Sta/EvalClass.csv
9pasos/paraphrase-multilingual-mpnet-base-v2/model/*
50pasos/paraphrase-multilingual-mpnet-base-v2/Sta/EvalClass.csv
50pasos/paraphrase-multilingual-mpnet-base-v2/model/*
100pasos/paraphrase-multilingual-mpnet-base-v2/Sta/EvalClass.csv
100pasos/paraphrase-multilingual-mpnet-base-v2/model/*
Argument/*
__pycache__/models.cpython-311.pyc
data/raw/__pycache__/models.cpython-311.pyc
Modelo_embedding_Mexico_Puebla/*
Intentionality3/index.faiss
Intentionality3/index.pkl
conf/experiment_config.json

View File

@ -4,12 +4,27 @@ from sentence_transformers import SentenceTransformer
# el mas rapido "paraphrase-MiniLM-L3-v2" y "all-MiniLM-L6-v2" # el mas rapido "paraphrase-MiniLM-L3-v2" y "all-MiniLM-L6-v2"
# muy rappudo y muy acertado "all-MiniLM-L12-v2" # muy rappudo y muy acertado "all-MiniLM-L12-v2"
#models=["all-MiniLM-L12-v2","paraphrase-MiniLM-L3-v2" , "all-MiniLM-L6-v2", #models=["all-MiniLM-L12-v2","paraphrase-MiniLM-L3-v2" , "all-MiniLM-L6-v2",
models=["all-mpnet-base-v2","multi-qa-mpnet-base-dot-v1"] from pathlib import Path
import json
#"paraphrase-multilingual-mpnet-base-v2",'hackathon-pln-es/paraphrase-spanish-distilroberta'
nameModel="Modelo_embedding_Mexico_Puebla_hiiamasid"
def extractConfig(nameModel="Modelo_embedding_Mexico_Puebla",relPath="./conf/experiment_config.json",dataOut="train_dataset_pos"):
configPath=Path(relPath)
with open(configPath, 'r', encoding='utf-8') as file:
config = json.load(file)[nameModel]
if dataOut is list and len(dataOut)==2:
Output= config[dataOut[0]][dataOut[1]]
else:
Output= config[dataOut]
return Output
baseModel=extractConfig(nameModel=nameModel,dataOut="base_model")
models=[baseModel]
for model in models: for model in models:
modelST = SentenceTransformer(model) modelST = SentenceTransformer(model)
# Define the path where you want to save the model # Define the path where you want to save the model
save_path = './embeddings/%s/'%(model) save_path = './embeddings/%s/model'%(model)
print(save_path)
# Save the model # Save the model
modelST.save(save_path) modelST.save(save_path)

60
data/raw/validClass.json Normal file
View File

@ -0,0 +1,60 @@
{
"32": [
"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.",
"reportar bache"
],
"171": [
"¿Me podrías decir cuáles son las opciones culturales en estos días?",
"Quiero informarme sobre los eventos culturales que no me puedo perder.",
"¿Puedes recomendarme eventos culturales?",
"Estoy buscando información sobre la agenda cultural y artística de Puebla."
],
"273": [
"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."
],
"239": [
"Quiero indicar que un semáforo no muestra la señal de alto constante.",
"Necesito reportar un semáforo que no muestra la señal de alto intermitente.",
"Estoy interesado en notificar sobre un semáforo que presenta un mal funcionamiento general.",
"Quiero comunicar que un semáforo no muestra ninguna señal de luz."
],
"452": [
"Estoy aquí para alertar sobre un coche en estado de abandono.",
"Quiero comunicar que un vehículo ha sido descuidado y está estacionado.",
"Necesito reportar un vehículo sin supervisión.",
"Estoy dispuesto a dar aviso sobre un automóvil abandonado en la vía pública."
],
"23": [
"¿Que actividades de cine hay esta semana?",
"¿Que actividades de club de lectrura hay en puebla?",
"¿Donde puedo participar en talleres de escritura?"
],
"1194":
["¿Cómo llegar a la zona arqueológica de Yohualichan desde el centro de Cuetzalan?",
"¿Cuál es la mejor ruta para visitar la cascada de Apulco desde Cuetzalan?",
"¿Qué transporte recomiendan para llegar a La Gloria desde el centro de Cuetzalan?"],
"1315":[
"quien es el alcalde de la ciudad de puebla",
"quien es el presidente municipal de puebla",
"qué estudios tiene eduardo rivera pérez",
"qué cargos ha ocupado eduardo rivera pérez",
"como se llama el presidente municipal ",
"cual es el nombre del alcalde del municipio",
"como se llama el alcalde"
],
"0":[
"dfjhnr9o",
"fgrrd dfgres",
"Estoy molesto",
"No funciona"
]
}

View File

@ -0,0 +1,145 @@
from models import dbvotes,dbcopies
from sentence_transformers import SentenceTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import pandas as pd
from typing import List
from langchain.pydantic_v1 import BaseModel
from langchain.schema.embeddings import Embeddings
from unidecode import unidecode
from nltk.corpus import stopwords
import re
from pathlib import Path
import json
import matplotlib.pyplot as plt
import seaborn as sns
def extractConfig(nameModel="Modelo_embedding_Mexico_Puebla",relPath="./conf/experiment_config.json",dataOut="train_dataset_pos"):
configPath=Path(relPath)
with open(configPath, 'r', encoding='utf-8') as file:
config = json.load(file)[nameModel]
if type(dataOut) is list and len(dataOut)==2:
Output= config[dataOut[0]][dataOut[1]]
else:
Output= config[dataOut]
return Output
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()
output=[]
for row in dbvotes(dbvotes.votes.id).select():
if int(row.vote)==1:
Sal={}
#print(row.message, row.copy_id,row.vote)
query = (dbvotes.messages.id==row.message)
messagequery = dbvotes(query).select(dbvotes.messages.ALL)
Sal["texto"]=messagequery[0].message
Sal["etiqueta"]=row.copy_id
query = (dbcopies.copies.id==row.copy_id)
copiesquery =dbcopies(query).select(dbcopies.copies.ALL)
#Sal["copy_message"]=copiesquery[0].copy_message
Sal["intentionality"]=copiesquery[0].intentionality
#print(copiesquery)
output.append(Sal)
df=pd.DataFrame(output)
train_data, test_data = train_test_split(df, test_size=0.2, random_state=42)
def loadmodelEmb(model_name = "embeddings/all-MiniLM-L6-v2",model_kwargs = {'device': 'cpu'}):
st = SentenceTransformer(model_name)
return st
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)
nameModel="Modelo_embedding_Mexico_Puebla"
valid_path = extractConfig(dataOut="valid_dataset")
baseModel= extractConfig(dataOut="base_model")
with open(valid_path, 'r', encoding='utf-8') as file:
queries_Categoricos = json.load(file)
model="./%s/%s/model"%(nameModel,baseModel)
emb=loadmodelEmb(model_name = model)
emb2=CustomEmbedding()
train_embeddings = pd.DataFrame(emb2.embed_documents(train_data['texto'].tolist()))
test_embeddings = pd.DataFrame(emb2.embed_documents(test_data['texto'].tolist()))
print(pd.DataFrame(test_embeddings))
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(train_embeddings, train_data['etiqueta'])
# Hacer predicciones en el conjunto de prueba
predictions = rf_model.predict(test_embeddings)
# Calcular la precisión
accuracy = accuracy_score(test_data['etiqueta'], predictions)
print(f'Precisión del modelo: {accuracy:.2f}')
# verificar características importantes
feature_importances_df = pd.DataFrame(
{"feature": list(test_embeddings.columns), "importance": rf_model.feature_importances_}
).sort_values("importance", ascending=False)
# Mostrar
print(feature_importances_df)

2
downloaddb.sh Executable file
View File

@ -0,0 +1,2 @@
scp mgil@apollo.latinux.net:/home/jbenitez/www/py4web/apps/AngelaSmartBot/databases/storage.db ./data/raw/databases
scp mgil@apollo.latinux.net:/opt/web2py/applications/MotorAngela/databases/storage.sqlite ./data/raw/databases

View File

@ -53,81 +53,70 @@ model.fit(train_objectives=[(train_dataloader, train_loss)],epochs=num_epochs,wa
""" """
from sentence_transformers import SentenceTransformer, losses, InputExample from sentence_transformers import SentenceTransformer, losses, InputExample
from torch.utils.data import DataLoader from torch.utils.data import DataLoader
from unidecode import unidecode
from pathlib import Path
import json
import os
from datetime import datetime
nameModel="Modelo_embedding_Mexico_Puebla_hiiamasid"
def extractConfig(nameModel="Modelo_embedding_Mexico_Puebla",relPath="./conf/experiment_config.json",dataOut="train_dataset_pos"):
configPath=Path(relPath)
with open(configPath, 'r', encoding='utf-8') as file:
config = json.load(file)[nameModel]
if type(dataOut) is list and len(dataOut)==2:
Output= config[dataOut[0]][dataOut[1]]
else:
Output= config[dataOut]
return Output
def saveConfig(dictionary):
pathOutfile='./%s/%s/params/'%(nameModel,baseModel)
if not os.path.exists(pathOutfile):
os.makedirs(pathOutfile)
with open(pathOutfile+"params.json", "w",encoding='utf-8') as outfile:
json.dump(dictionary, outfile)
def saveData(dictionary):
Sal={}
pathOutfile='./%s/%s/data/'%(nameModel,baseModel)
if not os.path.exists(pathOutfile):
os.makedirs(pathOutfile)
with open(pathOutfile+"train.json", "w",encoding='utf-8') as outfile:
json.dump(dictionary, outfile)
now = datetime.now()
model="embeddings/all-mpnet-base-v2" entrenamiento="V_%s_%s_%s"%(now.year,now.month,now.day)
modelST = SentenceTransformer(model) baseModel=extractConfig(nameModel=nameModel,dataOut="base_model")
trainDatasetPos=extractConfig(nameModel=nameModel,dataOut="train_dataset_pos")
model=extractConfig(nameModel=nameModel,dataOut="path_model")
modelST = SentenceTransformer(model+"/model")
train_loss = losses.MultipleNegativesRankingLoss(model=modelST) train_loss = losses.MultipleNegativesRankingLoss(model=modelST)
train_path = Path(trainDatasetPos)
with open(train_path, 'r', encoding='utf-8') as file:
queries_Categoricos = json.load(file)
queries=["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."
]
train_examples = [] train_examples = []
for q in queries: for i in queries_Categoricos.keys():
train_examples.append(InputExample(texts=[ 'Reportar un bacheo',q]))
print(train_examples) for j in queries_Categoricos[i]:
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=2) i=unidecode(i).strip().lower()
print(train_dataloader) j=unidecode(j).strip().lower()
num_epochs = 2
warmup_steps = int(len(train_dataloader) * num_epochs * 0.1) #10% of train data train_examples.append(InputExample(texts=[ i,j]))
modelST.fit(train_objectives=[(train_dataloader, train_loss)],epochs=num_epochs,warmup_steps=2)
save_path = './Finetuning/%s/'%(model) train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=5)#16
# Save the model print(len(train_dataloader))
modelST.save(save_path) modelST.fit(train_objectives=[(train_dataloader, train_loss)],epochs=extractConfig(dataOut=["params","num_epochs"]),warmup_steps=extractConfig(dataOut=["params","warmup_steps"]))
save_path = './%s/%s/model/'%(nameModel,baseModel)
modelST.save(save_path)
params={"entrenamiento":entrenamiento,"baseModel":baseModel}
params.update(extractConfig(dataOut="params"))
saveConfig(params)
saveData(queries_Categoricos)

View File

@ -5,7 +5,7 @@ from langchain.vectorstores import FAISS
from langchain.pydantic_v1 import BaseModel from langchain.pydantic_v1 import BaseModel
from langchain.schema.embeddings import Embeddings from langchain.schema.embeddings import Embeddings
from sentence_transformers import SentenceTransformer from sentence_transformers import SentenceTransformer
from scipy.spatial import distance
from typing import List from typing import List
import sqlite3 import sqlite3
import pandas as pd import pandas as pd
@ -18,13 +18,27 @@ from unidecode import unidecode
from nltk.corpus import stopwords from nltk.corpus import stopwords
import seaborn as sns import seaborn as sns
import argparse import argparse
from scipy.spatial import distance
from pathlib import Path
import json
import os
from nltk.corpus import stopwords
import nltk
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("-f", "--file", help="Nombre de archivo a procesar") parser.add_argument("-f", "--file", help="Nombre de archivo a procesar")
parser.add_argument("-d", "--distance", default="distance") parser.add_argument("-d", "--distance", default="distance")
parser.add_argument("-m", "--models", default="All") parser.add_argument("-m", "--models", default="All")
args = parser.parse_args() args = parser.parse_args()
def extractConfig(nameModel="Modelo_embedding_Mexico_Puebla",relPath="./conf/experiment_config.json",dataOut="train_dataset_pos"):
configPath=Path(relPath)
with open(configPath, 'r', encoding='utf-8') as file:
config = json.load(file)[nameModel]
if type(dataOut) is list and len(dataOut)==2:
Output= config[dataOut[0]][dataOut[1]]
else:
Output= config[dataOut]
return Output
# if args.file: # if args.file:
# print ("El nombre de archivo a procesar es: ", ) # print ("El nombre de archivo a procesar es: ", )
@ -95,15 +109,17 @@ def loadmodelEmb(model_name = "embeddings/all-MiniLM-L6-v2",model_kwargs = {'dev
st = SentenceTransformer(model_name) st = SentenceTransformer(model_name)
return st return st
pathsqlite=extractConfig(dataOut="pathsqlite")
def loadCopysAndData(pathsqlite="motor.sqlite"): def loadCopysAndData(pathsqlite=pathsqlite):
con = sqlite3.connect(pathsqlite) con = sqlite3.connect(pathsqlite)
copies_df = pd.read_sql_query("SELECT * from copies", con) copies_df = pd.read_sql_query("SELECT * from copies WHERE intentionality IS NOT NULL", con)
copiesT = copies_df[copies_df.copy_start =="T"] copiesT = copies_df
copiesT=copiesT[["copy_message","id","name"]] copiesT=copiesT[["copy_message","id","name","intentionality"]]
#print(copiesT)
data = copiesT data = copiesT
#print(data)
B=DataFrameLoader(data,page_content_column="copy_message") B=DataFrameLoader(data,page_content_column="copy_message")
B2=DataFrameLoader(data,page_content_column="name") B2=DataFrameLoader(data,page_content_column="intentionality")
documents=B.load() documents=B.load()
documents2=B2.load() documents2=B2.load()
return documents,documents2 return documents,documents2
@ -114,13 +130,13 @@ def makeFaissdb(documents,folder_path,embedding):
pass pass
db = FAISS.from_documents(documents, embedding) db = FAISS.from_documents(documents, embedding)
FAISS.save_local(db,folder_path=folder_path) FAISS.save_local(db,folder_path=folder_path)
return [db,folder_path] return db
def FinderDbs(query,dbs,filtred=False,th=5000):
def FinderDbs(query,dbs,filtred=False,th=1.2):
AllData={} AllData={}
for dbt in dbs: for dbt in dbs:
Sal = dbt.similarity_search_with_score(query,4) Sal = dbt.similarity_search_with_score(query,4)
for output in Sal: for output in Sal:
#print(output)
if output[0].metadata["id"] in AllData.keys(): 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]) AllData[output[0].metadata["id"]]["d"]=min([AllData[output[0].metadata["id"]]["d"]-0.1,output[1]-0.1])
else: else:
@ -131,7 +147,7 @@ def FinderDbs(query,dbs,filtred=False,th=1.2):
if filtred: if filtred:
filtredData={} filtredData={}
for row in AllData.keys(): for row in AllData.keys():
if AllData[row]["d"]<1.2: if AllData[row]["d"]<th:
filtredData[row]=AllData[row] filtredData[row]=AllData[row]
filtredData=dict(sorted(filtredData.items(), key=lambda item: item[1]["d"])) filtredData=dict(sorted(filtredData.items(), key=lambda item: item[1]["d"]))
return filtredData,filtredData.keys() return filtredData,filtredData.keys()
@ -140,251 +156,23 @@ def FinderDbs(query,dbs,filtred=False,th=1.2):
else: else:
AllData=dict(sorted(AllData.items(), key=lambda item: item[1]["d"])) AllData=dict(sorted(AllData.items(), key=lambda item: item[1]["d"]))
return AllData,AllData.keys() 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=["embeddings/all-mpnet-base-v2","Finetuning/embeddings/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]:
nameModel="Modelo_embedding_Mexico_Puebla_hiiamasid"
valid_path = extractConfig(nameModel=nameModel,dataOut="valid_dataset")
# for query in queries: baseModel= extractConfig(nameModel=nameModel,dataOut="base_model")
# point=0 path_model=extractConfig(nameModel=nameModel,dataOut="path_model")
# AllData=FinderDbs(query,[Fdb[0]]) with open(valid_path, 'r', encoding='utf-8') as file:
# print(model) queries_Categoricos = json.load(file)
# print(Fdb[1]) models=["./"+path_model]
# if 32 in AllData[1]: #print(1111,models)
# point+=1 copies_text=queries_Categoricos.keys()
# if 32 == list(AllData[1])[0]:
# point+=9
# print(AllData[1],point)
try:
queries_Categoricos={ os.makedirs("./%s/Sta"%(path_model), exist_ok = True)
"formas_de_reportar_bache": [ except OSError as error:
"Quiero informar sobre un hoyo en la calle cerca de mi hogar.", pass
"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): def plotVioin(Sal,Listqueries):
NewData=pd.DataFrame.from_dict(Sal) NewData=pd.DataFrame.from_dict(Sal)
@ -395,8 +183,8 @@ def plotVioin(Sal,Listqueries):
fig=plt.get_figure() fig=plt.get_figure()
fig.set_size_inches(17.7, 12.27) fig.set_size_inches(17.7, 12.27)
fig.savefig('sns_violin_plot%s.png'%(Listqueries), dpi=300) fig.savefig('./%s/%s/Sta/sns_violin_plot%s.png'%(nameModel,baseModel,Listqueries), dpi=300)
NewData.to_csv("NewData%s.csv"%(Listqueries)) NewData.to_csv("./%s/%s/Sta/NewData%s.csv"%(nameModel,baseModel,Listqueries))
def plotViointime(Sal,Listqueries): def plotViointime(Sal,Listqueries):
NewData=pd.DataFrame.from_dict(Sal) NewData=pd.DataFrame.from_dict(Sal)
@ -406,8 +194,8 @@ def plotViointime(Sal,Listqueries):
fig=plt.get_figure() fig=plt.get_figure()
fig.set_size_inches(17.7, 12.27) fig.set_size_inches(17.7, 12.27)
fig.savefig('sns_violin_plot_time%s.png'%(Listqueries), dpi=300) fig.savefig('./%s/%s/Sta/sns_violin_plot_time%s.png'%(nameModel,baseModel,Listqueries), dpi=300)
NewData.to_csv("NewData%s.csv"%(Listqueries)) NewData.to_csv("./%s/%s/Sta/NewData%s.csv"%(nameModel,baseModel,Listqueries))
def queries_CatPlot(Listqueries): def queries_CatPlot(Listqueries):
Sal=[] Sal=[]
queries=queries_Categoricos[Listqueries] queries=queries_Categoricos[Listqueries]
@ -432,9 +220,162 @@ def queries_CatPlot(Listqueries):
if args.distance=="time": if args.distance=="time":
plotViointime(Sal,Listqueries) plotViointime(Sal,Listqueries)
def queries_CatSta():
Sal=[]
for model in models:
for copy_text in copies_text:
global emb
#print(2222,model)
emb=loadmodelEmb(model_name = model+"/model")
emb2=CustomEmbedding()
emb2.embed_query("test 123321")
Sal=[]
for query in queries_Categoricos[copy_text]:
t=time.time()
A={"model":model,
"query":query,
"type":"insider",
"copy_test":copy_text,
"distance":distance.cosine(emb2.embed_query(query),emb2.embed_query(copy_text)),
"time":time.time()-t
}
Sal.append(A)
outdata=set(queries_Categoricos.keys())
outdata.remove(copy_text)
for query in outdata:
t=time.time()
A={"model":model,
"query":query,
"type":"outsider_n1",
"copy_test":copy_text,
"distance":distance.cosine(emb2.embed_query(query),emb2.embed_query(copy_text)),
"time":time.time()-t
}
Sal.append(A)
outdata2=queries_Categoricos[query]
for query2 in outdata2:
t=time.time()
A={"model":model,
"query":query2,
"type":"outsider_n2",
"copy_test":copy_text,
"distance":distance.cosine(emb2.embed_query(query2),emb2.embed_query(copy_text)),
"time":time.time()-t
}
Sal.append(A)
df=pd.DataFrame(Sal)
df.to_csv("./%s/Sta/NewData%s.csv"%(path_model,copy_text[0:50]))
return Sal
def queries_CatSta_in(queries_Categoricos,model="embeddings/all-mpnet-base-v2"):
global emb
emb=loadmodelEmb(model_name = model)
emb2=CustomEmbedding()
emb2.embed_query("test 123321")
Sal=[]
for objetive in queries_Categoricos.keys():
for query in queries_Categoricos[objetive]:
t=time.time()
A={"model":model,
"query":query,
"type":"insider",
"objetive":objetive,
"distance":distance.cosine(emb2.embed_query(query),emb2.embed_query(objetive)),
"time":time.time()-t
}
Sal.append(A)
return Sal
def queries_CatSta_out(queries_Categoricos,model="embeddings/all-mpnet-base-v2"):
global emb
emb=loadmodelEmb(model_name = model)
emb2=CustomEmbedding()
emb2.embed_query("test 123321")
Sal=[]
for objetive in queries_Categoricos.keys():
outdata=set(queries_Categoricos.keys())
outdata.remove(objetive)
for outdataObj in list(outdata):
for query in queries_Categoricos[outdataObj]:
t=time.time()
A={"model":model,
"query":query,
"type":"outsider",
"objetive":objetive,
"distance":distance.cosine(emb2.embed_query(query),emb2.embed_query(objetive)),
"time":time.time()-t
}
Sal.append(A)
return Sal
queries_CatSta()
def evalDb(text,dbs):
AllData=FinderDbs(text,dbs,filtred=5)
print(AllData)
if AllData:
AllData = list(AllData)
dis=[]
id=[]
for k,i in enumerate(AllData[0].items()):
dis.append(str(i[1]['d']))
id.append(i[0])
return dis,id
def EvalClass(dbs):
valid_path = Path(extractConfig(dataOut="valid_dataset_Class"))
with open(valid_path, 'r', encoding='utf-8') as file:
queries_Categoricos = json.load(file)
Sal = []
for i in queries_Categoricos.keys():
for j in queries_Categoricos[i]:
i=unidecode(i).strip().lower()
j=unidecode(j).strip().lower()
score = 1.0
dis,id=evalDb(j,dbs)
try:
pass
#print(j,i,id, dis[0])
except:
pass
#print(j,i,id)
Top8=0
Top1=0
Distancia=99
if int(i) in id:
Top8=1
try:
if int(i)==id[0]:
Top1=1
Distancia=dis[0]
except:
pass
Sal.append([j,i,Top8,Top1,Distancia])
df=pd.DataFrame(Sal,columns=['query', 'IdDb', 'Top8',"Top1","dist"])
df.to_csv("./%s/Sta/EvalClass.csv"%(path_model))
#queries_CatPlot(copies_text)
nltk.download('stopwords')
#llm,emb=loadModels()
model=models[0]
#print(model)
documents,documents2=loadCopysAndData()
emb=loadmodelEmb(model_name = model+"/model")
emb2=CustomEmbedding()
db=makeFaissdb(documents,"Copies3",emb2)
db2=makeFaissdb(documents2,"Intentionality3",emb2)
EvalClass([db,db2])
queries_CatPlot(args.file)

34
models.py Normal file
View File

@ -0,0 +1,34 @@
from pydal import DAL, Field
import datetime
dbcopies = DAL('sqlite://storage.sqlite',
pool_size=10,
migrate_enabled=False,
folder='data/raw/databases'
)
dbvotes = DAL('sqlite://storage.db',
pool_size=10,
migrate_enabled=False,
folder='data/raw/databases'
)
dbvotes.define_table('votes',
Field("id"),
Field("message"),
Field("copy_id"),
Field("vote"))
dbvotes.define_table('messages',
Field("id"),
Field("message"))
dbcopies.define_table('copies',
Field("id"),
Field("name"),
Field("copy_message"),
Field("copy_help"),
Field("display_name"),
Field("intentionality"),
Field("context"),
Field("more_info"))

2
run.sh Normal file → Executable file
View File

@ -1 +1 @@
/home/mgil/.local/bin/uvicorn main:app --reload --port 7860 uvicorn main:app --reload --port 7860