Een gestructureerde financiële nieuwsfeed bouwen met Python, SpaCy en Streamlit

Bronknooppunt: 1876513

Een gestructureerde financiële nieuwsfeed bouwen met Python, SpaCy en Streamlit

Aan de slag met NLP door een Named Entity Recognition (NER) applicatie te bouwen.


By Harde Tyagi, Docent Data Science | Mentor | YouTuber


Een gestructureerde financiële nieuwsfeed bouwen met Python, SpaCy en Streamlit

Een van de zeer interessante en veelgebruikte toepassingen van NLP is Named Entity Recognition (NER).

Inzichten verkrijgen uit ruwe en ongestructureerde data is van levensbelang. Het uploaden van een document en het eruit halen van de belangrijke stukjes informatie wordt informatie ophalen genoemd.

Het ophalen van informatie is een belangrijke taak/uitdaging geweest in NLP. En NER (of NEL - Named Entity Linking) wordt in verschillende domeinen (financiën, drugs, e-commerce, enz.) gebruikt voor het ophalen van informatie.

In deze zelfstudiepost laat ik u zien hoe u NEL kunt gebruiken om een ​​aangepaste nieuwsfeed voor de aandelenmarkt te ontwikkelen met een lijst van de zoemende aandelen op internet.

Pre-requisites

 
 
Dergelijke voorwaarden zijn er niet als zodanig. Mogelijk moet u enige bekendheid hebben met python en de basistaken van NLP, zoals tokenisatie, POS-tagging, afhankelijkheidsanalyse, enzovoort.

Ik zal de belangrijke stukjes in meer detail behandelen, dus zelfs als je een complete beginner bent, kun je je hoofd rond wat er aan de hand is, begrijpen.

Dus laten we doorgaan, volg het en je hebt een minimale voorraad nieuwsfeed die je kunt gaan onderzoeken.

Tools/installatie die je nodig hebt:

 
 

  1. Google Colab voor het eerste testen en verkennen van gegevens en de SpaCy-bibliotheek.
  2. VS Code (of een andere editor) om de Streamlit-toepassing te coderen.
  3. Bron van beursinformatie (nieuws) waarop we NER en later NEL zullen uitvoeren.
  4. Een virtuele python-omgeving (ik gebruik conda) samen met bibliotheken zoals Pandas, SpaCy, Streamlit, Streamlit-Spacy (als je wat SpaCy-renders wilt laten zien.)

Objectief

 
 
Het doel van dit project is om Named Entity Recognition te leren en toe te passen om belangrijke entiteiten (beursgenoteerde bedrijven in ons voorbeeld) te extraheren en vervolgens elke entiteit te koppelen met wat informatie met behulp van een kennisbank (Nifty500-bedrijvenlijst).

We halen de tekstgegevens van RSS-feeds op internet, halen de namen van zoemende aandelen eruit en trekken vervolgens hun marktprijsgegevens om de authenticiteit van het nieuws te testen voordat we een positie in die aandelen innemen.


Opmerking: NER is misschien geen state-of-the-art probleem, maar het heeft veel toepassingen in de industrie.


Ga naar Google Colab voor experimenten en testen:

Stap 1: Extraheren van de trending aandelen nieuwsgegevens

 
 
Om betrouwbaar authentiek beursnieuws te krijgen, gebruik ik Economic Times en Geldcontrole RSS-feeds voor deze tutorial, maar u kunt ook de RSS-feeds van uw land of Twitter/Telegram(groepen) gegevens gebruiken/toevoegen om uw feed informatiever/nauwkeuriger te maken.

De kansen zijn immens. Deze tutorial zou moeten dienen als een opstap om NEL toe te passen om apps in verschillende domeinen te bouwen die verschillende soorten problemen met het ophalen van informatie oplossen.

Als je verder kijkt naar de RSS-feed, ziet het er ongeveer zo uit:

