2016-10-29 1 views
-1

Ich brauche Hilfe bei der Verarbeitung unstrukturierter Daten von Day-Trading/Swing-Trading/Anlageempfehlungen. Ich habe die unstrukturierten Daten in Form von CSV.Verarbeitung natürlicher Sprache - Extrahieren von Daten

Im Folgenden sind drei Beispiele Absätze, aus denen Daten extrahiert werden muss:

Chandan Taparia von Anand Rathi hat einen Buy Anruf auf Coal India Ltd. mit einem intra-dayKursziel von Rs 338. Der aktuelle Markt Preis von Coal India Ltd. ist 325.15. Chandan Taparia empfohlen zu halten Stop-Loss bei Rs 318.

Kotak Securities Limited hat ein Buy Anruf auf Engineers India Ltd. mit einem Kursziel von Rs 335 .Der aktuellen Marktpreis von Engineers India Ltd. ist Rs 266,05 Der Analyst gab ein Jahr für Ingenieure India Ltd Preis, um das definierte Ziel zu erreichen. Engineers India verfügt über einen gesunden Marktanteil von im Segment Consulting für Kohlenwasserstoffe. Es genießt eine produktive Beziehung mit einigen der großen Öl & Gasunternehmen wie HPCL, BPCL, ONGC und IOC. Das Unternehmen ist gut positioniert, um von einer Erholung der Infrastrukturausgaben im Kohlenwasserstoffsektor zu profitieren.

Der unabhängige Analyst Kunal Bothra hat einen Verkaufsanruf auf Ceat Ltd. mit einem Kursziel von Rs 1150 .Der aktuellen Marktpreis von Ceat Ltd. ist Rs 1.199,6 Die Zeitperiode vom Analytiker gegeben ist 1 -3 Tage , wenn Ceat Ltd. Preis das definierte Ziel erreichen kann. Kunal Bothra beibehalten Stop Loss bei Rs 1240.

Es ist eine Herausforderung 4 Informationen aus den Absätzen Extrahieren: jede Empfehlung ist anders gerahmt, aber im Wesentlichen hat

  1. Zielpreis
  2. Stop-Loss-Preis
  3. Aktuelle Preis.
  4. Dauer

und nicht notwendigerweise alle Informationen werden in allen verfügbar sein - wird jede Empfehlung haben atleast Zielpreis.

Ich habe versucht, reguläre Ausdrücke zu verwenden, aber nicht sehr erfolgreich, kann mir jemand Anleitung, wie diese Informationen extrahiert werden können nltk?

-Code Ich habe bisher in den Daten Reinigung:

import pandas as pd 
import re 

#etanalysis_final.csv has 4 columns with 
#0th Column having data time 
#1st Column having a simple hint like 'Sell Ceat Ltd. target Rs 1150 : Kunal Bothra,Sell Ceat Ltd. at a price target of Rs 1150 and a stoploss at Rs 1240 from entry point', not all the hints are same, I can rely on it for recommender, Buy or Sell, which stock. 
#4th column has the detailed recommendation given. 

df = pd.read_csv('etanalysis_final.csv',encoding='ISO-8859-1') 
df.DATE = pd.to_datetime(df.DATE) 
df.dropna(inplace=True) 
df['RECBY'] = df['C1'].apply(lambda x: re.split(':|\x96',x)[-1].strip()) 
df['ACT'] = df['C1'].apply(lambda x: x.split()[0].strip()) 
df['STK'] = df['C1'].apply(lambda x: re.split('\.|\,|:| target| has| and|Buy|Sell| with',x)[1]) 
#Getting the target price - not always correct 
df['TGT'] = df['C4'].apply(lambda x: re.findall('\d+.', x)[0]) 
#Getting the stop loss price - not always correct 
df['STL'] = df['C4'].apply(lambda x: re.findall('\d+.\d+', x)[-1]) 
+0

Sie tun viele Regexes für einen einfachen 'find (" Zielpreis von Rs (\ d +) ")' –

