Как выбрать подстроки исходя из наличия пар слов? питон - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть большое количество предложений, из которых я хочу извлечь под-предложения, начинающиеся с определенных словосочетаний. Например, я хочу извлечь сегменты предложения, которые начинаются с «что делает» или «что есть» и т. Д. (По существу, исключая слова из предложения, которые появляются перед парами слов). И предложения, и пары слов хранится в DataFrame:

'Sentence'                                    'First2'                                    
0  If this is a string what does it say?      0 can I    
1  And this is a string, should it say more?  1 should it    
2  This is yet another string.                2 what does
3  etc. etc.                                  3 etc. etc

Результат, который я хочу получить из приведенного выше примера:

0 what does it say?
1 should it say more?
2

Самое очевидное решение (по крайней мере для меня) ниже не работает. Он использует только первую пару слов b, чтобы пройти все предложения r, но не остальные b.

a = df['Sentence']
b = df['First2'] 

#The function seems to loop over all r's but only over the first b:
def func(z): 
    for x in b:
        if x in r:
            s = z[z.index(x):] 
            return s
        else:
            return ‘’

df['Segments'] = a.apply(func)

Кажется, что циклирование двух DataFrames одновременно таким образом не работает. Есть ли более эффективный и действенный способ сделать это?

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Я считаю, что в вашем коде есть ошибка.

else:
    return ''

Это означает, что если 1-е сравнение не совпадает, 'func' вернется немедленно. Возможно, поэтому код не возвращает совпадений.

Пример рабочего кода приведен ниже:

# The function seems to loop over all r's but only over the first b:
def func(sentence, first_twos=b):
    for first_two in first_twos:
        if first_two in sentence:
            s = sentence[sentence.index(first_two):]
            return s
    return ''

df['Segments'] = a.apply(func)

А на выходе:

df:   
{   
'First2': ['can I', 'should it', 'what does'],   
'Segments': ['what does it say? ', 'should it say more?', ''],   
'Sentence': ['If this is a string what does it say? ', 'And this is a string, should it say more?', 'This is yet another string.  '  ]  
} 
0 голосов
/ 30 апреля 2018

На мой вопрос ответил следующий код:

def func(r):
    for i in b:
        if i in r:
            q = r[r.index(i):]
            return q
    return ''

df['Segments'] = a.apply(func)

Решение было указано здесь Даминг Лу (только последняя строка отличается от его). Проблема была в двух последних строках исходного кода:

else:
    return ''  

Это заставило функцию возвращаться слишком рано. Ответ Даминга Лу был лучше, чем ответ на возможный повторяющийся вопрос цикл python for выполняется только один раз? , что создало другие проблемы - как объяснено в моем ответе на wii. (Так что я не уверен, что мой действительно дубликат.)

0 голосов
/ 30 апреля 2018

Вы можете легко зациклить две вещи через zip(iterator,iterator_foo)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...