2016-11-29 7 views
1

У меня есть файл excel с текстовым столбцом. Все, что мне нужно сделать, это извлечь предложения из текстового столбца для каждой строки конкретными словами.Извлечение предложений с использованием pandas со специальными словами

Я попытался использовать функцию определения.

import pandas as pd 
from nltk.tokenize import sent_tokenize 
from nltk.tokenize import word_tokenize 

#################Reading in excel file##################### 

str_df = pd.read_excel("C:\\Users\\HP\Desktop\\context.xlsx") 

################# Defining a function ##################### 

def sentence_finder(text,word): 
    sentences=sent_tokenize(text) 
    return [sent for sent in sentences if word in word_tokenize(sent)] 
################# Finding Context ########################## 
str_df['context'] = str_df['text'].apply(sentence_finder,args=('snakes',)) 

################# Output file ################################# 
str_df.to_excel("C:\\Users\\HP\Desktop\\context_result.xlsx") 

Но может кто-то пожалуйста, помогите мне, если я должен найти предложение с несколькими конкретными словами, как snakes, venomous, anaconda. В предложении должно быть хотя бы одно слово. Я не могу работать с nltk.tokenize с несколькими словами.

Чтобы искать words = ['snakes','venomous','anaconda']

Input Excel файл:

    text 
    1. Snakes are venomous. Anaconda is venomous. 
    2. Anaconda lives in Amazon.Amazon is a big forest. It is venomous. 
    3. Snakes,snakes,snakes everywhere! Mummyyyyyyy!!!The least I expect is an anaconda.Because it is venomous. 
    4. Python is dangerous too. 

Желаемой Выход:

Колонок называется контекст прилагаемого к текстовому колонку выше. Контекстная колонка должна быть такой:

1. [Snakes are venomous.] [Anaconda is venomous.] 
2. [Anaconda lives in Amazon.] [It is venomous.] 
3. [Snakes,snakes,snakes everywhere!] [The least I expect is an anaconda.Because it is venomous.] 
4. NULL 

Заранее благодарен.

+0

Пожалуйста, разместите [mcve] (http://stackoverflow.com/help/mcve) вашего 'str_df' и ваш желаемый результат. –

+1

@JulienMarrec Отредактировано. Спасибо. – user7140275

+0

ваш третий пример с 'потому что имеет два предложения, которые, кажется, вы хотите, чтобы разрешение для ссылки, что не так просто.Если вы хотите только извлечение извлечения, это намного проще (т. Е. Текст, ограниченный символом!?). Также, пожалуйста, покажите свой текущий результат, даже если он ошибочен. –

ответ

1

Вот как:

In [1]: df['text'].apply(lambda text: [sent for sent in sent_tokenize(text) 
             if any(True for w in word_tokenize(sent) 
               if w.lower() in searched_words)]) 

0 [Snakes are venomous., Anaconda is venomous.] 
1 [Anaconda lives in Amazon.Amazon is a big forest., It is venomous.] 
2 [Snakes,snakes,snakes everywhere!, !The least I expect is an anaconda.Because it is venomous.] 
3 [] 
Name: text, dtype: object 

Вы видите, что есть несколько вопросов, потому что sent_tokenizer не делать его работу должным образом из-за пунктуации.


Обновление: использование множественного числа.

Вот обновленный ДФ:

text 
Snakes are venomous. Anaconda is venomous. 
Anaconda lives in Amazon. Amazon is a big forest. It is venomous. 
Snakes,snakes,snakes everywhere! Mummyyyyyyy!!! The least I expect is an anaconda. Because it is venomous. 
Python is dangerous too. 
I have snakes 


df = pd.read_clipboard(sep='0') 

Мы можем использовать стеммер (Wikipedia), такие как PorterStemmer.

from nltk.stem.porter import * 
stemmer = nltk.PorterStemmer() 

Во-первых, давайте Стебель и строчные буквы искомых слов:

searched_words = ['snakes','Venomous','anacondas'] 
searched_words = [stemmer.stem(w.lower()) for w in searched_words] 
searched_words 

> ['snake', 'venom', 'anaconda'] 

Теперь мы можем сделать реорганизовать выше, чтобы включать вытекающие, а также:

print(df['text'].apply(lambda text: [sent for sent in sent_tokenize(text) 
          if any(True for w in word_tokenize(sent) 
            if stemmer.stem(w.lower()) in searched_words)])) 

0 [Snakes are venomous., Anaconda is venomous.] 
1 [Anaconda lives in Amazon., It is venomous.] 
2 [Snakes,snakes,snakes everywhere!, The least I expect is an anaconda., Because it is venomous.] 
3 [] 
4 [I have snakes] 
Name: text, dtype: object 

Если вы только хотите подстроку соответствия, убедитесь, что search_words является единственным, а не множественным.

print(df['text'].apply(lambda text: [sent for sent in sent_tokenize(text) 
          if any([(w2.lower() in w.lower()) for w in word_tokenize(sent) 
            for w2 in searched_words]) 
           ]) 
) 

Кстати, это та точка, где я бы, вероятно, создать функцию с регулярным для петель, это лямбда с списковым выходит из-под руками.

+0

Спасибо, что сработал. Да, даже я сталкиваюсь с такими проблемами, как «Змеи ядовиты. Питон тоже». Я ожидаю, что результат будет [Змеи ядовиты.], Но вместо этого я получаю [Змеи ядовитые. Питон тоже]. Так как в начале предложения нет места. – user7140275

+0

Есть ли способ, которым я получаю предложения с «змеей», даже если я дал «змей» в списке слов. Все, что мне нужно, это подстрока, соответствующая указанным словам, чтобы я не терял данных для анализа контекста. – user7140275

+0

Да, я буду обновлять соответственно –