2016-11-21 4 views
1

Spacy enthält die noun_chunks Funktionalität zum Abrufen von Noun -Phrases. Die Funktion english_noun_chunks (im Anhang unten) verwendet word.pos == NOUNSpacy NLP - Chunking mit regulären Ausdrücken

def english_noun_chunks(doc): 
    labels = ['nsubj', 'dobj', 'nsubjpass', 'pcomp', 'pobj', 
       'attr', 'root'] 
    np_deps = [doc.vocab.strings[label] for label in labels] 
    conj = doc.vocab.strings['conj'] 
    np_label = doc.vocab.strings['NP'] 
    for i in range(len(doc)): 
     word = doc[i] 
     if word.pos == NOUN and word.dep in np_deps: 
      yield word.left_edge.i, word.i+1, np_label 
     elif word.pos == NOUN and word.dep == conj: 
      head = word.head 
      while head.dep == conj and head.head.i < head.i: 
       head = head.head 
      # If the head is an NP, and we're coordinated to it, we're an NP 
      if head.dep in np_deps: 
       yield word.left_edge.i, word.i+1, np_label 

Ich mag Brocken von einem Satz erhalten, die einen regulären Ausdruck erhalten. Zum Beispiel, I Phrase von null oder mehr Adjektive gefolgt von einem oder mehreren Substantiven.

{(<JJ>)*(<NN | NNS | NNP>)+} 

Ist es möglich, w/o die english_noun_chunks Funktion überschreiben?

Antwort

2

Sie könnten diese Funktion ohne Leistungseinbußen neu schreiben, da sie in reinem Python implementiert ist, aber warum filtern Sie nicht einfach diese Teile, nachdem Sie sie bekommen haben?

import re 
import spacy 

def filtered_chunks(doc, pattern): 
    for chunk in doc.noun_chunks: 
    signature = ''.join(['<%s>' % w.tag_ for w in chunk]) 
    if pattern.match(signature) is not None: 
     yield chunk 

nlp = spacy.load('en') 
doc = nlp(u'Great work!') 
pattern = re.compile(r'(<JJ>)*(<NN>|<NNS>|<NNP>)+') 

print(list(filtered_chunks(doc, pattern))) 
+0

Was ist mit der Tatsache, dass diese Funktion von Cython in C übersetzt wird? – Serendipity

+0

Sie haben Recht, diese Datei hat '.pyx' Erweiterung und Sie werden etwas Leistung verlieren, wenn Sie es umschreiben. Aber müssen Sie es neu schreiben oder Sie könnten einfach Endergebnisse filtern? –