java - 识别英语句子中的主语、宾语、动词?

标签 java algorithm nlp stanford-nlp

我正在从事一个机器翻译项目。我需要确定句子的主语、动词、宾语才能继续我的工作。目前我正在使用斯坦福 NLP 解析器来分析该句子。但我不知道如何提取SVO。我可以考虑什么想法吗?

最佳答案

我觉得如果要实现对英语句子的全面分析是相当困难的。 首先,您需要一本给出单词所有可能词性的词典。 然后,您将根据几个规则构建句子的结构。

一些最基本的规则如下:

NP(Noun Phrase): N(Noun), 
                 Pronoun,
                 [any number of ADJP(Adjective Phrase)] + N,
                 NP + [any number of ADJP],
                 NP + CONJ + NP

ADJP(Adjective Phrase): ADJ(Adjective), 
                        [any number of ADVP(Adverb Phrase)] + ADJP,
                        PREP(Preposition) + NP

ADVP(Adverb Phrase): ADV(Adverb),
                     ADV + ADVP

VP(Verb Phrase):     Vi(Intransitive Verb),
                     Vt(Transitive Verb) + NP,
                     VP + [any number of ADVP],
                     VP + CONJ + VP,
                     [any number of ADVP] + VP


S(Sentence): NP(Noun Phrase) + VP(Verb Phrase),
             NP + AUX_V(Auxiliary Verb) + VP,
             VP(Verb Phrase) (<=imperative sentence),
             S + CONJ + S

使用这些规则,可以分析很多句子,包括

    My dog runs very fast.

=>  ADJ N    Vi   ADV ADV
=> (ADJ N)  (Vi) (ADV ADVP)
=>   (NP)   (VP    ADVP  )
=>   (NP         VP)
=>         (S)

    I    do   not really like snacks like chips or candy.

=>  N  AUX_V  ADV  ADV    Vt    N    PREP   N  CONJ  N
=>(NP)(AUX_V)(ADV)(ADV)  (Vt)  (NP) (PREP  (NP CONJ  NP))
=>(NP)(AUX_V)(ADV)(ADV)  (Vt)  (NP) (PREP       NP)
=>(NP)(AUX_V)(ADV)(ADV)  (Vt)  (NP      ADJP)
=>(NP)(AUX_V)(ADV)(ADV)  (Vt         NP)
=>(NP)(AUX_V)(ADVP ADVP         VP)
=>(NP  AUX_V            VP)
=>           (S)

但它仍然无法分析复杂的句子,例如:

He is the one who won the Nobel Prize in 2014.

It is computers that brought the biggest change to our lives in history.

您需要添加有关从句和连词的规则(例如“while”、“when”和“if”)。 您还需要添加不定式和动名词的规则。 您仍然需要为采用两个对象的动词(例如“give”和“tell”)以及采用对象状态的动词(例如“look”、“seem”和“get”以及“make”)添加规则在“我让你生气了。”) ......

添加所有英文规则后,需要处理更复杂的事情。 例如,

They are hunting dogs.

(这句话有两种可能的结构,从而产生两种不同的含义;一是“hunting dogs”是ADJP,二是它是NP。)

She told me that she loved me, which was a lie.

(在这种情况下,“which was a lie”子句(ADJP)描述了 NP“她爱我”,但理论上该子句描述“我”(代词也是 NP)或整个部分“她告诉我她爱我”。程序必须能够以某种方式找出最有可能的是第一个。)

所以我认为我要做的就是根据字典和规则构建一个类似图表的东西来表示可能的结构,同时按单词处理句子,然后应用禁忌搜索来减少可能性,最后我会必须使用统计方式或以其他方式让计算机了解现实世界的情况,以便从剩下的几种可能性中选择最可能的结构。

顺便说一句,当我输入最后一个示例时,斯坦福解析器给出了错误的结构。 它给出了“她告诉我她爱[我,这是一个谎言]”。如此看来,要让这种东西完美地发挥作用,并不容易。

关于java - 识别英语句子中的主语、宾语、动词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22452607/

相关文章:

java - 如何用java获取句子的逻辑部分?

java - 具有最终局部变量对象引用的安全发布

java - GWT - onModuleLoad() 中的方法被多次调用

algorithm - 如何找到质量分布均匀的不规则物体的重心或质心?

java - Java中的Dijkstra算法

nlp - 如何列出句子中所有表示动物的英语术语?

java - 序列图 ARGOUML

java - 数据无法从网络服务器加载到 SQLite 数据库中

algorithm - 查找字符串的最长边界

python - nltk pos_tagger 的准确性是多少?