Domanda

C'è un modo per scomporre le frasi complesse in semplici frasi in NLTK o altre librerie di elaborazione del linguaggio naturale?

Ad esempio:

Il parco è così meraviglioso quando il sole sta tramontando e una fresca brezza soffia ==> Il sole sta tramontando. una fresca brezza soffia. Il parco è così meraviglioso.

È stato utile?

Soluzione

Questo è molto più complicato di quanto sembri, quindi è improbabile che trovare un metodo perfettamente pulita.

Tuttavia, utilizzando il parser inglese in OpenNLP , posso prendere il vostro esempio frase e ottenere un seguito albero di grammatica :

  (S
    (NP (DT The) (NN park))
    (VP
      (VBZ is)
      (ADJP (RB so) (JJ wonderful))
      (SBAR
        (WHADVP (WRB when))
        (S
          (S (NP (DT the) (NN sun)) (VP (VBZ is) (VP (VBG setting))))
          (CC and)
          (S
            (NP (DT a) (JJ cool) (NN breeze))
            (VP (VBZ is) (VP (VBG blowing)))))))
    (. .)))

Da lì, è possibile prenderlo a parte come ti piace. È possibile ottenere i sotto-clausole estraendo la sezione precedente (SBAR *) di livello superiore (NP *) (* VP) meno. E allora si potrebbe dividere la congiunzione all'interno del (SBAR *) nelle altre due affermazioni.

Nota, il parser OpenNLP è addestrato utilizzando il Penn Treebank corpus. Ho ottenuto un parsing abbastanza preciso sul tuo esempio frase, ma il parser non è perfetto e può essere selvaggiamente sbagliato su altre frasi. Guardate qui per una spiegazione delle sue etichette. Si presuppone che si dispone già di una certa conoscenza di base della linguistica e della grammatica inglese.

Edit: A proposito, questo è il modo accedo OpenNLP da Python. Questo presuppone che i file jar e modello OpenNLP in un opennlp-tools-1.4.3 cartella.

import os, sys
from subprocess import Popen, PIPE
import nltk

BP = os.path.dirname(os.path.abspath(__file__))
CP = "%(BP)s/opennlp-tools-1.4.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/maxent-2.5.2.jar:%(BP)s/opennlp-tools-1.4.3/lib/jwnl-1.3.3.jar:%(BP)s/opennlp-tools-1.4.3/lib/trove.jar" % dict(BP=BP)
cmd = "java -cp %(CP)s -Xmx1024m opennlp.tools.lang.english.TreebankParser -k 1 -d %(BP)s/opennlp.models/english/parser" % dict(CP=CP, BP=BP)
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
stdin, stdout, stderr = (p.stdin, p.stdout, p.stderr)
text = "This is my sample sentence."
stdin.write('%s\n' % text)
ret = stdout.readline()
ret = ret.split(' ')
prob = float(ret[1])
tree = nltk.Tree.parse(' '.join(ret[2:]))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top