Bygga upp ett strukturerat finansiellt nyhetsflöde med Python, SpaCy och Streamlit

Källnod: 1876513

Bygga upp ett strukturerat finansiellt nyhetsflöde med Python, SpaCy och Streamlit

Kom igång med NLP genom att bygga en Named Entity Recognition(NER)-applikation.


By Harshit Tyagi, instruktör i datavetenskap | Mentor | YouTuber


Bygga upp ett strukturerat finansiellt nyhetsflöde med Python, SpaCy och Streamlit

En av de mycket intressanta och allmänt använda tillämpningarna av NLP är Named Entity Recognition (NER).

Att få insikter från rå och ostrukturerad data är av avgörande betydelse. Att ladda upp ett dokument och hämta de viktiga informationsbitarna från det kallas informationshämtning.

Informationsinhämtning har varit en stor uppgift/utmaning inom NLP. Och NER(eller NEL — Named Entity Linking) används i flera domäner (ekonomi, droger, e-handel, etc.) för informationshämtning.

I det här handledningsinlägget kommer jag att visa dig hur du kan utnyttja NEL för att utveckla ett anpassat nyhetsflöde på aktiemarknaden som listar de surrande aktierna på internet.

Förutsättningar

 
 
Det finns inga sådana förutsättningar som sådana. Du kanske måste ha lite bekantskap med python och de grundläggande uppgifterna för NLP som tokenisering, POS-taggning, beroendeanalys, et cetera.

Jag kommer att täcka de viktiga bitarna mer i detalj, så även om du är en nybörjare kommer du att kunna linda huvudet runt vad som händer.

Så låt oss fortsätta med det, följ med så får du ett minimalt nyhetsflöde som du kan börja undersöka.

Verktyg/inställningar du behöver:

 
 

  1. Google Colab för inledande testning och utforskning av data och SpaCy-biblioteket.
  2. VS-kod (eller valfri redigerare) för att koda Streamlit-applikationen.
  3. Källa till aktiemarknadsinformation (nyheter) som vi kommer att utföra NER och senare NEL på.
  4. En virtuell pythonmiljö (jag använder conda) tillsammans med bibliotek som Pandas, SpaCy, Streamlit, Streamlit-Spacy (om du vill visa några SpaCy-renderingar.)

Mål

 
 
Målet med detta projekt är att lära sig och tillämpa Named Entity Recognition för att extrahera viktiga enheter (börsnoterade företag i vårt exempel) och sedan länka varje enhet med lite information med hjälp av en kunskapsbas (Nifty500-företagslista).

Vi hämtar textdata från RSS-flöden på internet, extraherar namnen på surrande aktier och hämtar sedan deras marknadsprisdata för att testa nyheternas äkthet innan vi tar någon position i dessa aktier.


Obs: NER kanske inte är ett toppmodernt problem men det har många tillämpningar i branschen.


Går vidare till Google Colab för experiment och testning:

Steg 1: Extrahera trendaktienyhetsdata

 
 
För att få några pålitliga autentiska börsnyheter kommer jag att använda Ekonomiska tider och Pengarkontroll RSS-flöden för denna handledning men du kan också använda/lägga till ditt lands RSS-flöden eller Twitter/Telegram(grupper) data för att göra ditt flöde mer informativt/exakt.

Möjligheterna är enorma. Den här handledningen bör fungera som ett språngbräde för att tillämpa NEL för att bygga appar på olika domäner för att lösa olika typer av problem med informationshämtning.

Om du fortsätter att titta på RSS-flödet ser det ut ungefär så här:

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


 

Vårt mål är att hämta textrubriker från detta RSS-flöde och sedan använder vi SpaCy för att extrahera huvudenheterna från rubrikerna.

Rubrikerna finns inuti XML-taggen här.

För det första måste vi fånga hela XML-dokumentet och vi kan använda requests biblioteket för att göra det. Se till att du har dessa paket installerade i din runtime-miljö i colab.

Du kan köra följande kommando för att installera nästan vilket paket som helst direkt från en colabs kodcell:

!pip install <package_name>

Skicka en GET begäran på den medföljande länken för att fånga XML-dokumentet.

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

Kör cellen för att kontrollera vad du får i responsobjektet.

Det bör ge dig ett framgångsrikt svar med HTTP-kod 200 enligt följande:



