我有大量句子,我想从中提取与某些单词组合匹配的子句/句段。我有以下代码可以工作,但它只适用于一个单词的一个字符串。我找不到一种方法来扩展它以使用多个字符串和两个单词的字符串。我觉得这很简单,在我面前被别人问过,但找不到答案。有人能帮助我吗?
这是我的代码:
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])
的内容扩展上面的代码,但没有解决方法。有什么建议吗?
答案 0 :(得分:1)
它不适用于多字词短语,因为您使用了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对象强制转换回常规字符串。)