nltk выдержка именной фразы с помощью RegexpParser

Я хочу извлечь существительные фразы из текста, и я использую Python с NLTK. В интернете есть шаблон использования RegexpParser:

grammar = r"""
        NBAR:
            {<NN.*|JJ>*<NN.*>}  # Nouns and Adjectives, terminated with Nouns
        NP:
            {<NBAR>}
            {<NBAR><IN><NBAR>}  # Above, connected with in/of/etc...
    """
    cp = nltk.RegexpParser(grammar)

Я хочу изменить грамматическую переменную, добавив регистр «Существительное существительного» или «Существительное в существительном» (например, «чашка кофе» или «вода в чашке»). Моя тестовая строка: «Почтовый код - новый способ доставки». 'Я хочу получить список фраз: [' код портала ',' новый метод ',' новый метод доставки ']

Всего 1 ответ


Мой ответ:

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.*>}

вернуть «почтовый индекс». Таким образом, мы не можем получить «новый подход» в возвращаемом результате.


Есть идеи?

10000