Nu när du har det här svarsobjektet kan vi skicka dess innehåll till BeautifulSoup-klassen för att analysera XML-dokumentet enligt följande:

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

Detta borde ge dig alla rubriker i en Python-lista:



Bild av författare

 

Fantastiskt, vi har textdata från vilka vi kommer att extrahera huvudenheterna (som är börsnoterade företag i det här fallet) med hjälp av NLP.

Det är dags att omsätta NLP i handling.

Steg 2: Extrahera enheter från rubrikerna

 
 
Det här är den spännande delen. Vi kommer att använda en förutbildad kärnspråksmodell från spaCy bibliotek för att extrahera huvudenheterna i en rubrik.

Lite om spaCy och kärnmodellerna.

rymd är ett NLP-bibliotek med öppen källkod som behandlar textdata i en supersnabb hastighet. Det är det ledande biblioteket inom NLP-forskning som används i storskaliga tillämpningar av företagsklass. spaCy är välkänt för att skala med problemet. Och den stöder mer än 64 språk och fungerar bra med både TensorFlow och PyTorch.

På tal om kärnmodeller, spaCy har två huvudklasser av förtränade språkmodeller som är tränade på olika storlekar av textdata för att ge oss toppmoderna slutsatser.

  1. Kärnmodeller — för allmänna NLP-uppgifter.
  2. Startmodeller — för nischapplikationer som kräver överföringsinlärning. Vi kan utnyttja modellens inlärda vikter för att finjustera våra anpassade modeller utan att behöva träna modellen från grunden.

Eftersom vårt användningsfall är grundläggande i den här handledningen, kommer vi att hålla oss till en_core_web_sm kärnmodellpipeline.

Så låt oss ladda det här i vår anteckningsbok:

nlp = spacy.load("en_core_web_sm")

Notera: Colab har redan den här nedladdad åt oss men om du försöker köra den i ditt lokala system måste du först ladda ner modellen med följande kommando:

python -m spacy download en_core_web_sm

en_core_web_sm är i grunden en engelsk pipeline optimerad för CPU som har följande komponenter:

  • tok2vec — token till vektorer (utför tokenisering på textdata),
  • taggare — lägger till relevant metadata till varje token. spaCy använder sig av vissa statistiska modeller för att förutsäga orddelen (POS) för varje token. Mer i dokumentation.
  • parser — dependency parser etablerar relationer mellan tokens.
  • Andra komponenter inkluderar senter, ner, attribute_ruler, lemmatizer.

Nu, för att testa vad den här modellen kan göra för oss, skickar jag en enda rubrik genom den instansierade modellen och kontrollerar sedan de olika delarna av en mening.

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

Pipelinen utför alla uppgifter från tokenisering till NER. Här har vi tokens först:



Bild av författare

 

Du kan titta på den taggade delen av talet med hjälp av pos_ attribut.



Bild av författare

 

Varje token är taggad med viss metadata. Till exempel, Trade är ett substantiv, Setup är ett substantiv, : är skiljetecken, så vidare, och så vidare. Hela listan över taggar anges här..

Och sedan kan du titta på hur de är relaterade genom att titta på beroendediagrammet med hjälp av dep_ attribut:



Bild av författare

 

Här är handel en förening, installationen är rot, Nifty är appos (Appositionell modifierare). Återigen, alla syntaktiska taggar kan hittas här..

Du kan också visualisera relationsberoendena mellan tokens med hjälp av följande förskjutning render() metod:

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

vilket ger denna graf:



Bild av författare

 

Entitetsutvinning

 
 
Och för att titta på de viktiga enheterna i meningen kan du passera 'ent’ som stil i samma kod:



Bild av författare — Jag använde en annan rubrik eftersom den vi använde ovan inte hade några enheter.

 

Vi har olika taggar för olika enheter som att dagen har DATUM, Glasscoat har GPE som kan vara länder/städer/stater. Vi letar huvudsakligen efter enheter som har ORG-tagg som ger oss företag, byråer, institutioner etc.

Vi kan nu extrahera enheter från texten. Låt oss börja extrahera organisationerna från alla rubriker med hjälp av ORG-enheter.

Detta kommer att returnera en lista över alla företag enligt följande:



Bild av författare

 

Så enkelt, eller hur?

Det är magin med spaCy nu!

