Exercise 1: Legal Sentences Analysis#
We are given a series of legal sentences (in Spanish), and we would like to:
Extract the companies that are mentioned in there.
Extract the persons that are mentioned in there.
Which companies and persons have the most mentions in the dataset?
# you can start with the following code:
import pandas as pd
df = pd.read_excel('legal.xlsx')[:100]
#set max column width
pd.set_option('display.max_colwidth', -1)
df.sample(5)
/var/folders/l_/k13w4mhd5hv4bddxwqz8qdfw0000gn/T/ipykernel_7822/2196259785.py:3: FutureWarning: Passing a negative integer is deprecated in version 1.0 and will not be supported in future version. Instead, use None to not limit the column width.
pd.set_option('display.max_colwidth', -1)
nref | fallo | |
---|---|---|
40 | 2003/203935 | I.- QUE DEBEMOS DECLARAR Y DECLARAMOS LA INADMISIBILIDAD DEL RECURSO CONTENCIOSO-ADMINISTRATIVO INTERPUESTO POR EL PROCURADOR D. GERMÁN APALATEGUI CARASA EN NOMBRE Y REPRESENTACIÓN DE DOÑA Mercedes CONTRA CONVENIO URBANÍSTICO SUSCRITO POR EL AYUNTAMIENTO DE DEBA Y Dª Antonia, APROBADO POR EL AYUNTAMIENTO EL 25 DE MARZO DE 1993 Y SUSCRITO EL 30 SIGUIENTE, POR EL QUE SE ACUERDA LA CESIÓN DE UNA PARCELA DE 316,60 m2 A CAMBIO DE UN APROVECHAMIENTO URBANÍSTICO DE 2.849 m3 A SITUAR EN LA PARTE DE SU PROPIEDAD A CONCRETAR MEDIANTE UN ESTUDIO DE DETALLE. SIN IMPOSICIÓN DE COSTAS. II.- QUE ESTIMANDO EL RECURSO INTERPUESTO POR EL PROCURADOR D. GERMAN APALATEGUI CARASA EN NOMBRE Y REPRESENTACIÓN DE DOÑA Mercedes CONTRA LA DESESTIMACIÓN PRESUNTA DEL RECURSO DE REPOSICIÓN INTERPUESTO CONTRA EL ACUERDO DE 25 DE ENERO DE 2001 DEL AYUNTAMIENTO DE DEBA POR EL QUE SE APRUEBA DEFINITIVAMENTE EL ESTUDIO DE DETALLE RELATIVO A LA ZONA 9 DE LAS NORMAS SUBSIDIARIAS DE PLANEAMIENTO MUNICIPAL DE DEBA, ASÍ COMO EL ACUERDO DEL CITADO AYUNTAMIENTO DE 24 DE ABRIL DE 2001 POR EL QUE SE DESESTIMA DE FORMA EXPRESA EL RECURSO DE REPOSICIÓN INTERPUESTO, Y; DEBEMOS: PRIMERO.- DECLARAR LA DISCONFORMIDAD A DERECHO DE LOS ACTOS RECURRIDOS QUE CONSECUENTEMENTE ANULAMOS. SEGUNDO.- SIN IMPOSICIÓN DE LAS COSTAS. Notifíquese esta resolución a las partes, advirtiéndoles que contra la misma cabe interponer RECURSO DE CASACIÓN ante la Sala de lo Contencioso - administrativo del Tribunal Supremo, el cual, en su caso, se preparará ante esta Sala en el plazo de DIEZ DÍAS, contados desde el siguiente al de la notificación de esta resolución, mediante escrito en el que deberá manifestarse la intención de interponer el recurso, con sucinta exposición de la concurrencia de los requisitos exigidos. Así por esta nuestra Sentencia, de la que se llevará testimonio a los autos, lo pronunciamos, mandamos y firmamos. Publicación. Leída y publicada fue la anterior sentencia por el Ilustrísimo Señor Magistrado Ponente de la misma, estando celebrando audiencia pública la Sala de lo Contencioso Administrativo del Tribunal Superior de Justicia del País Vasco, en el día de su fecha, de lo que yo el/la Secretario doy fe en BILBAO a 7 de noviembre de 2003. |
20 | 2017/213715 | En virtud de lo expuesto, LA SALA ACUERDA : Inadmitir el recurso de queja interpuesto por representación procesal de D.ª Lorenza y D.ª Marí Juana contra la providencia de fecha 26 de mayo de 2017, de la Audiencia Provincial de Toledo (Sección 2.ª), en el rollo 291/2014, debiendo ponerse esta resolución en conocimiento de la referida Audiencia para que conste en los autos. La parte recurrente perderá el depósito constituido. Contra la presente resolución no cabe recurso alguno. Así lo acuerdan, mandan y firman los Excmos. Sres. Magistrados indicados al margen, de lo que como Secretario, certifico. |
48 | 2004/46741 | Que estimamos parcialmente el recurso contencioso-administrativo interpuesto por la Procuradora Dª AMAYA MARÍA GONZÁLEZ CELAYA, en representación de la entidad "Recreativos Cedeira, S.L.", contra acuerdo del TEAR de Galicia, adoptado en sesión de fecha 27 de septiembre de 2001, que estima en parte reclamación económico-administrativa formulada contra resolución de fecha 24 de mayo de 1999, de la Jefa de Servicio de Gestión Tributaria de la Delegación en A Coruña de la Consellería de Economía e Facenda de la Xunta de Galicia, por la que se estima parcialmente solicitud de devolución de ingresos indebidos correspondientes a la Tasa Fiscal sobre el Juego, ejercicios 1992 a 1996, y anulamos parcialmente dicho acuerdo, por contrario a Derecho, en el particular relativo a la denegación de la devolución de lo ingresado en el primer y segundo trimestres del año 1992 y en el primer trimestre del año 1995 en concepto de incremento anual de la cuota fija de la Tasa Fiscal sobre el Juego relativa a máquinas recreativas tipo "B", debiendo procederse a la devolución de lo ingresado por tal concepto y períodos, con los respectivos intereses, y confirmamos el acuerdo en lo demás; no hacemos especial imposición de costas. Notifíquese esta sentencia a las partes, haciéndoles saber que es firme, siendo solamente susceptible del recurso de casación en interés de la Ley, que podrá ser interpuesto dentro de los tres meses siguientes a su notificación, directamente ante la Sala de lo Contencioso-administrativo del Tribunal Supremo, a medio de escrito con los requisitos establecidos en el artículo 100 de la Ley 29/1998, de 13 de julio, reguladora de la Jurisdicción Contencioso-administrativa por las personas y entidades a que se refiere dicho precepto. En su momento, devuélvase el expediente administrativo al Centro de su procedencia, con certificación de esta resolución. Así lo pronunciamos, mandamos y firmamos. Francisco Javier D'Amorín Vieitez.- José Luis Costa Pillado.- Juan Carlos Fernández López.- María Blanca Fernández Conde.- Cristina Paz Eiroa. |
3 | 2016/282587 | I.- ESTIMAR en parte el recurso de apelación formulado por la Procuradora de los Tribunales Dª ANA ROSA FRADE FUENTES, en nombre y representación de BANCO SANTANDER S.A., frente a la sentencia de 29 de julio de 2016 dictada por el Juzgado de 1ª Instancia nº 5 de Vitoria en el procedimiento ordinario nº 414/2016. II.- REVOCAR en parte la misma, y en consecuencia, estimar sustancialmente la demanda interpuesta por la Procuradora de los Tribunales Dª MARTA PAÚL NÚÑEZ, en nombre y representación de D. Agapito y Dª Adolfina, frente a BANCO SANTANDER S.A., y por ello: II.1.- Declarar la nulidad de la orden de suscripción que dio lugar a la adquisición el 25 de enero de 2007 de aportaciones financieras subordinadas Fagor, y el contrato de administración y depósito de valores suscritos por las partes. II.2.- Condenar a BANCO SANTANDER S.A. a restituir a D. Agapito y Dª Adolfina, la cantidad de 28.443,04 Eur. y su interés legal desde el 25 de enero de 2007 hasta el 29 de julio de 2016, los gastos y comisiones abonados desde el 25 de enero de 2007 e interés legal de estas últimas cantidades desde su abono hasta el 29 de julio de 2016, que se hará efectivo en el modo que se dispone en el apartado II.4. II.3.- D. Agapito y Dª Adolfina restituirán los títulos de las citadas aportaciones financieras subordinadas de Fagor a Banco Santander S.A. y las cantidades percibidas como interés bruto por dichos títulos, más interés legal de estos intereses desde cada una de las percepciones hasta el 29 de julio de 2016, que se harán efectivas en el modo que dispone el siguiente apartado II.4. II.4.- Banco Santander S.A. abonará a D. Agapito y Dª Adolfina, la cantidad que resulte de descontar a la cifra que alcance el anterior apartado II.2, la que proceda por el apartado II.3., y además, interés legal elevado en dos puntos del importe así obtenido, desde el 29 de julio de 2016 hasta la completa satisfacción de los demandantes. II.5.- Banco Santander S.A. es condenado a abonar las costas del procedimiento en primera instancia. III.- DECRETAR la restitución al apelante del depósito consignado para recurrir. IV.- NO HACER CONDENA al pagode las costas del recurso de apelación MODO DE IMPUGNACION : Frente a la presente resolución cabe interponer recurso de casación por interés casacional así como recurso extraordinario por infracción procesal caso de caber el anterior, por escrito, en el caso de ambos en uno mismo, ante esta Audiencia Provincial y dentro del plazo de VEINTE DÍAS desde el día siguiente a la notificación de aquella, correspondiendo su conocimiento a la Sala Primera del Tribunal Supremo ( art. 479 LEC). Para interponer los recursos será necesaria la constitución de un depósito de 50 euros por cada uno de ellos, sin cuyo requisito no serán admitidos a trámite. Los depósitos se constituirán consignando dicho importe en la Cuenta de Depósitos y Consignaciones que este Tribunal tiene abierta en el Banco de Santander con el número 0008.0000 seguido de la clave 06 (casación) y nº del procedimiento, y / o 0008.0000 seguido de la clave 04 (ext. por infracción procesal) y nº de procedimiento, consignaciones que deberán ser acreditadas al interponer el/los recursos ( DA 15ª de la LOPJ). Con certificación de esta resolución y carta orden remítase los autos originales al Juzgado de procedencia para su conocimiento y ejecución. Así, por esta nuestra Sentencia, lo pronunciamos, mandamos y firmamos. PUBLICACIÓN.- Dada y pronunciada fue la anterior Sentencia por la Ilma. Sra. Presidenta y los Ilmos. Sres. Magistrados que la firman y leída por el Sr. ponente en el mismo día de su fecha, lo que yo la Letrada de la Administración de Justicia certifico. |
26 | 1998/5948 | Que debemos estimar y estimamos en parte los presentes recursos contenciosos-administrativos números 2039/94, 2040/94, 2041/94, 2042/94, 2043/94, 2044/94, 2045/94, 2046/94, 2047/94, 2048/94, 2049/94, 2050/94, 2051/94, 2052/94, 2053/94, 2054/94, 2055/94, 2056/94, 2057/94, 2058/94, 2059/94, 2060/94, 2061/94, 2062/94, 2063/94, 2064/94, 2065/94, 2066/94, 2067/94 y 2068/94 (todos ellos acumulados por auto de fecha 28 de septiembre de 1994) deducidos respectivamente por D. Serafín, D. Manuel, D. José, D. Esteban, D. Miguel, D. Andrés, D. Marcelino, D. Celso, D. Eladio, D. Jesús, D. Nemesio, D. Francisco, D. Indalecio, D. Macario, D. Basilio D. Blas, D. Joaquín, D. Avelino, D. José Ramón, D. Julián, D. Rafael, D. Vicente, D. Alberto, D. Ignacio, D. Eulogio, D. Rodolfo, D. Antonio, D. Emilio, D. Santiago y D. José María, contra la resolución desestimatoria presunta en virtud de silencio de sus peticiones efectuadas, en las fechas que en los, respectivos escritos se contienen, a la Consellería de Política Territorial, Obras Públicas y Vivienda de percepción de sus salarios y remuneraciones de toda especie en la cuantía mínima establecida para los trabajadores del Grupo V del Convenio Colectivo de la Xunta, con abono de las diferencias retributivas dejadas de percibir desde el 22 de febrero, fecha de su entrada en vigor; y debemos declarar y declaramos: a) la nulidad del acto presunto recurrido en cuanto deniega a los recurrentes el derecho a percibir las diferencias retributivas dejadas de percibir por el Grupo V, dentro de ese período de los cinco años anteriores a las respectivas fechas de su reclamación, conforme a la cuantía establecida en el mismo; b) el resto de la pretensión en lo que se aparte de particular precedente se desestima; sin hacer imposición de costas. Notifíquese esta sentencia a las partes con la advertencia de que es firme por no caber contra ella recurso ordinario alguno y devuélvase el expediente, con certificación de la misma al Centro de procedencia. Así lo pronunciamos, mandamos y firmamos.- Gonzalo de la Huerga Fidalgo.- Juan José Reigosa González.- Juan Bautista Quintas Rodríguez. |
Load a suitable variant of the GLiNER model
from gliner import GLiNER
# Initialize GLiNER with the base model
model = GLiNER.from_pretrained("urchade/gliner_multi-v2.1")
/Users/victorgallego/miniforge3/lib/python3.10/site-packages/transformers/convert_slow_tokenizer.py:550: UserWarning: The sentencepiece tokenizer that you are converting to a fast tokenizer uses the byte fallback option which is not implemented in the fast tokenizers. In practice this means that the fast version of the tokenizer can produce unknown tokens whereas the sentencepiece version would have converted these unknown tokens into a sequence of byte tokens matching the original piece of text.
warnings.warn(
What are going to be the labels to extract?
labels = ["Company", "Person"]
Process all the sentences with the model and display the results.
texts = df['fallo'].tolist()
results = []
for text in texts:
result = model.predict_entities(text, labels, threshold=0.5)
results.append(result)
# flatten the list
results = [item for sublist in results for item in sublist]
df_entities = pd.DataFrame(results)
df_entities
start | end | text | label | score | |
---|---|---|---|---|---|
0 | 121 | 136 | Nicanor Modesto | Person | 0.929545 |
1 | 74 | 90 | María Inmaculada | Person | 0.585221 |
2 | 328 | 337 | D. Manuel | Person | 0.925554 |
3 | 1420 | 1441 | Doña María Inmaculada | Person | 0.848120 |
4 | 1781 | 1790 | D. Manuel | Person | 0.897005 |
... | ... | ... | ... | ... | ... |
513 | 466 | 488 | Carles Viver Pi-Sunyer | Person | 0.860278 |
514 | 491 | 511 | Enrique Ruiz Vadillo | Person | 0.895998 |
515 | 514 | 547 | Manuel Jiménez de Parga y Cabrera | Person | 0.916679 |
516 | 550 | 570 | Tomás S. Vives Antón | Person | 0.883622 |
517 | 573 | 593 | Pablo García Manzano | Person | 0.938818 |
518 rows × 5 columns
Which companies and persons are the most mentioned in the data?
df_entities[df_entities.label == "Company"]['text'].value_counts()
BANCO SANTANDER S.A. 3
Telefónica de España S.A. 2
Fagor 2
TODOLUZ MALAGA SL 2
TODOLUZ MADRID SL 2
GLOBAL MANUFACTURING & TRADING COMPANY SL 2
M., S.A. 2
C., S.A. 2
HIPERDELUZ SL 2
H., S.A. 2
Banco Santander S.A. 2
Constructora T., S.A. 2
Seguros B. 2
ILUNION CEE OUTSOURCING SAU 1
Cámara de Comercio, Industria y Navegación del Campo de Gibraltar 1
A., S.A. 1
INTERFAN SL 1
Televisión Española, S.A. 1
SOCIEDAD ESTATAL DE CORREOS Y TELÉGRAFOS 1
AUTOMOVILES LUARCA SAU 1
TRANSPORTES ACCESIBLES PENINSULARES SL 1
ASTURSERVICIOS LA PRODUCTORA SAL 1
ILUNION OUTSOURCING SA 1
BANCO SANTANDER CENTRAL HISPANO S.A. 1
Madrileña Red de Gas SAU 1
CONTRATACIÓN Y EJECUCIÓN DE OBRAS, S.L. 1
CEOSA 1
Seguros A., S.A. 1
Insular Aguas De Lanzarote SA. 1
Empresa Endesa Energía S.A.U. 1
Banco Santander Cental Hispano S.A. 1
Comercial de Desarrollos E., S.A. 1
Ediconsa S.L. 1
Construcciones Metálicas La Magdalena S.A. 1
EQUIPAMIENTOS DEPORTIVOS Y DE OCIO S.A. 1
Asoc. Balear Asesores Inmobiliarios 1
Asoc. Murciana Asesores Inmobiliarios 1
Asoc. Valenciana Asesores Inmobiliarios 1
P 3 Seguridad Integral, S.L. 1
ACCIONA INFRAESTRUCTURAS, S.A. 1
CONTROL DE PLAGAS DE CADIZ, S.L. 1
EURODEAL AGENCIA DE VALORES, S.A. 1
Ambulancias Aste, S.L 1
Deshidratadora A., S.A. 1
Montajes Industriales M., S.A. 1
MAQUINARIA ARTES GRÁFICAS HARTMANN, S.A 1
PLUS ULTRA SEGUROS, S. A. DE SEGUROS Y REASEGURO 1
EDICONSA S.L. 1
ERBIAL S.L. 1
ELECTRO HUECAR S.A. 1
NORBERT DENTRESSANGLE GERPOSA S.A. 1
GENERALI ESPAÑA S.A. 1
Lluna Park S.L. 1
Seguros y Reaseguros A. 1
Aseguradora Z., S.A. 1
Recreativos Cedeira, S.L. 1
GESTURCAL, S.A. 1
AYUNTAMIENTO DE SALOBREÑA 1
Ayuntamiento de Salobreña 1
CA Islas Baleares 1
Name: text, dtype: int64
df_entities[df_entities.label == "Person"]['text'].value_counts()
D. Manuel 4
D. José 4
D. Agapito y Dª Adolfina 4
D. Andrés 3
Santos 3
..
Dª Camila 1
D. Pablo 1
Dª María 1
D. Arsenio 1
Pablo García Manzano 1
Name: text, Length: 369, dtype: int64
Exercise 2: Customer Review Analysis#
Now, we will analyze the reviews dataset from Disneyland theme parks.
We would like to extract the attractions that are mentioned in the reviews, with their associated sentiment.
As a starter, you can use the following code:
df = pd.read_csv('DisneylandReviews.csv', sep=',', encoding='iso-8859-1')[:100]
texts = df['Review_Text'].tolist()
Use a suitable model to perform sentiment analysis and classify each review.
Create a sentiments list that is the same length as the reviews list, with the sentiment of each review.
from transformers import pipeline
pipe = pipeline("sentiment-analysis", truncation=True)
sentiments = []
for text in texts:
result = pipe(text)[0]['label']
sentiments.append(result)
Define the label to extract the attractions of the reviews text:
labels = ["Attraction"]
Apply the GLiNER model to the reviews and extract the attractions mentioned in the reviews.
Also add the information of the corresponding sentiment to each entity extracted.
results = []
for sentiment, text in zip(sentiments, texts):
result = model.predict_entities(text, labels, threshold=0.5)
for entity in result:
entity['sentiment'] = sentiment
results.append(result)
result
[{'start': 51,
'end': 67,
'text': 'Disneyland Paris',
'label': 'Attraction',
'score': 0.6424593925476074,
'sentiment': 'POSITIVE'},
{'start': 287,
'end': 301,
'text': 'Space Mountain',
'label': 'Attraction',
'score': 0.9413168430328369,
'sentiment': 'POSITIVE'}]
Convert it to a dataframe and display the results.
# flatten the list
results = [item for sublist in results for item in sublist]
df_entities = pd.DataFrame(results)
Compute the average sentiment between all the extracted attractions (Assume positive is 1 and negative is 0).
df_entities['sentiment'].replace({'POSITIVE': 1, 'NEGATIVE': 0}, inplace=True)
df_entities['sentiment'].mean()
0.7291666666666666
Compute the average sentiment, grouping by the attraction
df_entities.groupby('text')['sentiment'].mean().reset_index().sort_values('sentiment', ascending=False)
text | sentiment | |
---|---|---|
0 | Adventure Land | 1.0 |
41 | Mickey s Wondrous Book | 1.0 |
69 | Tomorrow land | 1.0 |
68 | The park | 1.0 |
67 | The lion king show | 1.0 |
... | ... | ... |
77 | Winnie the Pooh | 0.0 |
76 | Walt Disney World | 0.0 |
21 | Explorers lodge | 0.0 |
74 | Toy story land | 0.0 |
11 | Disney castle | 0.0 |
101 rows × 2 columns
Repeat a similar analysis, but extracting Food.
labels = ["Food"]
results = []
for sentiment, text in zip(sentiments, texts):
result = model.predict_entities(text, labels, threshold=0.5)
for entity in result:
entity['sentiment'] = sentiment
results.append(result)
# flatten the list
results = [item for sublist in results for item in sublist]
df_entities = pd.DataFrame(results)
df_entities['sentiment'].replace({'POSITIVE': 1, 'NEGATIVE': 0}, inplace=True)
df_entities['sentiment'].mean()
0.7073170731707317
df_entities.groupby('text')['sentiment'].mean().reset_index().sort_values('sentiment', ascending=False)
text | sentiment | |
---|---|---|
16 | caramel popcorn | 1.000000 |
12 | Vegetarian food | 1.000000 |
29 | snacks | 1.000000 |
26 | hire pram | 1.000000 |
25 | halal foods | 1.000000 |
24 | halal food | 1.000000 |
23 | food options | 1.000000 |
19 | drinks | 1.000000 |
18 | disneyland | 1.000000 |
15 | brilliant food | 1.000000 |
14 | bottled water | 1.000000 |
13 | average food | 1.000000 |
32 | western restaurants | 1.000000 |
11 | Tahitian Terrace | 1.000000 |
3 | Food | 1.000000 |
2 | Disney theme sweets | 1.000000 |
8 | Pricey food | 1.000000 |
7 | Lovely food | 1.000000 |
10 | Standard Chinese food | 1.000000 |
5 | Honkers | 1.000000 |
4 | Food options | 1.000000 |
21 | food | 0.857143 |
31 | vegie burger | 0.000000 |
30 | vegetarian food | 0.000000 |
28 | popcorn | 0.000000 |
27 | pop corn | 0.000000 |
6 | Limited restaurants | 0.000000 |
22 | food and drink | 0.000000 |
20 | fast food | 0.000000 |
17 | corn on the cob | 0.000000 |
1 | Children s food | 0.000000 |
9 | Souvenirs | 0.000000 |
0 | $60 steak | 0.000000 |