Commit 4ac69518 by Jaime Collado

Preprocessing text before vectorizing

parent f8bf5580
Showing with 104 additions and 11 deletions
[
{
"id": 0,
"text": "exploraciones : mamografia digital bilateral ecografia mamaria radiografia de torax comparado con : ecografia del 05/01/2021 y del 02/07/2020 mamografia del 02/07/2020 hallazgos : radiografia de torax silueta cardiomediastinica de forma , situacion y tamano normal . hilios pulmonares con estructura conservada . columna aerea de la traquea central . parenquima pulmonar sin evidencia de infiltrados , consolidados , nodulos o masas . vascularidad pulmonar normal . senos costodiafragmatico y costofrenicos libres . estructuras blandas evaluadas normales . imagenes de alta densidad proyectadas en hemitorax derecho que pueden corresponder a clips quirurgicos mamografia : se realiza mamografia digital en proyecciones cc y oml de ambas mamas , identificandose patron mixto con predominio del tejido fibroglandular heterogeneamente denso disperso con tendencia a formacion de imagenes de aspecto pseudonodular y areas parcheadas de tejido adiposo interpuesto , hallazgo que pudiera ocultar lesiones de pequeno tamano . calcificaciones groseras con liponecrosis proyectada en icsup de md con imagenes lineales de mayor densidad que pueden corresponder a material quirurgico en relacion ocn antecedente de la pciente . no se identifican imagenes nodulares de aspecto espiculado , estrellado asi como tampoco distorsiones del parenquima mamario . no se observan microcalcificaciones agrupadas . adecuada relacion complejo piel areola pezon . region axilar libre de adenopatias . ecografia mamaria se realiza valoracion con transductor lineal de ambas mamas en sentido horario y complementariamente en regiones axilares , identificandose un tejido de muy alto poder ecogenico de ecoestructura heterogenea secundario a combinacion de areas hiperecogenicas , hipoecogenicas y de atenuacion en las interfases del tejido glandular y adiposo . no se identifican imagenes nodulares de aspecto quistico o solido sospechoso de patologia mamaria area de distorsion de la ecoestructura del parenquima mamario en icsup y hacia cse/icext de md con marcada sombra posterior en relacion a cambios postquirurgicos . no hay signos de ectasia ductal retroareolar . region axilar libre de adenopatias . conclusion : densidad mamaria c , clasificacion acr cambios postquirurgicos en md con clips y calcificaciones groseras , estable"
"text": "EXPLORACIONES:\nMamografía tomosíntesis\nEcografía mamaria\n\n\nINFORMACION CLINICA\n\nRefiere dolor en CCEE de MI. Remitida para valoración. \n\nCOMPARADO CON:\n\nNo dispongo de estudios previos con los que comparar el actual. \n\nHALLAZGOS:\n\nSe realiza mamografía bilateral (proyecciones OML y CC) así como tomosíntesis en proyección CC y ecografía de ambas mamas. \n\nParénquima mamario muy denso, de distribución y características ecográficas normales (Patrón D ACR).\n\n\n.- En región paraareolar externa de MI se identifica un quiste de gran tamaño con una pequeña lesión focal dependiente de su pared, de 4 mm de diámetro, sugestivo de papiloma (BI-RADS 4a). \n\n\n2.- La zona dolorosa en CCEE de MI se corresponde con un quiste simple a tensión de 21 mm de diámetro (BI-RADS 2). \n\n\n3.- Calcificaciones benignas dispersas en ambas mamas (BI-RADS 2). Innumerables quistes simples de diferente tamaño dispersos en ambas mamas, algunos de gran tamaño y otros con contenido débilmente ecogénico en su interior (BI\n-RADS 2). No se observan otras alteraciones significativas en el momento actual.\n\nCONCLUSION:\n\nBI-RADS 4a. Se recomienda realizar PAAF/BAG de la posible lesión papilomatosa localizada en MI. También se recomienda dejar un marcador metálico en el lugar de la punción por la posibilidad de que al puncionar el quiste la lesión pase desapercibida en futuros estudios. Por otra parte, se recomienda realizar PAAF, con guía ecográfica e intención evacuadora, del quiste sintomático localizado en MI."
},
{
"id": 1,
"text": "exploraciones : mamografia digital bilateral ecografia mamaria radiografia de torax comparado con : ecografia del 05/01/2021 y del 02/07/2020 mamografia del 02/07/2020 hallazgos : radiografia de torax silueta cardiomediastinica de forma , situacion y tamano normal . hilios pulmonares con estructura conservada . columna aerea de la traquea central . parenquima pulmonar sin evidencia de infiltrados , consolidados , nodulos o masas . vascularidad pulmonar normal . senos costodiafragmatico y costofrenicos libres . estructuras blandas evaluadas normales . imagenes de alta densidad proyectadas en hemitorax derecho que pueden corresponder a clips quirurgicos mamografia : se realiza mamografia digital en proyecciones cc y oml de ambas mamas , identificandose patron mixto con predominio del tejido fibroglandular heterogeneamente denso disperso con tendencia a formacion de imagenes de aspecto pseudonodular y areas parcheadas de tejido adiposo interpuesto , hallazgo que pudiera ocultar lesiones de pequeno tamano . calcificaciones groseras con liponecrosis proyectada en icsup de md con imagenes lineales de mayor densidad que pueden corresponder a material quirurgico en relacion ocn antecedente de la pciente . no se identifican imagenes nodulares de aspecto espiculado , estrellado asi como tampoco distorsiones del parenquima mamario . no se observan microcalcificaciones agrupadas . adecuada relacion complejo piel areola pezon . region axilar libre de adenopatias . ecografia mamaria se realiza valoracion con transductor lineal de ambas mamas en sentido horario y complementariamente en regiones axilares , identificandose un tejido de muy alto poder ecogenico de ecoestructura heterogenea secundario a combinacion de areas hiperecogenicas , hipoecogenicas y de atenuacion en las interfases del tejido glandular y adiposo . no se identifican imagenes nodulares de aspecto quistico o solido sospechoso de patologia mamaria area de distorsion de la ecoestructura del parenquima mamario en icsup y hacia cse/icext de md con marcada sombra posterior en relacion a cambios postquirurgicos . no hay signos de ectasia ductal retroareolar . region axilar libre de adenopatias . conclusion : densidad mamaria c , clasificacion acr cambios postquirurgicos en md con clips y calcificaciones groseras , estable"
"text": "EXPLORACIONES:\nMamografía tomosíntesis\nEcografía mamaria\n\n\nINFORMACION CLINICA\n\nRefiere dolor en CCEE de MI. Remitida para valoración. \n\nCOMPARADO CON:\n\nNo dispongo de estudios previos con los que comparar el actual. \n\nHALLAZGOS:\n\nSe realiza mamografía bilateral (proyecciones OML y CC) así como tomosíntesis en proyección CC y ecografía de ambas mamas. \n\nParénquima mamario muy denso, de distribución y características ecográficas normales (Patrón D ACR).\n\n\n.- En región paraareolar externa de MI se identifica un quiste de gran tamaño con una pequeña lesión focal dependiente de su pared, de 4 mm de diámetro, sugestivo de papiloma (BI-RADS 4a). \n\n\n2.- La zona dolorosa en CCEE de MI se corresponde con un quiste simple a tensión de 21 mm de diámetro (BI-RADS 2). \n\n\n3.- Calcificaciones benignas dispersas en ambas mamas (BI-RADS 2). Innumerables quistes simples de diferente tamaño dispersos en ambas mamas, algunos de gran tamaño y otros con contenido débilmente ecogénico en su interior (BI\n-RADS 2). No se observan otras alteraciones significativas en el momento actual.\n\nCONCLUSION:\n\nBI-RADS 4a. Se recomienda realizar PAAF/BAG de la posible lesión papilomatosa localizada en MI. También se recomienda dejar un marcador metálico en el lugar de la punción por la posibilidad de que al puncionar el quiste la lesión pase desapercibida en futuros estudios. Por otra parte, se recomienda realizar PAAF, con guía ecográfica e intención evacuadora, del quiste sintomático localizado en MI."
}
]
......@@ -3,14 +3,15 @@ import joblib
from datetime import timedelta
from typing import List
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi import FastAPI, Depends, HTTPException, status, Body
from fastapi.security import OAuth2PasswordRequestForm
from fastapi.middleware.cors import CORSMiddleware
from sqlalchemy.orm import Session
import schemas, security, dependencies, crud, database
import schemas, security, dependencies, crud, database, utils
database.Base.metadata.create_all(bind=database.engine)
# APP
app = FastAPI()
......@@ -24,16 +25,22 @@ app.add_middleware(
)
# Load the vectorizer
with open("/home/jcollado/projects/api_pirads/vectorizers/birads_tfidf.pkl", "rb") as pickled_file:
with open("./vectorizers/birads_tfidf.pkl", "rb") as pickled_file:
vectorizer = joblib.load(pickled_file)
# Load the model
with open("/home/jcollado/projects/api_pirads/classifiers/birads_model.joblib", "rb") as pickled_file:
with open("./classifiers/birads_model.joblib", "rb") as pickled_file:
clf = joblib.load(pickled_file)
def _predict(text, model, vectorizer):
# TODO: ¿Preprocesar texto?
X_test = vectorizer.transform([text])
# Preprocess input text
clean_text = utils.preprocessing_text(text)
clean_text = utils.clear_birads(clean_text)
# Vectorize text
X_test = vectorizer.transform([clean_text])
# Predict outputs
probs = model.predict_proba(X_test)
probs = [prob[0][1] for prob in probs]
return probs
......@@ -66,14 +73,25 @@ async def login_for_access_token(
@app.post("/predict", response_model=List[schemas.OutputData])
async def predict(
input_data: List[schemas.InputData],
input_data: List[schemas.InputData] = Body(
example =
[
{
"id": 0,
"text": "EXPLORACIONES:\nMamografía tomosíntesis\nEcografía mamaria\n\n\nINFORMACION CLINICA\n\nRefiere dolor en CCEE de MI. Remitida para valoración. \n\nCOMPARADO CON:\n\nNo dispongo de estudios previos con los que comparar el actual. \n\nHALLAZGOS:\n\nSe realiza mamografía bilateral (proyecciones OML y CC) así como tomosíntesis en proyección CC y ecografía de ambas mamas. \n\nParénquima mamario muy denso, de distribución y características ecográficas normales (Patrón D ACR).\n\n\n.- En región paraareolar externa de MI se identifica un quiste de gran tamaño con una pequeña lesión focal dependiente de su pared, de 4 mm de diámetro, sugestivo de papiloma (BI-RADS 4a). \n\n\n2.- La zona dolorosa en CCEE de MI se corresponde con un quiste simple a tensión de 21 mm de diámetro (BI-RADS 2). \n\n\n3.- Calcificaciones benignas dispersas en ambas mamas (BI-RADS 2). Innumerables quistes simples de diferente tamaño dispersos en ambas mamas, algunos de gran tamaño y otros con contenido débilmente ecogénico en su interior (BI\n-RADS 2). No se observan otras alteraciones significativas en el momento actual.\n\nCONCLUSION:\n\nBI-RADS 4a. Se recomienda realizar PAAF/BAG de la posible lesión papilomatosa localizada en MI. También se recomienda dejar un marcador metálico en el lugar de la punción por la posibilidad de que al puncionar el quiste la lesión pase desapercibida en futuros estudios. Por otra parte, se recomienda realizar PAAF, con guía ecográfica e intención evacuadora, del quiste sintomático localizado en MI."
},
{
"id": 1,
"text": "EXPLORACIONES:\nMamografía tomosíntesis\nEcografía mamaria\n\n\nINFORMACION CLINICA\n\nRefiere dolor en CCEE de MI. Remitida para valoración. \n\nCOMPARADO CON:\n\nNo dispongo de estudios previos con los que comparar el actual. \n\nHALLAZGOS:\n\nSe realiza mamografía bilateral (proyecciones OML y CC) así como tomosíntesis en proyección CC y ecografía de ambas mamas. \n\nParénquima mamario muy denso, de distribución y características ecográficas normales (Patrón D ACR).\n\n\n.- En región paraareolar externa de MI se identifica un quiste de gran tamaño con una pequeña lesión focal dependiente de su pared, de 4 mm de diámetro, sugestivo de papiloma (BI-RADS 4a). \n\n\n2.- La zona dolorosa en CCEE de MI se corresponde con un quiste simple a tensión de 21 mm de diámetro (BI-RADS 2). \n\n\n3.- Calcificaciones benignas dispersas en ambas mamas (BI-RADS 2). Innumerables quistes simples de diferente tamaño dispersos en ambas mamas, algunos de gran tamaño y otros con contenido débilmente ecogénico en su interior (BI\n-RADS 2). No se observan otras alteraciones significativas en el momento actual.\n\nCONCLUSION:\n\nBI-RADS 4a. Se recomienda realizar PAAF/BAG de la posible lesión papilomatosa localizada en MI. También se recomienda dejar un marcador metálico en el lugar de la punción por la posibilidad de que al puncionar el quiste la lesión pase desapercibida en futuros estudios. Por otra parte, se recomienda realizar PAAF, con guía ecográfica e intención evacuadora, del quiste sintomático localizado en MI."
}
]
),
current_user: str = Depends(dependencies.get_current_active_user)
):
# Input data: [{"id": 1, "texto": "a"}, {"id": 2, "texto": "b"}]
# Input data: [{"id": 1, "text": "a"}, {"id": 2, "text": "b"}]
predictions = []
for report in input_data:
prediction = _predict(text=report.text, model=clf, vectorizer=vectorizer)
print(prediction)
predictions.append(
{
"id": report.id,
......
import re
import unicodedata
def preprocessing_text(s):
# replace tab
s = re.sub('\t+', ' ', s)
# Unicode normalization
s = re.sub(r'BR', r'birads', s)
# string to lower
s = s.strip().lower()
s = ''.join(c for c in unicodedata.normalize('NFD', s) if unicodedata.category(c) != 'Mn')
# replace synonyms of birads
synon = ['bi rads', 'bi-rads', 'b-rads', 'birads-', 'birads -', 'bi_rads', 'birads/']
for sy in synon:
s = re.sub(sy, r'birads ', s)
s = re.sub(' +', ' ', s)
# roman numeral
dic_roman = {
'vi': '6',
'v': '5',
'iv': '4',
'iii': '3',
'ii': '2',
'i' : '1'
}
for key, value in dic_roman.items():
start = 'birads ' + key
end = 'birads ' + value
s = re.sub(start, end, s)
s = re.sub(' +', ' ', s)
s = re.sub(r'birads (\d)([a-z])', r'birads \1 \2', s)
s = re.sub(r'birads (\d) - (\d)', r'birads \1 birads \2', s)
s = re.sub(' +', ' ', s)
# include blank space before and after each punctuation mark
s = re.sub(r'([-¿?¡!()\'",.;:$€])', r' \1 ', s)
s = re.sub(' +', ' ', s)
s = s.replace("4a", ' 4 a')
s = s.replace("4b", ' 4 b')
s = s.replace("4c", ' 4 c')
s = re.sub(' +', ' ', s)
# s = re.sub(r' b'+str(i)+' ', r' birads '+str(i)+' ', s)
# s = re.sub(r' b '+str(i)+' ', r' birads '+str(i)+' ', s)
# replace separate numbers e.g.: 4 x 5 . 9 by 4x5.9
for n in [',', 'x', '.']:
s = re.sub(r"(\d+) "+ n + r" (\d+)", r"\1"+ n.replace(r"\\", "") +r"\2", s)
s = re.sub(' +', ' ', s)
return s.strip()
def clear_birads(text):
text = re.sub(r'birads.{1,3}\d{1}[a|b|c]?', '', text)
text = re.sub(r'birads categoria \d{1}', '', text)
text = text.replace("( )", "")
text = re.sub('\t+', ' ', text)
text = re.sub(' +', ' ', text)
return text.strip()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment