nltk выдержка именной фразы с помощью RegexpParser - PullRequest
0 голосов
/ 24 марта 2020

Я хочу извлечь из текста существительные фразы, и я использую python с NLTK. В inte rnet я нашел шаблон использования 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)

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

1 Ответ

0 голосов
/ 25 марта 2020

Мой ответ:

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

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

...