Nästa steg är att slå upp alla dessa företag i en kunskapsbas för att extrahera rätt aktiesymbol för det företaget och sedan använda bibliotek som yahoo-finance för att extrahera sina marknadsdetaljer som pris, avkastning, etc.

Steg 3 — Namngiven Entity Linking

 
 
Att lära sig om vilka aktier som surrar på marknaden och få deras information på din instrumentpanel är målet för detta projekt.

Vi har företagsnamnen men för att få deras handelsinformation behöver vi företagets handelsaktiesymbol.

Eftersom jag extraherar detaljerna och nyheterna från indiska företag, kommer jag att använda en extern databas med Snygga 500 företag (en CSV-fil).

För varje företag kommer vi att slå upp det i listan över företag som använder pandor, och sedan fångar vi börsstatistiken med hjälp av yahoo-finans bibliotek.

Bild av författare

 

En sak som du bör lägga märke till här är att jag har lagt till en ".NS" efter varje aktiesymbol innan jag skickade den till Ticker klass av yfinance bibliotek. Det beror på att indiska NSE-aktiesymboler lagras med en .NS suffix i yfinance.

Och de surrande aktierna skulle dyka upp i en dataram som nedan:



Bild av författare

 

Voila! är inte det här bra? En sådan enkel men djupgående app som kan peka dig i rätt riktning med rätt aktier.

Nu för att göra det mer tillgängligt kan vi skapa en webbapplikation av koden som vi just har skrivit med Streamlit.

Steg 4 — Bygga en webbapp med Streamlit

 
 
Det är dags att flytta till en redaktör och skapa ett nytt projekt och en virtuell miljö för NLP-applikationen.

Att komma igång med Streamlit är superenkelt för sådana demodataapplikationer. Se till att du har streamlit installerat.

pip install Streamlit

Nu, låt oss skapa en ny fil som heter app.py och börja skriva funktionell kod för att göra appen klar.

Importera alla nödvändiga bibliotek överst.

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

Lägg till en titel till din ansökan:

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

Testa din app genom att köra streamlit run app.py i din terminal. Det bör öppna en app i din webbläsare.

Jag har lagt till lite extra funktionalitet för att fånga data från flera källor. Nu kan du lägga till en valfri RSS-webbadress i applikationen och data kommer att bearbetas och trendaktier kommer att visas i en dataram.

För att få tillgång till hela kodbasen kan du kolla in mitt arkiv här:

 
GitHub – dswh/NER_News_Feed
 

Du kan lägga till flera stilelement, olika datakällor och andra typer av bearbetning för att göra det mer effektivt och användbart.

Min app i sitt nuvarande tillstånd ser ut som bilden i bannern.

Om du vill följa mig steg-för-steg, se mig koda denna applikation här:

Nästa steg!

 
 
Istället för att välja ett ekonomiskt användningsfall kan du också välja vilken annan applikation som helst. Sjukvård, e-handel, forskning och många andra. Alla branscher kräver att dokument bearbetas och viktiga enheter tas ut och länkas. Testa en annan idé.

En enkel idé är att extrahera alla viktiga enheter i en forskningsartikel och sedan skapa en kunskapsgraf av den med hjälp av Google Search API.

Dessutom, om du vill ta aktienyhetsflödesappen till en annan nivå, kan du lägga till några handelsalgoritmer för att generera köp- och säljsignaler också.

Jag uppmuntrar dig att gå vild med din fantasi.

Hur du kan få kontakt med mig!

 
 
Om du gillade det här inlägget och skulle vilja se mer av sådant innehåll kan du prenumerera på mitt nyhetsbrev or min YouTube-kanal där jag kommer att fortsätta dela med mig av sådana användbara och snabba projekt som man kan bygga.

Om du är någon som precis har börjat med programmering eller vill komma in på datavetenskap eller ML kan du kolla in min kurs på WIP Lane Academy.

Tack till Elliot Gunn.

 
Bio: Harshit Tyagi är en ingenjör med samlad erfarenhet av webbteknik och datavetenskap (alias full-stack data science). Han har varit mentor för över 1000 AI/Web/Data Science-aspiranter och designar datavetenskap och ML-ingenjörsspår. Tidigare har Harshit utvecklat databehandlingsalgoritmer tillsammans med forskare vid Yale, MIT och UCLA.

Ursprungliga. Skickas om med tillstånd.

Relaterat:

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

Tidsstämpel:

Mer från KDnuggets