Spaces:
Sleeping
Sleeping
Upload 5 files
Browse files- .streamlit/config.toml +3 -0
- Demo.py +153 -0
- Dockerfile +70 -0
- pages/Workflow & Model Overview.py +264 -0
- requirements.txt +6 -0
.streamlit/config.toml
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
[theme]
|
2 |
+
base="light"
|
3 |
+
primaryColor="#29B4E8"
|
Demo.py
ADDED
@@ -0,0 +1,153 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import sparknlp
|
3 |
+
import os
|
4 |
+
import pandas as pd
|
5 |
+
|
6 |
+
from sparknlp.base import *
|
7 |
+
from sparknlp.annotator import *
|
8 |
+
from pyspark.ml import Pipeline
|
9 |
+
from sparknlp.pretrained import PretrainedPipeline
|
10 |
+
from annotated_text import annotated_text
|
11 |
+
|
12 |
+
# Page configuration
|
13 |
+
st.set_page_config(
|
14 |
+
layout="wide",
|
15 |
+
page_title="Spark NLP Demos App",
|
16 |
+
initial_sidebar_state="auto"
|
17 |
+
)
|
18 |
+
|
19 |
+
# CSS for styling
|
20 |
+
st.markdown("""
|
21 |
+
<style>
|
22 |
+
.main-title {
|
23 |
+
font-size: 36px;
|
24 |
+
color: #4A90E2;
|
25 |
+
font-weight: bold;
|
26 |
+
text-align: center;
|
27 |
+
}
|
28 |
+
.section p, .section ul {
|
29 |
+
color: #666666;
|
30 |
+
}
|
31 |
+
</style>
|
32 |
+
""", unsafe_allow_html=True)
|
33 |
+
|
34 |
+
@st.cache_resource
|
35 |
+
def init_spark():
|
36 |
+
return sparknlp.start()
|
37 |
+
|
38 |
+
@st.cache_resource
|
39 |
+
def create_pipeline(model):
|
40 |
+
document_assembler = DocumentAssembler() \
|
41 |
+
.setInputCol("text") \
|
42 |
+
.setOutputCol("document")
|
43 |
+
|
44 |
+
tokenizer = Tokenizer() \
|
45 |
+
.setInputCols(["document"]) \
|
46 |
+
.setOutputCol("token")
|
47 |
+
|
48 |
+
embeddings = WordEmbeddingsModel.pretrained('glove_840B_300', lang='xx') \
|
49 |
+
.setInputCols(["document", "token"]) \
|
50 |
+
.setOutputCol("embeddings")
|
51 |
+
|
52 |
+
ner_model = NerDLModel.pretrained(model, 'xx') \
|
53 |
+
.setInputCols(["document", "token", "embeddings"]) \
|
54 |
+
.setOutputCol("ner")
|
55 |
+
|
56 |
+
ner_converter = NerConverter() \
|
57 |
+
.setInputCols(["document", "token", "ner"]) \
|
58 |
+
.setOutputCol("ner_chunk")
|
59 |
+
|
60 |
+
pipeline = Pipeline(stages=[
|
61 |
+
document_assembler,
|
62 |
+
tokenizer,
|
63 |
+
embeddings,
|
64 |
+
ner_model,
|
65 |
+
ner_converter
|
66 |
+
])
|
67 |
+
|
68 |
+
return pipeline
|
69 |
+
|
70 |
+
def fit_data(pipeline, data):
|
71 |
+
empty_df = spark.createDataFrame([['']]).toDF('text')
|
72 |
+
pipeline_model = pipeline.fit(empty_df)
|
73 |
+
model = LightPipeline(pipeline_model)
|
74 |
+
result = model.fullAnnotate(data)
|
75 |
+
return result
|
76 |
+
|
77 |
+
def annotate(data):
|
78 |
+
document, chunks, labels = data["Document"], data["NER Chunk"], data["NER Label"]
|
79 |
+
annotated_words = []
|
80 |
+
for chunk, label in zip(chunks, labels):
|
81 |
+
parts = document.split(chunk, 1)
|
82 |
+
if parts[0]:
|
83 |
+
annotated_words.append(parts[0])
|
84 |
+
annotated_words.append((chunk, label))
|
85 |
+
document = parts[1]
|
86 |
+
if document:
|
87 |
+
annotated_words.append(document)
|
88 |
+
annotated_text(*annotated_words)
|
89 |
+
|
90 |
+
# Set up the page layout
|
91 |
+
st.markdown('<div class="main-title">Reconocer personas, ubicaciones, organizaciones y entidades misceláneas</div>', unsafe_allow_html=True)
|
92 |
+
|
93 |
+
# Sidebar content
|
94 |
+
model = st.sidebar.selectbox(
|
95 |
+
"Choose the pretrained model",
|
96 |
+
["ner_wikiner_glove_840B_300", "wikiner_6B_300", "wikiner_6B_100"],
|
97 |
+
help="For more info about the models visit: https://sparknlp.org/models"
|
98 |
+
)
|
99 |
+
|
100 |
+
# Reference notebook link in sidebar
|
101 |
+
link = """
|
102 |
+
<a href="https://colab.research.google.com/github/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/streamlit_notebooks/NER_ES.ipynb">
|
103 |
+
<img src="https://colab.research.google.com/assets/colab-badge.svg" style="zoom: 1.3" alt="Open In Colab"/>
|
104 |
+
</a>
|
105 |
+
"""
|
106 |
+
st.sidebar.markdown('Reference notebook:')
|
107 |
+
st.sidebar.markdown(link, unsafe_allow_html=True)
|
108 |
+
|
109 |
+
# Load examples
|
110 |
+
examples = [
|
111 |
+
"""En el corazón de Madrid, la Puerta del Sol es uno de los lugares más emblemáticos de España. Salvador Dalí, uno de los pintores más célebres del siglo XX, nació en Figueres en 1904. A lo largo de su carrera, Dalí creó obras como "La persistencia de la memoria" y "Cristo de San Juan de la Cruz", que se exhiben en museos de Barcelona y Nueva York. El Museo del Prado, situado en el centro de Madrid, alberga obras maestras de artistas como Francisco de Goya y Diego Velázquez. El Rey Felipe VI, nacido Felipe Juan Pablo Alfonso de Todos los Santos de Borbón y de Grecia en Madrid en 1968, es el actual monarca de España. La Sagrada Familia, diseñada por Antoni Gaudí, es un símbolo de la arquitectura modernista y se encuentra en Barcelona. Pablo Picasso, nacido en Málaga en 1881, es famoso por sus pinturas y esculturas como "Guernica" y "Las señoritas de Aviñón", que se exhiben en el Museo Reina Sofía de Madrid. Sevilla es conocida por su catedral y el Alcázar. La Alhambra de Granada, un palacio y fortaleza de la época nazarí, es uno de los sitios más visitados del país. El Museo Guggenheim de Bilbao, diseñado por Frank Gehry, es un icono de la arquitectura contemporánea y alberga obras de artistas modernos. Valencia acoge cada año Las Fallas, un festival en el que se queman grandes figuras de cartón. Zaragoza es famosa por la Basílica del Pilar y el río Ebro. San Sebastián, con su festival de cine, atrae a celebridades de todo el mundo. En el ámbito literario, Miguel de Cervantes, autor de "Don Quijote de la Mancha", es una figura central de la literatura española. En la política, Pedro Sánchez, nacido en Madrid en 1972, es el actual presidente del Gobierno de España, mientras que el Partido Popular y el Partido Socialista Obrero Español son las principales fuerzas políticas del país. España también es conocida por su gastronomía, con platos típicos como la paella de Valencia, el gazpacho andaluz y el jamón ibérico de Salamanca. La selección española de fútbol, campeona del mundo en 2010, es una de las más exitosas en la historia del deporte.""",
|
112 |
+
"""William Henry Gates III (nacido el 28 de octubre de 1955) es un magnate de los negocios, desarrollador de software, inversor y filántropo estadounidense. Es mejor conocido como el cofundador de Microsoft Corporation. Durante su carrera en Microsoft, Gates ocupó los cargos de presidente, director ejecutivo (CEO), presidente y arquitecto de software en jefe, y también fue el mayor accionista individual hasta mayo de 2014. Es uno de los empresarios y pioneros más conocidos de revolución de la microcomputadora de los años setenta y ochenta. Nacido y criado en Seattle, Washington, Gates cofundó Microsoft con su amigo de la infancia Paul Allen en 1975, en Albuquerque, Nuevo México; se convirtió en la compañía de software de computadora personal más grande del mundo. Gates dirigió la compañía como presidente y CEO hasta que dejó el cargo de CEO en enero de 2000, pero siguió siendo presidente y se convirtió en el arquitecto jefe de software. A fines de la década de 1990, Gates había sido criticado por sus tácticas comerciales, que se han considerado anticompetitivas. Esta opinión ha sido confirmada por numerosas sentencias judiciales. En junio de 2006, Gates anunció que haría la transición a un puesto de medio tiempo en Microsoft y trabajaría a tiempo completo en la Fundación Bill y Melinda Gates, la fundación caritativa privada que él y su esposa, Melinda Gates, establecieron en 2000. [ 9] Poco a poco transfirió sus deberes a Ray Ozzie y Craig Mundie. Renunció como presidente de Microsoft en febrero de 2014 y asumió un nuevo cargo como asesor tecnológico para apoyar al recién nombrado CEO Satya Nadella.""",
|
113 |
+
"""La Mona Lisa es una pintura al óleo del siglo XVI creada por Leonardo. Se celebra en el Louvre de París.""",
|
114 |
+
"""Cuando Sebastian Thrun comenzó a trabajar en automóviles autónomos en Google en 2007, pocas personas fuera de la empresa lo tomaron en serio. "Puedo decirles que los CEOs muy importantes de las principales compañías de automóviles estadounidenses me darían la mano y se darían la vuelta porque no valía la pena hablar con ellos", dijo Thrun, ahora cofundador y CEO de la startup de educación superior en línea Udacity, en una entrevista. con Recode a principios de esta semana.""",
|
115 |
+
"""Facebook es un servicio de redes sociales lanzado como TheFacebook el 4 de febrero de 2004. Fue fundado por Mark Zuckerberg con sus compañeros de la universidad y sus compañeros de la Universidad de Harvard, Eduardo Saverin, Andrew McCollum, Dustin Moskovitz y Chris Hughes. La membresía del sitio web fue inicialmente limitada por los fundadores a los estudiantes de Harvard, pero se expandió a otras universidades en el área de Boston, la Ivy League, y gradualmente a la mayoría de las universidades en los Estados Unidos y Canadá.""",
|
116 |
+
"""La historia del procesamiento del lenguaje natural generalmente comenzó en la década de 1950, aunque se puede encontrar trabajo de períodos anteriores. En 1950, Alan Turing publicó un artículo titulado 'Maquinaria de computación e inteligencia' que proponía lo que ahora se llama la prueba de Turing como criterio de inteligencia""",
|
117 |
+
"""Geoffrey Everest Hinton es un psicólogo cognitivo y científico informático canadiense inglés, más conocido por su trabajo en redes neuronales artificiales. Desde 2013 divide su tiempo trabajando para Google y la Universidad de Toronto. En 2017, cofundó y se convirtió en el Asesor Científico Jefe del Vector Institute en Toronto.""",
|
118 |
+
"""Cuando le dije a John que quería mudarme a Alaska, me advirtió que tendría problemas para encontrar un Starbucks allí.""",
|
119 |
+
"""Steven Paul Jobs fue un magnate de los negocios, diseñador industrial, inversor y propietario de medios estadounidense. Fue presidente, director ejecutivo (CEO) y cofundador de Apple Inc., presidente y accionista mayoritario de Pixar, miembro de la junta directiva de The Walt Disney Company luego de la adquisición de Pixar, y fundador, presidente. y CEO de NeXT. Jobs es ampliamente reconocido como un pionero de la revolución de las computadoras personales de los años setenta y ochenta, junto con el cofundador de Apple, Steve Wozniak. Jobs nació en San Francisco, California, y fue puesto en adopción. Fue criado en el área de la bahía de San Francisco. Asistió a Reed College en 1972 antes de abandonar ese mismo año, y viajó por la India en 1974 buscando la iluminación y estudiando el budismo zen.""",
|
120 |
+
"""Titanic es una película de desastre y romance épico estadounidense de 1997 dirigida, escrita, coproducida y coeditada por James Cameron. Incorporando aspectos tanto históricos como ficticios, se basa en relatos del hundimiento del RMS Titanic, y está protagonizada por Leonardo DiCaprio y Kate Winslet como miembros de diferentes clases sociales que se enamoran a bordo del barco durante su desafortunado viaje inaugural.""",
|
121 |
+
"""Además de ser el rey del norte, John Snow es un médico inglés y un líder en el desarrollo de la anestesia y la higiene médica. Se lo considera el primero en usar datos para curar el brote de cólera en 1834."""
|
122 |
+
]
|
123 |
+
|
124 |
+
selected_text = st.selectbox("Select an example", examples)
|
125 |
+
custom_input = st.text_input("Try it with your own Sentence!")
|
126 |
+
|
127 |
+
text_to_analyze = custom_input if custom_input else selected_text
|
128 |
+
|
129 |
+
st.subheader('Full example text')
|
130 |
+
HTML_WRAPPER = """<div class="scroll entities" style="overflow-x: auto; border: 1px solid #e6e9ef; border-radius: 0.25rem; padding: 1rem; margin-bottom: 2.5rem; white-space:pre-wrap">{}</div>"""
|
131 |
+
st.markdown(HTML_WRAPPER.format(text_to_analyze), unsafe_allow_html=True)
|
132 |
+
|
133 |
+
# Initialize Spark and create pipeline
|
134 |
+
spark = init_spark()
|
135 |
+
pipeline = create_pipeline(model)
|
136 |
+
output = fit_data(pipeline, text_to_analyze)
|
137 |
+
|
138 |
+
# Display matched sentence
|
139 |
+
st.subheader("Processed output:")
|
140 |
+
|
141 |
+
results = {
|
142 |
+
'Document': output[0]['document'][0].result,
|
143 |
+
'NER Chunk': [n.result for n in output[0]['ner_chunk']],
|
144 |
+
"NER Label": [n.metadata['entity'] for n in output[0]['ner_chunk']]
|
145 |
+
}
|
146 |
+
|
147 |
+
annotate(results)
|
148 |
+
|
149 |
+
with st.expander("View DataFrame"):
|
150 |
+
df = pd.DataFrame({'NER Chunk': results['NER Chunk'], 'NER Label': results['NER Label']})
|
151 |
+
df.index += 1
|
152 |
+
st.dataframe(df)
|
153 |
+
|
Dockerfile
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
# Download base image ubuntu 18.04
|
2 |
+
FROM ubuntu:18.04
|
3 |
+
|
4 |
+
# Set environment variables
|
5 |
+
ENV NB_USER jovyan
|
6 |
+
ENV NB_UID 1000
|
7 |
+
ENV HOME /home/${NB_USER}
|
8 |
+
|
9 |
+
# Install required packages
|
10 |
+
RUN apt-get update && apt-get install -y \
|
11 |
+
tar \
|
12 |
+
wget \
|
13 |
+
bash \
|
14 |
+
rsync \
|
15 |
+
gcc \
|
16 |
+
libfreetype6-dev \
|
17 |
+
libhdf5-serial-dev \
|
18 |
+
libpng-dev \
|
19 |
+
libzmq3-dev \
|
20 |
+
python3 \
|
21 |
+
python3-dev \
|
22 |
+
python3-pip \
|
23 |
+
unzip \
|
24 |
+
pkg-config \
|
25 |
+
software-properties-common \
|
26 |
+
graphviz \
|
27 |
+
openjdk-8-jdk \
|
28 |
+
ant \
|
29 |
+
ca-certificates-java \
|
30 |
+
&& apt-get clean \
|
31 |
+
&& update-ca-certificates -f;
|
32 |
+
|
33 |
+
# Install Python 3.8 and pip
|
34 |
+
RUN add-apt-repository ppa:deadsnakes/ppa \
|
35 |
+
&& apt-get update \
|
36 |
+
&& apt-get install -y python3.8 python3-pip \
|
37 |
+
&& apt-get clean;
|
38 |
+
|
39 |
+
# Set up JAVA_HOME
|
40 |
+
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
|
41 |
+
RUN mkdir -p ${HOME} \
|
42 |
+
&& echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/" >> ${HOME}/.bashrc \
|
43 |
+
&& chown -R ${NB_UID}:${NB_UID} ${HOME}
|
44 |
+
|
45 |
+
# Create a new user named "jovyan" with user ID 1000
|
46 |
+
RUN useradd -m -u ${NB_UID} ${NB_USER}
|
47 |
+
|
48 |
+
# Switch to the "jovyan" user
|
49 |
+
USER ${NB_USER}
|
50 |
+
|
51 |
+
# Set home and path variables for the user
|
52 |
+
ENV HOME=/home/${NB_USER} \
|
53 |
+
PATH=/home/${NB_USER}/.local/bin:$PATH
|
54 |
+
|
55 |
+
# Set the working directory to the user's home directory
|
56 |
+
WORKDIR ${HOME}
|
57 |
+
|
58 |
+
# Upgrade pip and install Python dependencies
|
59 |
+
RUN python3.8 -m pip install --upgrade pip
|
60 |
+
COPY requirements.txt /tmp/requirements.txt
|
61 |
+
RUN python3.8 -m pip install -r /tmp/requirements.txt
|
62 |
+
|
63 |
+
# Copy the application code into the container at /home/jovyan
|
64 |
+
COPY --chown=${NB_USER}:${NB_USER} . ${HOME}
|
65 |
+
|
66 |
+
# Expose port for Streamlit
|
67 |
+
EXPOSE 7860
|
68 |
+
|
69 |
+
# Define the entry point for the container
|
70 |
+
ENTRYPOINT ["streamlit", "run", "Demo.py", "--server.port=7860", "--server.address=0.0.0.0"]
|
pages/Workflow & Model Overview.py
ADDED
@@ -0,0 +1,264 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
|
3 |
+
# Custom CSS for better styling
|
4 |
+
st.markdown("""
|
5 |
+
<style>
|
6 |
+
.main-title {
|
7 |
+
font-size: 36px;
|
8 |
+
color: #4A90E2;
|
9 |
+
font-weight: bold;
|
10 |
+
text-align: center;
|
11 |
+
}
|
12 |
+
.sub-title {
|
13 |
+
font-size: 24px;
|
14 |
+
color: #4A90E2;
|
15 |
+
margin-top: 20px;
|
16 |
+
}
|
17 |
+
.section {
|
18 |
+
background-color: #f9f9f9;
|
19 |
+
padding: 15px;
|
20 |
+
border-radius: 10px;
|
21 |
+
margin-top: 20px;
|
22 |
+
}
|
23 |
+
.section h2 {
|
24 |
+
font-size: 22px;
|
25 |
+
color: #4A90E2;
|
26 |
+
}
|
27 |
+
.section p, .section ul {
|
28 |
+
color: #666666;
|
29 |
+
}
|
30 |
+
.link {
|
31 |
+
color: #4A90E2;
|
32 |
+
text-decoration: none;
|
33 |
+
}
|
34 |
+
</style>
|
35 |
+
""", unsafe_allow_html=True)
|
36 |
+
|
37 |
+
# Main Title
|
38 |
+
st.markdown('<div class="main-title">State-of-the-Art Named Entity Recognition with Spark NLP (Spanish)</div>', unsafe_allow_html=True)
|
39 |
+
|
40 |
+
# Introduction
|
41 |
+
st.markdown("""
|
42 |
+
<div class="section">
|
43 |
+
<p>Named Entity Recognition (NER) is the task of identifying important words in a text and associating them with a category. For example, we may be interested in finding all the personal names in documents, or company names in news articles. Other examples include domain-specific uses such as identifying all disease names in a clinical text, or company trading codes in financial ones.</p>
|
44 |
+
<p>NER can be implemented with many approaches. In this post, we introduce a deep learning-based method using the NerDL model. This approach leverages the scalability of Spark NLP with Python.</p>
|
45 |
+
</div>
|
46 |
+
""", unsafe_allow_html=True)
|
47 |
+
|
48 |
+
# Introduction to Spark NLP
|
49 |
+
st.markdown('<div class="sub-title">Introduction to Spark NLP</div>', unsafe_allow_html=True)
|
50 |
+
st.markdown("""
|
51 |
+
<div class="section">
|
52 |
+
<p>Spark NLP is an open-source library maintained by John Snow Labs. It is built on top of Apache Spark and Spark ML and provides simple, performant & accurate NLP annotations for machine learning pipelines that can scale easily in a distributed environment.</p>
|
53 |
+
<p>To install Spark NLP, you can simply use any package manager like conda or pip. For example, using pip you can simply run <code>pip install spark-nlp</code>. For different installation options, check the official <a href="https://nlp.johnsnowlabs.com/docs/en/install" target="_blank" class="link">documentation</a>.</p>
|
54 |
+
</div>
|
55 |
+
""", unsafe_allow_html=True)
|
56 |
+
|
57 |
+
# Using NerDL Model
|
58 |
+
st.markdown('<div class="sub-title">Using NerDL Model</div>', unsafe_allow_html=True)
|
59 |
+
st.markdown("""
|
60 |
+
<div class="section">
|
61 |
+
<p>The NerDL model in Spark NLP is a deep learning-based approach for NER tasks. It uses a Char CNNs - BiLSTM - CRF architecture that achieves state-of-the-art results in most datasets. The training data should be a labeled Spark DataFrame in the format of CoNLL 2003 IOB with annotation type columns.</p>
|
62 |
+
</div>
|
63 |
+
""", unsafe_allow_html=True)
|
64 |
+
|
65 |
+
# Setup Instructions
|
66 |
+
st.markdown('<div class="sub-title">Setup</div>', unsafe_allow_html=True)
|
67 |
+
st.markdown('<p>To install Spark NLP in Python, use your favorite package manager (conda, pip, etc.). For example:</p>', unsafe_allow_html=True)
|
68 |
+
st.code("""
|
69 |
+
pip install spark-nlp
|
70 |
+
pip install pyspark
|
71 |
+
""", language="bash")
|
72 |
+
|
73 |
+
st.markdown("<p>Then, import Spark NLP and start a Spark session:</p>", unsafe_allow_html=True)
|
74 |
+
st.code("""
|
75 |
+
import sparknlp
|
76 |
+
|
77 |
+
# Start Spark Session
|
78 |
+
spark = sparknlp.start()
|
79 |
+
""", language='python')
|
80 |
+
|
81 |
+
# Example Usage with NerDL Model in Italian
|
82 |
+
st.markdown('<div class="sub-title">Example Usage with NerDL Model in Italian</div>', unsafe_allow_html=True)
|
83 |
+
st.markdown("""
|
84 |
+
<div class="section">
|
85 |
+
<p>Below is an example of how to set up and use the NerDL model for named entity recognition in Italian:</p>
|
86 |
+
</div>
|
87 |
+
""", unsafe_allow_html=True)
|
88 |
+
st.code('''
|
89 |
+
from sparknlp.base import *
|
90 |
+
from sparknlp.annotator import *
|
91 |
+
from pyspark.ml import Pipeline
|
92 |
+
from pyspark.sql.functions import col, expr, round, concat, lit
|
93 |
+
|
94 |
+
# Document Assembler
|
95 |
+
document_assembler = DocumentAssembler() \\
|
96 |
+
.setInputCol("text") \\
|
97 |
+
.setOutputCol("document")
|
98 |
+
|
99 |
+
# Tokenizer
|
100 |
+
tokenizer = Tokenizer() \\
|
101 |
+
.setInputCols(["document"]) \\
|
102 |
+
.setOutputCol("token")
|
103 |
+
|
104 |
+
# Word Embeddings
|
105 |
+
embeddings = WordEmbeddingsModel.pretrained('glove_840B_300', lang='xx') \\
|
106 |
+
.setInputCols(["document", "token"]) \\
|
107 |
+
.setOutputCol("embeddings")
|
108 |
+
|
109 |
+
# NerDL Model
|
110 |
+
ner_model = NerDLModel.pretrained('ner_wikiner_glove_840B_300', 'xx') \\
|
111 |
+
.setInputCols(["document", "token", "embeddings"]) \\
|
112 |
+
.setOutputCol("ner")
|
113 |
+
|
114 |
+
# NER Converter
|
115 |
+
ner_converter = NerConverter() \\
|
116 |
+
.setInputCols(["document", "token", "ner"]) \\
|
117 |
+
.setOutputCol("ner_chunk")
|
118 |
+
|
119 |
+
# Pipeline
|
120 |
+
pipeline = Pipeline(stages=[
|
121 |
+
document_assembler,
|
122 |
+
tokenizer,
|
123 |
+
embeddings,
|
124 |
+
ner_model,
|
125 |
+
ner_converter
|
126 |
+
])
|
127 |
+
|
128 |
+
# Example sentence
|
129 |
+
example = """
|
130 |
+
En el corazón de Madrid, la Puerta del Sol es uno de los lugares más emblemáticos de España. Salvador Dalí, uno de los pintores más célebres del siglo XX, nació en Figueres en 1904. A lo largo de su carrera, Dalí creó obras como "La persistencia de la memoria" y "Cristo de San Juan de la Cruz", que se exhiben en museos de Barcelona y Nueva York.
|
131 |
+
El Museo del Prado, situado en el centro de Madrid, alberga obras maestras de artistas como Francisco de Goya y Diego Velázquez. El Rey Felipe VI, nacido Felipe Juan Pablo Alfonso de Todos los Santos de Borbón y de Grecia en Madrid en 1968, es el actual monarca de España.
|
132 |
+
La Sagrada Familia, diseñada por Antoni Gaudí, es un símbolo de la arquitectura modernista y se encuentra en Barcelona. Pablo Picasso, nacido en Málaga en 1881, es famoso por sus pinturas y esculturas como "Guernica" y "Las señoritas de Aviñón", que se exhiben en el Museo Reina Sofía de Madrid.
|
133 |
+
Sevilla es conocida por su catedral y el Alcázar. La Alhambra de Granada, un palacio y fortaleza de la época nazarí, es uno de los sitios más visitados del país. El Museo Guggenheim de Bilbao, diseñado por Frank Gehry, es un icono de la arquitectura contemporánea y alberga obras de artistas modernos.
|
134 |
+
Valencia acoge cada año Las Fallas, un festival en el que se queman grandes figuras de cartón. Zaragoza es famosa por la Basílica del Pilar y el río Ebro. San Sebastián, con su festival de cine, atrae a celebridades de todo el mundo.
|
135 |
+
En el ámbito literario, Miguel de Cervantes, autor de "Don Quijote de la Mancha", es una figura central de la literatura española. En la política, Pedro Sánchez, nacido en Madrid en 1972, es el actual presidente del Gobierno de España, mientras que el Partido Popular y el Partido Socialista Obrero Español son las principales fuerzas políticas del país.
|
136 |
+
España también es conocida por su gastronomía, con platos típicos como la paella de Valencia, el gazpacho andaluz y el jamón ibérico de Salamanca. La selección española de fútbol, campeona del mundo en 2010, es una de las más exitosas en la historia del deporte.
|
137 |
+
"""
|
138 |
+
|
139 |
+
data = spark.createDataFrame([[example]]).toDF("text")
|
140 |
+
|
141 |
+
# Transforming data
|
142 |
+
result = pipeline.fit(data).transform(data)
|
143 |
+
|
144 |
+
# Select the result, entity, and confidence columns
|
145 |
+
result.select(
|
146 |
+
expr("explode(ner_chunk) as ner_chunk")
|
147 |
+
).select(
|
148 |
+
col("ner_chunk.result").alias("result"),
|
149 |
+
col("ner_chunk.metadata").getItem("entity").alias("entity"),
|
150 |
+
concat(
|
151 |
+
round((col("ner_chunk.metadata").getItem("confidence").cast("float") * 100), 2),
|
152 |
+
lit("%")
|
153 |
+
).alias("confidence")
|
154 |
+
).show(truncate=False)
|
155 |
+
''', language="python")
|
156 |
+
|
157 |
+
st.text("""
|
158 |
+
+-------------------------------------------------------+------+----------+
|
159 |
+
|result |entity|confidence|
|
160 |
+
+-------------------------------------------------------+------+----------+
|
161 |
+
|Madrid |LOC |82.31% |
|
162 |
+
|Puerta del Sol |LOC |58.42% |
|
163 |
+
|España |LOC |88.22% |
|
164 |
+
|Salvador Dalí |PER |68.36% |
|
165 |
+
|Figueres |LOC |95.41% |
|
166 |
+
|Dalí |PER |99.26% |
|
167 |
+
|San Juan de la Cruz |LOC |46.17% |
|
168 |
+
|Barcelona |LOC |94.67% |
|
169 |
+
|Nueva York |LOC |72.62% |
|
170 |
+
|Museo del Prado |LOC |62.26% |
|
171 |
+
|Madrid |LOC |86.81% |
|
172 |
+
|Francisco de Goya |PER |52.51% |
|
173 |
+
|Diego Velázquez |PER |64.0% |
|
174 |
+
|Rey Felipe VI |PER |62.7% |
|
175 |
+
|Felipe Juan Pablo Alfonso de Todos los Santos de Borbón|PER |58.58% |
|
176 |
+
|Grecia |LOC |73.8% |
|
177 |
+
|Madrid |LOC |93.21% |
|
178 |
+
|España |LOC |82.56% |
|
179 |
+
|Sagrada Familia |LOC |44.24% |
|
180 |
+
|Antoni Gaudí |PER |74.36% |
|
181 |
+
+-------------------------------------------------------+------+----------+
|
182 |
+
""")
|
183 |
+
|
184 |
+
# Benchmark Section
|
185 |
+
st.markdown('<div class="sub-title">Benchmark</div>', unsafe_allow_html=True)
|
186 |
+
st.markdown("""
|
187 |
+
<div class="section">
|
188 |
+
<p>Evaluating the performance of NER models is crucial to understanding their effectiveness in real-world applications. Below are the benchmark results for the "ner_wikiner_glove_840B_300" model on <strong>Spanish</strong> text, focusing on various named entity categories. The metrics used include precision, recall, and F1-score, which are standard for evaluating classification models.</p>
|
189 |
+
</div>
|
190 |
+
""", unsafe_allow_html=True)
|
191 |
+
st.markdown("""
|
192 |
+
---
|
193 |
+
#### Classification Report
|
194 |
+
|
195 |
+
| Label | Precision | Recall | F1-Score | Support |
|
196 |
+
|-------|-----------|--------|----------|---------|
|
197 |
+
| B-LOC | 0.86 | 0.90 | 0.88 | 11963 |
|
198 |
+
| I-ORG | 0.82 | 0.78 | 0.80 | 1950 |
|
199 |
+
| I-LOC | 0.84 | 0.81 | 0.83 | 6162 |
|
200 |
+
| I-PER | 0.95 | 0.93 | 0.94 | 4678 |
|
201 |
+
| B-ORG | 0.83 | 0.77 | 0.80 | 2084 |
|
202 |
+
| B-PER | 0.93 | 0.94 | 0.94 | 7215 |
|
203 |
+
|
204 |
+
#### Averages
|
205 |
+
|
206 |
+
| Metric | Precision | Recall | F1-Score | Support |
|
207 |
+
|----------------|-----------|--------|----------|---------|
|
208 |
+
| Micro Average | 0.88 | 0.88 | 0.88 | 34052 |
|
209 |
+
| Macro Average | 0.87 | 0.86 | 0.86 | 34052 |
|
210 |
+
| Weighted Avg | 0.88 | 0.88 | 0.88 | 34052 |
|
211 |
+
|
212 |
+
#### Overall Metrics
|
213 |
+
|
214 |
+
- Processed 348,209 tokens with 24,505 phrases; found: 24,375 phrases; correct: 21,187.
|
215 |
+
- Accuracy (non-O): **85.54%**
|
216 |
+
- Overall Accuracy: **98.07%**
|
217 |
+
- Precision: **86.92%**
|
218 |
+
- Recall: **86.46%**
|
219 |
+
- F1 Score: **86.69**
|
220 |
+
|
221 |
+
#### Entity-Specific Metrics
|
222 |
+
|
223 |
+
| Entity | Precision | Recall | F1-Score | Instances |
|
224 |
+
|--------|-----------|--------|----------|-----------|
|
225 |
+
| LOC | 85.32% | 89.28% | 87.25 | 12518 |
|
226 |
+
| MISC | 82.54% | 67.78% | 74.43 | 2663 |
|
227 |
+
| ORG | 81.85% | 76.39% | 79.03 | 1945 |
|
228 |
+
| PER | 92.66% | 93.10% | 92.88 | 7249 |
|
229 |
+
|
230 |
+
---
|
231 |
+
""", unsafe_allow_html=True)
|
232 |
+
|
233 |
+
# Summary
|
234 |
+
st.markdown('<div class="sub-title">Summary</div>', unsafe_allow_html=True)
|
235 |
+
st.markdown("""
|
236 |
+
<div class="section">
|
237 |
+
<p>In this article, we discussed named entity recognition using a deep learning-based method with the "wikiner_840B_300" model for Italian. We introduced how to perform the task using the open-source Spark NLP library with Python, which can be used at scale in the Spark ecosystem. These methods can be used for natural language processing applications in various fields, including finance and healthcare.</p>
|
238 |
+
</div>
|
239 |
+
""", unsafe_allow_html=True)
|
240 |
+
|
241 |
+
# References
|
242 |
+
st.markdown('<div class="sub-title">References</div>', unsafe_allow_html=True)
|
243 |
+
st.markdown("""
|
244 |
+
<div class="section">
|
245 |
+
<ul>
|
246 |
+
<li><a class="link" href="https://sparknlp.org/api/python/reference/autosummary/sparknlp/annotator/ner/ner_dl/index.html" target="_blank" rel="noopener">NerDLModel</a> annotator documentation</li>
|
247 |
+
<li>Model Used: <a class="link" href="https://sparknlp.org/2021/07/19/ner_wikiner_glove_840B_300_xx.html" target="_blank" rel="noopener">ner_wikiner_glove_840B_300</a></li>
|
248 |
+
<li><a class="link" href="https://nlp.johnsnowlabs.com/recognize_entitie" target="_blank" rel="noopener">Visualization demos for NER in Spark NLP</a></li>
|
249 |
+
<li><a class="link" href="https://www.johnsnowlabs.com/named-entity-recognition-ner-with-bert-in-spark-nlp/">Named Entity Recognition (NER) with BERT in Spark NLP</a></li>
|
250 |
+
</ul>
|
251 |
+
</div>
|
252 |
+
""", unsafe_allow_html=True)
|
253 |
+
|
254 |
+
# Community & Support
|
255 |
+
st.markdown('<div class="sub-title">Community & Support</div>', unsafe_allow_html=True)
|
256 |
+
st.markdown("""
|
257 |
+
<div class="section">
|
258 |
+
<ul>
|
259 |
+
<li><a class="link" href="https://sparknlp.org/" target="_blank">Official Website</a>: Documentation and examples</li>
|
260 |
+
<li><a class="link" href="https://join.slack.com/t/spark-nlp/shared_invite/zt-198dipu77-L3UWNe_AJf4Rqb3DaMb-7A" target="_blank">Slack Community</a>: Connect with other Spark NLP users</li>
|
261 |
+
<li><a class="link" href="https://github.com/JohnSnowLabs/spark-nlp" target="_blank">GitHub Repository</a>: Source code and issue tracker</li>
|
262 |
+
</ul>
|
263 |
+
</div>
|
264 |
+
""", unsafe_allow_html=True)
|
requirements.txt
ADDED
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
streamlit
|
2 |
+
st-annotated-text
|
3 |
+
pandas
|
4 |
+
numpy
|
5 |
+
spark-nlp
|
6 |
+
pyspark
|