Мой ответ:
def ExtractNP(text):
nounphrases = []
words = nltk.word_tokenize(text)
tagged = nltk.pos_tag(words)
grammar = r"""
NP:
{<JJ*><NN+><IN><NN>}
{<NN.*|JJ>*<NN.*>}
"""
chunkParser = nltk.RegexpParser(grammar)
tree = chunkParser.parse(tagged)
for subtree in tree.subtrees(filter=lambda t: t.label() == 'NP'):
myPhrase = ''
for item in subtree.leaves():
myPhrase += ' ' + item[0]
nounphrases.append(myPhrase.strip())
# print(myPhrase)
nounphrases = list(filter(lambda x: len(x.split()) > 1, nounphrases))
return nounphrases
На самом деле, это не ново, но я обнаружил, что грамматические регрессии упорядочены, как они объявили. Это означает, что во входном предложении («почтовый код - новый подход к доставке») будет вырезано содержимое, которое соответствует
{<JJ*><NN+><IN><NN>}
(«новый подход к доставке»), а затем остальная часть ('почтовый индекс') будет сравниваться и использоваться в следующем сопоставлении с
{<NN.*|JJ>*<NN.*>}
для возврата "почтовый индекс". Таким образом, мы не можем получить «новый подход» в возвращенном результате.