https://economictimes.indiatimes.com/markets/rssfeeds/1977021501.cms


 

Ons doel is om de tekstuele koppen van deze RSS-feed te krijgen en dan zullen we de SpaCy gebruiken om de belangrijkste entiteiten uit de koppen te halen.

De koppen zijn aanwezig in de tag van de XML hier.

Ten eerste moeten we het hele XML-document vastleggen en kunnen we de requests bibliotheek om dat te doen. Zorg ervoor dat deze pakketten zijn geïnstalleerd in uw runtime-omgeving in colab.

U kunt de volgende opdracht uitvoeren om bijna elk pakket rechtstreeks vanuit de codecel van een colab te installeren:

!pip install <package_name>

Verzend een GET verzoek via de meegeleverde link om het XML-document vast te leggen.

import requestsresp = requests.get("https://economictimes.indiatimes.com/markets/stocks/rssfeeds/2146842.cms")

Voer de cel uit om te controleren wat u in het antwoordobject krijgt.

Het zou u als volgt een succesvol antwoord moeten geven met HTTP-code 200:



Nu u dit responsobject hebt, kunnen we de inhoud ervan doorgeven aan de BeautifulSoup-klasse om het XML-document als volgt te ontleden:

from bs4 import BeautifulSoupsoup = BeautifulSoup(resp.content, features='xml')
soup.findAll('title')

Dit zou je alle koppen in een Python-lijst moeten geven:



Afbeelding door auteur

 

Geweldig, we hebben de tekstuele gegevens waaruit we de belangrijkste entiteiten (in dit geval beursgenoteerde bedrijven) zullen extraheren met behulp van NLP.

Het is tijd om NLP in actie te brengen.

Stap 2: Entiteiten uit de koppen halen

 
 
Dit is het spannende deel. We gebruiken een voorgetraind kerntaalmodel van het spaCy bibliotheek om de belangrijkste entiteiten in een kop te extraheren.

Een beetje over spaCy en de kernmodellen.

ruim is een open-source NLP-bibliotheek die tekstuele gegevens razendsnel verwerkt. Het is de toonaangevende bibliotheek in NLP-onderzoek die op grote schaal wordt gebruikt in enterprise-grade applicaties. spaCy staat bekend om het opschalen van het probleem. En het ondersteunt meer dan 64 talen en werkt goed met zowel TensorFlow als PyTorch.

Over kernmodellen gesproken: spaCy heeft twee hoofdklassen van voorgetrainde taalmodellen die zijn getraind op tekstgegevens van verschillende groottes om ons de nieuwste gevolgtrekkingen te geven.

  1. Kernmodellen — voor algemene basis NLP-taken.
  2. Startermodellen — voor nichetoepassingen die transfer learning vereisen. We kunnen de geleerde gewichten van het model gebruiken om onze aangepaste modellen te verfijnen zonder het model helemaal opnieuw te hoeven trainen.

Omdat onze use-case in deze tutorial eenvoudig is, blijven we bij de en_core_web_sm kernmodel pijplijn.

Laten we dit dus in onze notebook laden:

nlp = spacy.load("en_core_web_sm")

Opmerking: Colab heeft dit al voor ons gedownload, maar als je het op je lokale systeem probeert uit te voeren, moet je het model eerst downloaden met de volgende opdracht:

python -m spacy download en_core_web_sm

en_core_web_sm is in feite een Engelse pijplijn die is geoptimaliseerd voor CPU en die de volgende componenten heeft:

  • tok2vec — token naar vectoren (voert tokenisatie uit op de tekstuele gegevens),
  • tagger — voegt relevante metadata toe aan elk token. spaCy maakt gebruik van enkele statistische modellen om de woordsoort (POS) van elk token te voorspellen. Meer in de documentatie.
  • parser — afhankelijkheidsparser legt relaties tussen de tokens.
  • Andere componenten zijn onder meer senter, ner, attribute_ruler, lemmatizer.

