Spaces:
Runtime error
Runtime error
| import pandas as pd | |
| import streamlit as st | |
| from text_annotation import annotated_text | |
| from streamlit_option_menu import option_menu | |
| from sentiment_analysis import SentimentAnalysis | |
| from keyword_extraction import KeywordExtractor | |
| from part_of_speech_tagging import POSTagging | |
| from emotion_detection import EmotionDetection | |
| from named_entity_recognition import NamedEntityRecognition | |
| hide_streamlit_style = """ | |
| <style> | |
| #MainMenu {visibility: hidden;} | |
| footer {visibility: hidden;} | |
| </style> | |
| """ | |
| st.markdown(hide_streamlit_style, unsafe_allow_html=True) | |
| def load_sentiment_model(): | |
| return SentimentAnalysis() | |
| def load_keyword_model(): | |
| return KeywordExtractor() | |
| def load_pos_model(): | |
| return POSTagging() | |
| def load_emotion_model(): | |
| return EmotionDetection() | |
| def load_ner_model(): | |
| return NamedEntityRecognition() | |
| sentiment_analyzer = load_sentiment_model() | |
| keyword_extractor = load_keyword_model() | |
| pos_tagger = load_pos_model() | |
| emotion_detector = load_emotion_model() | |
| ner = load_ner_model() | |
| with st.sidebar: | |
| page = option_menu(menu_title='Menu', | |
| menu_icon="robot", | |
| options=["Welcome!", | |
| "Sentiment Analysis", | |
| "Keyword Extraction", | |
| "Part of Speech Tagging", | |
| "Emotion Detection", | |
| "Named Entity Recognition"], | |
| icons=["house-door", | |
| "emoji-heart-eyes", | |
| "key", | |
| "chat-dots", | |
| "emoji-heart-eyes", | |
| "building"], | |
| default_index=0 | |
| ) | |
| st.title('Open-source NLP') | |
| if page == "Welcome!": | |
| st.header('Welcome!') | |
| st.write( | |
| """ | |
| Supercharge your workflow with this platform built using 100% open-source resources! | |
| """ | |
| ) | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| st.subheader("Introduction") | |
| st.write(""" | |
| Welcome! This application is a celebration of open-source and the power that programmers have been granted today | |
| by those who give back to the community. This tool was constructed using Streamlit, Huggingface Transformers, | |
| Transformers-Interpret, NLTK, Spacy, amongst other open-source Python libraries and models. | |
| Utilizing this tool you will be able to perform a multitude of Natural Language Processing Tasks on a range of | |
| different tasks. All you need to do is paste your input, select your task, and hit the start button! | |
| * This application currently supports: | |
| * Sentiment Analysis | |
| * Keyword Extraction | |
| * Part of Speech Tagging | |
| * Emotion Detection | |
| * Named Entity Recognition | |
| More features may be added in the future, depending on community feedback. Please reach out to me at | |
| miesner.jacob@gmail.com or at my Linkedin page listed below if you have ideas or suggestions for improvement. | |
| If you would like to contribute yourself, feel free to fork the Github repository listed below and submit a merge request. | |
| """ | |
| ) | |
| st.subheader("Notes") | |
| st.write( | |
| """ | |
| * This dashboard was contsructed by Jacob Miesner, but every resource used is open-source! If you are interested | |
| in his other works you can view them here: | |
| [Project Github](https://github.com/MiesnerJacob/nlp-dashboard) | |
| [Jacob Miesner's Github](https://github.com/MiesnerJacob) | |
| [Jacob Miesner's Linkedin](https://www.linkedin.com/in/jacob-miesner-885050125/) | |
| [Jacob Miesner's Website](https://www.jacobmiesner.com) | |
| * The prediction justification for some of the tasks are printed as the model views them. For this reason the text | |
| may contain special tokens like [CLS] or [SEP] or even hashtags splitting words. If you are knowledgeable about | |
| language models and how they work these will be familiar, if you do not have prior experience with language models | |
| you can ignore these characters. | |
| """ | |
| ) | |
| elif page == "Sentiment Analysis": | |
| st.header('Sentiment Analysis') | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| text = st.text_area("Paste text here", value="") | |
| if st.button('Start!'): | |
| with st.spinner("Loading..."): | |
| preds, html = sentiment_analyzer.run(text) | |
| st.success('All done!') | |
| st.write("") | |
| st.subheader("Sentiment Predictions") | |
| st.bar_chart(data=preds, width=0, height=0, use_container_width=True) | |
| st.write("") | |
| st.subheader("Sentiment Justification") | |
| raw_html = html._repr_html_() | |
| st.components.v1.html(raw_html) | |
| elif page == "Keyword Extraction": | |
| st.header('Keyword Extraction') | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| text = st.text_area("Paste text here", value="") | |
| max_keywords = st.slider('# of Keywords Max Limit', min_value=1, max_value=10, value=5, step=1) | |
| if st.button('Start!'): | |
| with st.spinner("Loading..."): | |
| annotation, keywords = keyword_extractor.generate(text, max_keywords) | |
| st.success('All done!') | |
| if annotation: | |
| st.subheader("Keyword Annotation") | |
| st.write("") | |
| annotated_text(*annotation) | |
| st.text("") | |
| st.subheader("Extracted Keywords") | |
| st.write("") | |
| df = pd.DataFrame(keywords, columns=['Extracted Keywords']) | |
| csv = df.to_csv(index=False).encode('utf-8') | |
| st.download_button('Download Keywords to CSV', csv, file_name='news_intelligence_keywords.csv') | |
| data_table = st.table(df) | |
| elif page == "Part of Speech Tagging": | |
| st.header('Part of Speech Tagging') | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| text = st.text_area("Paste text here", value="") | |
| if st.button('Start!'): | |
| with st.spinner("Loading..."): | |
| preds = pos_tagger.classify(text) | |
| st.success('All done!') | |
| st.write("") | |
| st.subheader("Part of Speech tags") | |
| annotated_text(*preds) | |
| st.write("") | |
| st.components.v1.iframe('https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html', height=1000) | |
| elif page == "Emotion Detection": | |
| st.header('Emotion Detection') | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| text = st.text_area("Paste text here", value="") | |
| if st.button('Start!'): | |
| with st.spinner("Loading..."): | |
| preds, html = emotion_detector.run(text) | |
| st.success('All done!') | |
| st.write("") | |
| st.subheader("Emotion Predictions") | |
| st.bar_chart(data=preds, width=0, height=0, use_container_width=True) | |
| raw_html = html._repr_html_() | |
| st.write("") | |
| st.subheader("Emotion Justification") | |
| st.components.v1.html(raw_html, height=500) | |
| elif page == "Named Entity Recognition": | |
| st.header('Named Entity Recognition') | |
| st.markdown("") | |
| st.write( | |
| """ | |
| """ | |
| ) | |
| text = st.text_area("Paste text here", value="") | |
| if st.button('Start!'): | |
| with st.spinner("Loading..."): | |
| preds, ner_annotation = ner.classify(text) | |
| st.success('All done!') | |
| st.write("") | |
| st.subheader("NER Predictions") | |
| annotated_text(*ner_annotation) | |
| st.write("") | |
| st.subheader("NER Prediction Metadata") | |
| st.write(preds) | |