+0

Nicht immer ist der Zielpreis als 'Zielpreis von Rs' manchmal als 'Ziel 500 verfügbar 'manchmal mögen' 500 als Ziel 'usw. haben. – Abbas

+2

OK, aber nicht in den Daten, die Sie zur Verfügung stellten ... Anyways, ist natürliche Sprachverarbeitung ziemlich schwierig, recht zu erhalten. Und es scheint nicht, dass du es wirklich versucht hast. –

Antwort

0

Ich habe die Lösung:

Code hier enthält nur Lösung Teil der Frage gestellt. Es sollte möglich sein, diese Lösung unter Verwendung der fuzzywuzzy Bibliothek erheblich zu verbessern.

from nltk import word_tokenize  
periods = ['year',"year's", 'day','days',"day's", 'month', "month's", 'week',"week's", 'intra-day', 'intraday'] 
stop = ['target', 'current', 'stop', 'period', 'stoploss'] 

def extractinfo(row): 
    if 'intra day' in row.lower(): 
     row = row.lower().replace('intra day', 'intra-day') 
    tks = [ w for w in word_tokenize(row) if any([w.lower() in stop, isfloat(w)])] 
    tgt = '' 
    crt = '' 
    stp = '' 
    prd = '' 
    if 'target' in tks: 
     if len(tks[tks.index('target'):tks.index('target')+2]) == 2: 
      tgt = tks[tks.index('target'):tks.index('target')+2][-1] 
    if 'current' in tks: 
     if len(tks[tks.index('current'):tks.index('current')+2]) == 2: 
      crt = tks[tks.index('current'):tks.index('current')+2][-1] 
    if 'stop' in tks: 
     if len(tks[tks.index('stop'):tks.index('stop')+2]) == 2: 
      stp = tks[tks.index('stop'):tks.index('stop')+2][-1] 
    prdd = set(periods).intersection(tks)  
    if 'period' in tks: 
     pdd = tks[tks.index('period'):tks.index('period')+3] 
     prr = set(periods).intersection(pdd) 
     if len(prr) > 0: 
      if len(pdd) > 2: 
       prd = ' '.join(pdd[-2::1]) 
      elif len(pdd) == 2: 
       prd = pdd[-1] 
    elif len(prdd) > 0: 
     prd = list(prdd)[0] 
    return (crt, tgt, stp, prd) 

Lösung ist relativ selbsterklärend - otheriwse lass es mich wissen.

0

Dies ist eine schwierige Frage, dass es verschiedene Möglichkeiten, in denen jeder der vier Stücke von Informationen geschrieben werden könnten. Hier ist ein naive Ansatz, der funktionieren könnte, obwohl eine Überprüfung erforderlich wäre. Ich werde für das Ziel das Beispiel tun, aber Sie können dies zu einem erweitern:

CONTEXT = 6 

def is_float(x): 
    try: 
     float(x) 
     return True 
    except ValueError: 
     return False 

def get_target_price(s): 
    words = s.split() 
    n = words.index('target') 
    words_in_range = words[n-CONTEXT:n+CONTEXT] 
    return float(list(filter(is_float, words_in_range))[0]) # returns any instance of a float 

Dies ist ein einfacher Ansatz ist, dass Sie, um loszulegen, aber Sie können zusätzliche Kontrollen setzen, um diese sicherer zu machen. Dinge, die möglicherweise verbessert werden können:

  1. Stellen Sie sicher, dass der Index vor dem, in dem der vorgeschlagene Float gefunden wird, Rs ist.
  2. Wenn kein Schwimmer im Kontext Bereich gefunden wird, erweitern Sie den Kontext
  3. Benutzerüberprüfung hinzufügen, wenn es Unklarheiten gibt also mehr als eine Instanz von Ziel oder mehr als einen Schwimmer im Kontext Bereich usw.
+0

danke - ich habe 'is_float' als' isfloat' verwendet – Abbas

Verwandte Themen