Om te testen wat dit model voor ons kan doen, zal ik een enkele kop door het geïnstantieerde model halen en vervolgens de verschillende delen van een zin controleren.

# make sure you extract the text out of <title> tagsprocessed_hline = nlp(headlines[4].text)

De pijplijn voert alle taken uit, van tokenisatie tot NER. Hier hebben we eerst de tokens:



Afbeelding door auteur

 

U kunt de getagde woordsoort bekijken met de pos_ attribuut.



Afbeelding door auteur

 

Elk token is getagd met enkele metadata. Handel is bijvoorbeeld een eigennaam, Setup is een zelfstandig naamwoord, : is interpunctie, enzovoort, enzovoort. De volledige lijst met tags wordt gegeven hier.

En dan kun je kijken hoe ze gerelateerd zijn door naar de afhankelijkheidsgrafiek te kijken met dep_ attribuut:



Afbeelding door auteur

 

Hier is Trade een Compound, Setup is Root, Nifty is appos (Appositional modifier). Nogmaals, alle syntactische tags zijn te vinden hier.

U kunt ook de relatieafhankelijkheden tussen de tokens visualiseren met behulp van de volgende verplaatsing: render() methode:

spacy.displacy.render(processed_hline, style='dep',jupyter=True, options={'distance': 120})

wat deze grafiek geeft:



Afbeelding door auteur

 

Entiteit extractie

 
 
En om naar de belangrijke entiteiten van de zin te kijken, kun je doorgeven 'ent’ als stijl in dezelfde code:



Afbeelding door auteur — ik heb een andere kop gebruikt omdat degene die we hierboven gebruikten geen entiteiten had.

 

We hebben verschillende tags voor verschillende entiteiten, zoals de dag heeft DATE, Glasscoat heeft GPE, wat Landen/Steden/Staten kan zijn. We zijn voornamelijk op zoek naar entiteiten met een ORG-tag die ons bedrijven, agentschappen, instellingen, enz.

We zijn nu in staat om entiteiten uit de tekst te extraheren. Laten we beginnen met het extraheren van de organisaties uit alle krantenkoppen met behulp van ORG-entiteiten.

Hiermee wordt als volgt een lijst met alle bedrijven geretourneerd:



Afbeelding door auteur

 

Zo makkelijk, toch?

Dat is nu de magie van spaCy!

De volgende stap is om al deze bedrijven op te zoeken in een kennisbank om het juiste aandelensymbool voor dat bedrijf te extraheren en vervolgens bibliotheken zoals yahoo-finance te gebruiken om hun marktgegevens zoals prijs, rendement, enz.

Stap 3 — Genoemde entiteit koppelen

 
 
Het doel van dit project is om te leren welke aandelen er in de markt zoemen en om hun details op uw dashboard te krijgen.

We hebben de bedrijfsnamen, maar om hun handelsgegevens te krijgen, hebben we het handelsaandelensymbool van het bedrijf nodig.

Aangezien ik de details en het nieuws van Indiase bedrijven aan het extraheren ben, ga ik een externe database gebruiken van: Handige 500 bedrijven (een CSV-bestand).

Voor elk bedrijf zullen we het opzoeken in de lijst met bedrijven die panda's gebruiken, en dan zullen we de beursstatistieken vastleggen met behulp van de yahoo-financiën bibliotheek.

Afbeelding door auteur

 

Een ding dat je hier moet opmerken, is dat ik een ".NS" heb toegevoegd na elk aandelensymbool voordat ik het doorgeef aan de Ticker klasse van de yfinance bibliotheek. Het is omdat Indiase NSE-aandelensymbolen worden opgeslagen met a .NS achtervoegsel in yfinance.

En de zoemende aandelen zouden verschijnen in een dataframe zoals hieronder:



Afbeelding door auteur

 

Voila! is dit niet geweldig? Zo'n eenvoudige maar diepgaande app die je in de goede richting kan wijzen met de juiste aandelen.

