как разобрать конкретное предложение? - PullRequest
0 голосов
/ 19 октября 2018

Рассмотрим этот минимальный фрейм данных

import spacy
nlp = spacy.load('en_core_web_sm')
import pandas as pd
import numpy as np    

mydata = pd.DataFrame({'text' : [u'the cat eats the dog. the dog eats the cat']})  

Я знаю, что могу использовать apply для запуска spacy в моем текстовом столбце:

mydata['parsed'] = mydata.text.apply(lambda x: nlp(x))    

Однако я хотел бы сделать что-то ещетонкий: Как я могу извлечь предложение , где субъект равен dog с использованием тегов части речи и spacy?

Вывод должен быть extracted столбец ниже:

Out[16]: 
              extracted                                        text
0  the dog eats the cat  the cat eats the dog. the dog eats the cat

Спасибо!

1 Ответ

0 голосов
/ 19 октября 2018

Это на самом деле не вопрос pandas.У вас есть три вопроса:

  1. Разделить каждую строку на несколько предложений
  2. Определить тему в каждом предложении
  3. Вернуть предложение, если тема dog

1. Мы можем разбить строку на list, используя метод split().

my_string = "the dog ate the bread. the cat ate the bread"
sentences = my_string.split('.')

2. Согласнодокументация Spacy, вызывающая nlp() на string, даст нам Doc, который содержит tokens, к которому, в свою очередь, прикреплены некоторые properties.

property, который нас интересует, это dep_, так как он сообщит нам отношения между нашим token и другим tokens, то есть, если наш token является субъектом или нет.

Вы можете найти список свойств здесь: https://spacy.io/usage/linguistic-features

doc = nlp(my_string)

for token in doc:
    print(token.dep_)  # if this prints `nsubj` the token is a noun subject!

3. Чтобы проверить, равен ли token 'dog', нам нужночтобы получить свойство text из токена:

token.text

Если мы увеличим это значение:

NLP = spacy.load('en_core_web_sm')

def extract_sentence_based_on_subject(string, subject):

    sentences = string.split('.')

    for sentence in sentences:
        doc = NLP(sentence)
        for token in doc:
            if token.dep_ == 'nsubj':
                if token.text == subject:
                    return sentence


mydata['text'].apply(extract_sentence_based_on_subject, subject='dog')
...