Persian-NER / Demo.py
abdullahmubeen10's picture
Upload 5 files
68747de verified
import streamlit as st
import sparknlp
import os
import pandas as pd
from sparknlp.base import *
from sparknlp.annotator import *
from pyspark.ml import Pipeline
from sparknlp.pretrained import PretrainedPipeline
from annotated_text import annotated_text
# Page configuration
st.set_page_config(
layout="wide",
initial_sidebar_state="auto"
)
# CSS for styling
st.markdown("""
<style>
.main-title {
font-size: 36px;
color: #4A90E2;
font-weight: bold;
text-align: center;
}
.section {
background-color: #f9f9f9;
padding: 10px;
border-radius: 10px;
margin-top: 10px;
}
.section p, .section ul {
color: #666666;
}
</style>
""", unsafe_allow_html=True)
@st.cache_resource
def init_spark():
return sparknlp.start()
@st.cache_resource
def create_pipeline(model):
documentAssembler = DocumentAssembler() \
.setInputCol("text") \
.setOutputCol("document")
sentenceDetector = SentenceDetectorDLModel.pretrained("sentence_detector_dl", "xx") \
.setInputCols(["document"]) \
.setOutputCol("sentence")
tokenizer = Tokenizer() \
.setInputCols(["sentence"]) \
.setOutputCol("token")
word_embeddings = WordEmbeddingsModel.pretrained("persian_w2v_cc_300d", "fa") \
.setInputCols(["document", "token"]) \
.setOutputCol("embeddings")
ner = NerDLModel.pretrained("personer_cc_300d", "fa") \
.setInputCols(["sentence", "token", "embeddings"]) \
.setOutputCol("ner")
ner_converter = NerConverter().setInputCols(["sentence", "token", "ner"]).setOutputCol("ner_chunk")
pipeline = Pipeline(stages=[documentAssembler, sentenceDetector, tokenizer, word_embeddings, ner, ner_converter])
return pipeline
def fit_data(pipeline, data):
empty_df = spark.createDataFrame([['']]).toDF('text')
pipeline_model = pipeline.fit(empty_df)
model = LightPipeline(pipeline_model)
result = model.fullAnnotate(data)
return result
def annotate(data):
document, chunks, labels = data["Document"], data["NER Chunk"], data["NER Label"]
annotated_words = []
for chunk, label in zip(chunks, labels):
parts = document.split(chunk, 1)
if parts[0]:
annotated_words.append(parts[0])
annotated_words.append((chunk, label))
document = parts[1]
if document:
annotated_words.append(document)
annotated_text(*annotated_words)
# Set up the page layout
st.markdown('<div class="main-title">Recognize entities in Persian text</div>', unsafe_allow_html=True)
st.markdown('<div class="section"><p>The <code>personer_cc_300d</code> model uses Persian word embeddings to find 6 different types of entities in Persian text. It is trained using <code>persian_w2v_cc_300d</code> word embeddings</p></div>', unsafe_allow_html=True)
# Sidebar content
model = st.sidebar.selectbox(
"Choose the pretrained model",
["personer_cc_300d"],
help="For more info about the models visit: https://sparknlp.org/models"
)
# Reference notebook link in sidebar
link = """
<a href="https://colab.research.google.com/github/JohnSnowLabs/spark-nlp-workshop/blob/master/tutorials/streamlit_notebooks/public/NER.ipynb">
<img src="https://colab.research.google.com/assets/colab-badge.svg" style="zoom: 1.3" alt="Open In Colab"/>
</a>
"""
st.sidebar.markdown('Reference notebook:')
st.sidebar.markdown(link, unsafe_allow_html=True)
# Load examples
examples = [
"ویلیام هنری گیتس سوم (متولد 28 اکتبر 1955) یک تاجر آمریکایی، توسعه دهنده نرم افزار، سرمایه گذار و نیکوکار است. او بیشتر به عنوان یکی از بنیانگذاران شرکت مایکروسافت شناخته می‌شود. در طول دوران حرفه‌ای خود در مایکروسافت، گیتس در سمت‌های رئیس هیئت مدیره، مدیرعامل (CEO)، رئیس و معمار ارشد نرم‌افزار فعالیت داشته و تا ماه مه 2014 بزرگترین سهامدار فردی بوده است. او یکی از کارآفرینان و پیشگامان مشهور انقلاب میکروکامپیوترهای دهه 1970 و 1980 است. گیتس که در سیاتل، واشنگتن به دنیا آمده و بزرگ شده است، در سال 1975 به همراه دوست دوران کودکی خود، پل آلن، مایکروسافت را در آلبوکرکی، نیومکزیکو تأسیس کرد. این شرکت به بزرگترین شرکت نرم‌افزاری کامپیوتر شخصی جهان تبدیل شد. گیتس تا ژانویه 2000 به عنوان رئیس هیئت مدیره و مدیرعامل شرکت را رهبری کرد، اما به عنوان رئیس هیئت مدیره باقی ماند و معمار ارشد نرم‌افزار شد. در اواخر دهه 1990، گیتس به دلیل تاکتیک‌های تجاری خود که ضد رقابتی تلقی می‌شدند، مورد انتقاد قرار گرفت. این نظر توسط دادگاه‌های متعدد تأیید شده است. در ژوئن 2006، گیتس اعلام کرد که به یک نقش نیمه وقت در مایکروسافت و کار تمام وقت در بنیاد خیریه خصوصی بیل و ملیندا گیتس که او و همسرش ملیندا گیتس در سال 2000 تأسیس کرده بودند، منتقل خواهد شد. او به تدریج وظایف خود را به ری اوزی و کریگ موندی منتقل کرد. او در فوریه 2014 از سمت رئیس هیئت مدیره مایکروسافت استعفا داد و به عنوان مشاور فناوری برای حمایت از مدیرعامل تازه منصوب شده ساتیا نادلا پست جدیدی را بر عهده گرفت.",
"مونالیزا یک نقاشی روغنی قرن شانزدهم است که توسط لئوناردو داوینچی خلق شده است. این اثر در موزه لوور در پاریس نگهداری می‌شود.",
"وقتی سباستین تورون در سال 2007 شروع به کار بر روی خودروهای خودران در گوگل کرد، افراد کمی خارج از شرکت او را جدی گرفتند. تورون، که اکنون یکی از بنیانگذاران و مدیرعامل استارتاپ آموزش عالی آنلاین Udacity است، در مصاحبه‌ای با Recode در اوایل این هفته گفت: «می‌توانم بگویم مدیران ارشد بسیار بالای شرکت‌های بزرگ خودروسازی آمریکایی دست من را می‌فشردند و برمی‌گشتند زیرا صحبت با من ارزش نداشت.»",
"فیسبوک یک سرویس شبکه اجتماعی است که در 4 فوریه 2004 با نام TheFacebook راه اندازی شد. این سرویس توسط مارک زاکربرگ و هم اتاقی‌های کالج و هم دانشگاهیانش در دانشگاه هاروارد، ادواردو ساورین، اندرو مک کولوم، داستین موسکویتز و کریس هیوز تأسیس شد. عضویت وب سایت در ابتدا توسط بنیانگذاران محدود به دانشجویان هاروارد بود، اما به دیگر کالج‌ها در منطقه بوستون، آیوی لیگ و به تدریج بیشتر دانشگاه‌های ایالات متحده و کانادا گسترش یافت.",
"تاریخچه پردازش زبان طبیعی به طور کلی از دهه 1950 آغاز شد، اگرچه آثاری از دوره‌های قبل نیز وجود دارد. در سال 1950، آلن تورینگ مقاله‌ای با عنوان «ماشین محاسبات و هوش» منتشر کرد که آزمونی را پیشنهاد کرد که اکنون به عنوان آزمون تورینگ به عنوان معیار هوش شناخته می‌شود.",
"جفری اورست هینتون یک روانشناس شناختی و دانشمند رایانه کانادایی انگلیسی است که بیشتر به خاطر کارش بر روی شبکه‌های عصبی مصنوعی شناخته می‌شود. از سال 2013 او زمان خود را بین کار برای گوگل و دانشگاه تورنتو تقسیم کرده است. در سال 2017، او هم بنیانگذار و مشاور ارشد علمی موسسه وکتور در تورنتو شد.",
"وقتی به جان گفتم که می‌خواهم به آلاسکا نقل مکان کنم، او به من هشدار داد که در آنجا برای پیدا کردن یک استارباکس دچار مشکل خواهم شد.",
"استیون پاول جابز یک تاجر آمریکایی، طراح صنعتی، سرمایه‌گذار و مالک رسانه بود. او رئیس هیئت مدیره، مدیرعامل (CEO) و یکی از بنیانگذاران شرکت اپل، رئیس هیئت مدیره و سهامدار عمده پیکسار، عضو هیئت مدیره شرکت والت دیزنی پس از خرید پیکسار و بنیانگذار، رئیس هیئت مدیره و مدیرعامل نکست بود. جابز به همراه بنیانگذار اپل، استیو وزنیاک، به عنوان یکی از پیشگامان انقلاب کامپیوترهای شخصی دهه 1970 و 1980 شناخته می‌شود. جابز در سانفرانسیسکو، کالیفرنیا به دنیا آمد و به فرزندخواندگی پذیرفته شد. او در منطقه خلیج سانفرانسیسکو بزرگ شد. در سال 1972 به کالج رید رفت، اما همان سال ترک تحصیل کرد و در سال 1974 به هند سفر کرد تا به دنبال روشن‌بینی بگردد و به مطالعه ذن بودیسم بپردازد.",
"تایتانیک یک فیلم حماسی عاشقانه و فاجعه‌آمیز آمریکایی محصول سال 1997 است که توسط جیمز کامرون کارگردانی، نویسندگی، تهیه‌کنندگی و تدوین شده است. این فیلم که جنبه‌های تاریخی و داستانی را در بر می‌گیرد، بر اساس روایت‌های غرق شدن کشتی RMS تایتانیک ساخته شده و لئوناردو دی کاپریو و کیت وینسلت به عنوان اعضای طبقات اجتماعی مختلف که در طول سفر ناموفق کشتی عاشق می‌شوند، بازی می‌کنند.",
"علاوه بر اینکه پادشاه شمال است، جان اسنو یک پزشک انگلیسی و یکی از پیشگامان در توسعه بیهوشی و بهداشت پزشکی است. او به عنوان اولین کسی که از داده‌ها برای درمان شیوع وبا در سال 1834 استفاده کرد، شناخته می‌شود."
]
selected_text = st.selectbox("Select an example", examples)
custom_input = st.text_input("Try it with your own Sentence!")
text_to_analyze = custom_input if custom_input else selected_text
st.subheader('Full example text')
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>"""
st.markdown(HTML_WRAPPER.format(text_to_analyze), unsafe_allow_html=True)
# Initialize Spark and create pipeline
spark = init_spark()
pipeline = create_pipeline(model)
output = fit_data(pipeline, text_to_analyze)
# Display matched sentence
st.subheader("Processed output:")
results = {
'Document': output[0]['document'][0].result,
'NER Chunk': [n.result for n in output[0]['ner_chunk']],
"NER Label": [n.metadata['entity'] for n in output[0]['ner_chunk']]
}
annotate(results)
with st.expander("View DataFrame"):
df = pd.DataFrame({'NER Chunk': results['NER Chunk'], 'NER Label': results['NER Label']})
df.index += 1
st.dataframe(df)