Как найти предложения, которые соответствуют последовательности слов? питон - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть большое количество предложений, из которых я хочу извлечь предложения / сегменты, которые соответствуют определенным словосочетаниям. У меня есть следующий код, который работает, но он работает только с одной строкой одного слова. Я не могу найти способ расширить его для работы с несколькими строками и строками из двух слов. Я думал, что это было просто и спрашивал других до меня, но не мог найти ответ. Кто-нибудь может мне помочь?

Это мой код:

import pandas as pd

df = pd.read_csv('text.csv')
identifiers = ('what')
sentence = df['A']

for i in sentence:
    i = i.split()
    if identifiers in i:
        index = i.index(identifiers)
        print(i[index:])

Дайте следующее предложение:

"Given that I want to become an entrepreneur, I am wondering what collage to attend."

и список идентификаторов из двух слов, например:

identifiers = [('I am', 'I can' ..., 'I will')] # There could be dozens

как мне достичь такого результата?

I am wondering what collage to attend.

Я пытался: расширить код выше, используя isin() и что-то вроде if any([x in i for x in identifiers]), но без решения. Есть предложения?

1 Ответ

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

Не работает для фраз из нескольких слов, потому что вы использовали split. Поскольку он разделяется на пробелы (по умолчанию), логически не останется ни одного элемента , содержащего пробел.

Вы можете использовать in немедленно, чтобы проверить, содержит ли определенная строка любую другую:

>>> sentence = "Given that I want to become an entrepreneur, I am wondering what collage to attend."
>>> identifiers = ['I am', 'I can', 'I will']
>>> for i in identifiers:
...    if i in sentence:
...      print (sentence[sentence.index(i):])
... 
I am wondering what collage to attend.

Ваша попытка any([x in sentence for x in identifiers]) для этих строк показывает

[True, False, False]

и, хотя он дает некоторый полезный результат, но все же не индекс, для его печати потребуется еще один цикл для этого результата. (И часть any не нужна, если только вы конкретно и не хотите знать , если предложение содержит такую ​​фразу.)

Но понимание списка [x in sentence ..] дает только список True и False, с которым вы ничего не можете сделать, так что это тупик.

Но он предлагает альтернативу:

>>> [sentence.index(x) for x in identifiers if x in sentence]
[45]

, что приводит нас к списку результатов:

>>> [sentence[sentence.index(x):] for x in identifiers if x in sentence]
['I am wondering what collage to attend.']

Если вы добавите 'I want' в свой список идентификаторов, вы все равно получите правильный результат, теперь состоящий из двух фрагментов предложения (оба вплоть до конца):

['I am wondering what collage to attend.', 'I want to become an entrepreneur, I am wondering what collage to attend.']

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

>>> [re.match(r'^([^,]+)', sentence[sentence.index(x):]).groups(0)[0] for x in identifiers if x in sentence]
['I am wondering what collage to attend.', 'I want to become an entrepreneur']

Не берите в голову часть groups(0)[0] в конце этого регулярного выражения, просто приведите объект SRE_Match обратно в обычную строку.)

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