nltk または他の自然言語処理ライブラリで、複雑な文を単純な文に分解する方法はありますか?
例えば:
太陽が沈み、涼しい風が吹いているときの公園はとても素晴らしい ==> 太陽が沈んでいます。涼しい風が吹いています。公園はとても素晴らしいです。
これは見た目よりもはるかに複雑なので、完全にクリーンな方法を見つけることはほとんどありません。
ただし、OpenNLPで英語のパーサーを使用すると、例文を使用して次の文法ツリーを取得できます。
(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)))))))
(. .)))
そこから、好きなようにそれをバラバラにすることができます。トップレベルの(NP *)(VP *)から(SBAR *)セクションを引いたものを抽出することで、副節を取得できます。次に、(SBAR *)内の接続詞を他の2つのステートメントに分割できます。
OpenNLPパーサーは、PennTreebankコーパスを使用してトレーニングされていることに注意してください。私はあなたの例文でかなり正確な構文解析を取得しましたが、パーサーは完全ではなく、他の文ではひどく間違っている可能性があります。タグの説明については、こちらをご覧ください。言語学と英文法の基本的な理解がすでにあることを前提としています。
編集:ところで、これは私がPythonからOpenNLPにアクセスする方法です。これは、opennlp-tools-1.4.3フォルダーにOpenNLPjarファイルとモデルファイルがあることを前提としています。
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:]))