如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子

Posted

技术标签:

【中文标题】如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子【英文标题】:Selecting sentences from a data frame text column if only the sentences contain any of the keywords from a search list 【发布时间】:2021-01-31 09:17:20 【问题描述】:

我有一个数据框,在一列中,我有一个包含多个很长句子的全文。我使用NLTK 对文本进行标记,但现在我需要确保我只从给定的完整单词长列表中提取包含任何单词的句子。我编写了以下代码,但问题在于,它不是检查整个文本中的单词,而是例如在搜索列表中发现一个给定的单词,例如“tic”,它选择一个包含“统计”这个词..

symptoms = [long list of words ~ about 100]
new_df = df[df['Sentence'].str.contains('|'.join(symptoms))]

在这段代码的正上方,我使用下面的代码来标记我的文本。

sentences = []
for row in df_no_title.itertuples():
    for sentence in sent_tokenize(row[2]):
        sentences.append((row[1], sentence))    
df = pd.DataFrame(sentences, columns=['Paper_Id', 'Sentence'])

有没有办法逐字检查句子以找到与我列表中的任何单词匹配的句子,并且只在 Python 中提取这些句子?

如果我需要提供任何其他信息,请告诉我。

【问题讨论】:

您介意编辑您的帖子并为代码应用正确的格式吗? Python 对缩进敏感,代码不应被“格式化”为块引号。请参阅help page on formatting 以了解正确的语法——您会发现它并不难。 @usr2564301 当然,我只是修复了它。谢谢! 【参考方案1】:

您使用的正则表达式几乎很好。您需要的是搜索可以通过使用匹配单词边界(在正则表达式意义上)的\b 特殊正则表达式字符来实现的单个单词。

因此,可行的是:

symptoms = [long list of words ~ about 100]
new_df = df[df['Sentence'].str.contains('\b' + '\b|\b'.join(symptoms) + '\b')]

您可以根据下面的示例检查使用的正则表达式如何捕捉here的症状。

【讨论】:

感谢您的反馈,但我真的很感激,但我不认为这是解决方案,因为如果我使用 \b 这样添加,它不会从症状中找到任何匹配的句子,没有输出任何东西。 你能提供一个句子的例子和symptoms的简短列表吗? 是的,当然:症状 = ['头痛','胸痛','流鼻涕','胃痛','高碳酸血症'] 句子 = ['52 名患者有ap aco2 ≥ 60 mmhg 的严重高碳酸血症和 ph @ElifKaya:我不确定为什么我提出的解决方案不适合你。请通过答案中提供的链接查看从症状构造的正则表达式如何工作。

以上是关于如果仅句子包含搜索列表中的任何关键字,则从数据框文本列中选择句子的主要内容,如果未能解决你的问题,请参考以下文章

从子集合中搜索包含来自父子集合的关键字

在DAX中搜索关键字

如果行只包含停用词中的任何一行,则从文本文件中删除这些行

如果字符串包含列表中的单词,则从字符串中提取单词

VBA 查找/替换和文本颜色更改

如果缺少,则从解析 json 将项目添加到共享点列表