Om het nu toegankelijker te maken, kunnen we een webtoepassing maken van de code die we zojuist hebben geschreven met Streamlit.

Stap 4 — Een web-app bouwen met Streamlit

 
 
Het is tijd om over te stappen naar een editor en een nieuw project en virtuele omgeving voor de NLP-toepassing te creëren.

Aan de slag gaan met Streamlit is super eenvoudig voor dergelijke demo-gegevenstoepassingen. Zorg ervoor dat je streamlit hebt geïnstalleerd.

pip install Streamlit

Laten we nu een nieuw bestand maken met de naam app.py en beginnen met het schrijven van functionele code om de app gereed te maken.

Importeer bovenaan alle vereiste bibliotheken.

import pandas as pdimport requestsimport spacyimport streamlit as stfrom bs4 import BeautifulSoupimport yfinance as yf

Voeg een titel toe aan uw aanvraag:

st.title('Buzzing Stocks :zap:')

Test je app door het uit te voeren streamlit run app.py in uw terminal. Het zou een app in uw webbrowser moeten openen.

Ik heb wat extra functionaliteit toegevoegd om gegevens uit meerdere bronnen vast te leggen. Nu kunt u een RSS-feed-URL naar keuze toevoegen aan de applicatie en de gegevens worden verwerkt en de trending-aandelen worden weergegeven in een dataframe.

Om toegang te krijgen tot de volledige codebasis, kun je mijn repository hier bekijken:

 
GitHub – dswh/NER_News_Feed
 

U kunt meerdere stijlelementen, verschillende gegevensbronnen en andere soorten verwerking toevoegen om het efficiënter en nuttiger te maken.

Mijn app ziet er in de huidige staat uit als de afbeelding in de banner.

Als je me stap voor stap wilt volgen, kijk dan hoe ik deze applicatie hier codeer:

Volgende stappen!

 
 
In plaats van een financieel gebruiksscenario te kiezen, kunt u ook een andere toepassing naar keuze kiezen. Gezondheidszorg, e-commerce, onderzoek en vele andere. Alle industrieën vereisen dat documenten worden verwerkt en dat belangrijke entiteiten worden geëxtraheerd en gekoppeld. Probeer een ander idee.

Een eenvoudig idee is om alle belangrijke entiteiten van een onderzoekspaper te extraheren en er vervolgens een kennisgrafiek van te maken met behulp van de Google Search API.

Als u de app voor aandelennieuws naar een ander niveau wilt tillen, kunt u ook enkele handelsalgoritmen toevoegen om ook koop- en verkoopsignalen te genereren.

Ik moedig je aan om los te gaan met je fantasie.

Hoe je met mij in contact kunt komen!

 
 
Als je dit bericht leuk vond en meer van dergelijke inhoud wilt zien, kun je je abonneren op mijn nieuwsbrief or mijn YouTube-kanaal waar ik zulke nuttige en snelle projecten zal blijven delen die men kan bouwen.

Als je iemand bent die net begint met programmeren of in data science of ML wil komen, kun je mijn cursus bekijken op WIP Lane Academie.

Met dank aan Elliot Gunn.

 
Bio: Harde Tyagi is een ingenieur met samengevoegde ervaring in webtechnologieën en datawetenschap (ook bekend als full-stack datawetenschap). Hij heeft meer dan 1000 AI/Web/Data Science-aspiranten begeleid en ontwerpt leertrajecten op het gebied van datawetenschap en ML-engineering. Eerder ontwikkelde Harshit algoritmen voor gegevensverwerking met onderzoekswetenschappers van Yale, MIT en UCLA.

ORIGINELE. Met toestemming opnieuw gepost.

Zie ook:

Bron: https://www.kdnuggets.com/2021/09/-structured-financial-newsfeed-using-python-spacy-and-streamlit.html

Tijdstempel:

Meer van KDnuggets