2016-03-24 17 views
2

Ich habe viele Textdokumente auf der einen Seite und eine riesige Liste von Keywords (Strings) auf der anderen Seite. Jetzt bin ich interessiert, welche dieser Schlüsselwörter in den Dokumenten enthalten sind.Eine riesige Liste von Stichwörtern gegen eine Zeichenfolge mit Ruby

Im Moment ist mich mit einem monströsen Auto regex erzeugt:

keywords = %w(Key1, Key2, Key3) 
regx = Regexp.new('\b(' + keywords.join('|') + ')\b','i') 
documents.each |d| 
    d.scan(regx) 
end 

Das funktionierte groß für eine Liste von einem paar hundert Keywords, aber jetzt bin ich mit über 50.000 Stichwörter und es verlangsamt auch nach unten viel .

Gibt es einen besseren Weg, eine solche Operation mit Ruby zu machen?

EDIT:

  • Die Dokumente sind typische Nachrichtenartikel wie Nachrichten über aktuelle Sportereignisse, wie Sie über Google News beispielsweise finden. In meinem Testset enthält jeder Artikel ungefähr 1000 Wörter
  • Die Schlüsselwörter können einzelne Wörter sein, könnten aber auch Sätze sein, die mehrere Wörter wie 'Franz Beckenbauer' oder 'Russel Wilson' enthalten.
  • Ich bin nur daran interessiert, komplette Spiele - so für ‚Diktion‘ Suche sollte nur Spiel ‚Diktion‘, nicht ‚Wörterbuch‘
+0

Verwenden Sie 'StringScanner'. – sawa

+0

Ist die Verlangsamung linear in Bezug auf die Anzahl der Keywords? Wenn das der Fall ist, glaube ich nicht, dass Sie sich dadurch verbessern können. – sawa

+0

Möchten Sie nur ganze Wörter aus den Dokumenten und keine Teilzeichenfolgen? Möchten Sie nach "diction" suchen, um "dictionary" zurückzugeben? – JLB

Antwort

1

Konvertieren Sie die Liste der Schlüsselwörter auf einen Hash:

h = { 
    "foo" => true, 
    "bar" => true, 
    ... 
    "baz" => true, 
} 

Dann lesen von chunk das Dokument Chunk (durch Leerzeichen getrennt):

File.new("/path/to/file").each(" ") do 
    |ws| ws.scan(/[\w']+/) do 
    |w| if h.key?(w) 
     # Found. 
    end 
    end 
end 
+1

Warum ein Hash anstelle eines Sets? –

+1

Ein Set ist ein verkappter Hash mit etwas Zuckerglasur. –

+0

@theTinMan, ja, aber meine Frage steht. –

0

ich anfangen würde, den Edelstein mit: phrasie Dies gibt Ihnen eine Reihe von Wörter in (jedem) Dokument, , die Sie leicht mit Ihren Schlüsselwörtern vergleichen können.

ansehen: https://github.com/ashleyw/phrasie

Verwandte Themen