Python: разбиение на части, отличные от существительных (например, предложных), с использованием Spacy и т. Д.

Поскольку мне сказали, что Spacy - такой мощный модуль Python для обработки естественной речи, я теперь отчаянно ищу способ сгруппировать слова вместе в нечто большее, чем словосочетания с существительными, и, что наиболее важно, предложные фразы. Я сомневаюсь, что для этого есть функция Spacy, но я думаю, это был бы самый простой способ (импорт SpacySpaCy уже реализован в моем проекте). Тем не менее, я открыт для любой возможности распознавания / разделения фраз.


person Malte Ge    schedule 23.08.2016    source источник
comment
Можете ли вы привести пример того, что конкретно вы хотите? Может быть, как пример ввода с соответствующим ему желаемым выводом.   -  person Harrison    schedule 23.08.2016
comment
Конечно. В качестве перевода на немецкий язык возьмите предложение типа «Сколько времени я доберусь до университета?» (на немецком языке Wie lange brauche ich bis zur Uni?). Я хочу, чтобы [PREP] [DET] университет [NOUN] был разбит на части в качестве предложной фазы, либо удаленно зная, из чего состоит предложная фраза, либо указав точные правила (PP - ›PREP + NP), как в других модулях Python . Поскольку SpaCy используется для тегов в моей программе и, кажется, поддерживает только фрагменты существительных, я хотел бы иметь вспомогательный модуль или просто функцию внутри него для распознавания дополнительных фрагментов.   -  person Malte Ge    schedule 23.08.2016


Ответы (1)


Вот решение для получения PP. Как правило, вы можете получать фразы, используя subtree.

def get_pps(doc):
    "Function to get PPs from a parsed document."
    pps = []
    for token in doc:
        # Try this with other parts of speech for different subtrees.
        if token.pos_ == 'ADP':
            pp = ' '.join([tok.orth_ for tok in token.subtree])
            pps.append(pp)
    return pps

Использование:

import spacy

nlp = spacy.load('en_core_web_sm')
ex = 'A short man in blue jeans is working in the kitchen.'
doc = nlp(ex)

print(get_pps(doc))

Это печатает:

['in blue jeans', 'in the kitchen']
person Emiel    schedule 29.10.2017
comment
Откуда функция nlp()? - person Hamman Samuel; 08.08.2018
comment
Я обновил ответ. nlp относится к загруженному экземпляру SpaCy (согласно соглашению из документации SpaCy: spacy.io/usage). - person Emiel; 09.08.2018
comment
Спасибо, я столкнулся с другой проблемой с spacy.load('en'), которая была исправлена ​​заменой ее на spacy.load('en_core_web_sm'), решение взято из обсуждения системы отслеживания проблем на GitHub от spaCy github.com/explosion/spaCy/issues/1721#issuecomment-373241198 - person Hamman Samuel; 09.08.2018
comment
Эй, мне было интересно, знает ли кто-нибудь, как применить это к df? - person JassiL; 20.02.2020
comment
Вообще говоря, вы можете создать новый столбец на основе значений из другого столбца, используя метод apply. Например: df['b'] = df['a'].apply(len) создаст новый столбец (с меткой 'b') на основе значений в столбце с меткой 'a', используя встроенную функцию len. Другими словами: второй столбец будет содержать длину элементов в столбце 'a'. Вы можете использовать любую понравившуюся функцию, в том числе и ту, что есть в ответе. Но если столбец содержит строки, вам нужно сначала обработать строки. - person Emiel; 22.02.2020