You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python文本匹配优化与DataFrame NA值填充问题求助

优化匹配逻辑并生成完整DataFrame

我来帮你搞定这个问题——原代码的四层嵌套循环在大数据集下确实效率极低,而且只能保留匹配到的段落,没法给未匹配项填充NA。下面是针对性的优化方案:

问题分析

原代码的核心问题:

  • 四层嵌套循环导致时间复杂度爆炸(O(nmk*l),n是段落数,m是字典键数,k是每个键的列表长度,l是段落单词数),数据量一大就卡得不行。
  • 只收集匹配成功的条目,未匹配的段落直接被丢弃,没法生成包含所有段落的完整DataFrame。

优化思路

  1. 预处理关键词集合:把字典里的所有关键词提取到一个集合中,集合的成员查找是O(1)时间复杂度,比列表快N倍。
  2. 简化遍历逻辑:把四层循环砍到两层,只需要遍历每个段落,再遍历段落里的单词做匹配。
  3. 保留所有段落:每个段落都生成一行结果,没匹配到关键词就填pd.NA。

完整代码实现

import pandas as pd

# 原始输入数据
paragraphs = ['protein and carbohydrates Its is a little heavier pulsus widely used and is a versatile ingredient',
              'Tea contains the goodness of Natural Ingredients Cardamom Ginger Tea bags Disclaimers As per Ayurvedic texts',
              'almonds are all natural supreme sized nuts they are highly nutritious and extremely healthy',
              'Camel milk can be consumed by lactose intolerant people and those allergic to cows milk',
              'Healthy Crunch Almond with honey is an extra crunchy breakfast cereal for a delightful start to your mornings']

keyword_dict = {'First': ['Tea','Coffee'], 'Second': ['Noodles','Pasta'], 'Third': ['sandwich','honey'], 'Fourth': ['Almond','apricot','blueberry'] }

# 第一步:把所有关键词提取到集合里,加速查找
all_keywords = set()
for keyword_list in keyword_dict.values():
    all_keywords.update(keyword_list)

# 第二步:遍历每个段落,收集匹配结果
output_data = []
for text in paragraphs:
    split_words = text.split()
    # 找到当前段落里所有匹配的关键词
    matched_words = [word for word in split_words if word in all_keywords]
    # 有匹配就取第一个(或者用', '.join(matched_words)合并所有匹配),没有就填NA
    matched_text = matched_words[0] if matched_words else pd.NA
    output_data.append({
        "whole_text": text,
        "matched_text": matched_text
    })

# 生成最终的DataFrame
result_df = pd.DataFrame(output_data)
print(result_df)

代码说明

  • 集合优化:用set存储关键词后,每次检查单词是否在关键词里的速度从O(k)降到O(1),关键词越多,提升越明显。
  • 循环简化:现在只有两层循环(遍历段落+遍历段落内单词),时间复杂度直接降到O(n*l),大数据集下速度会快很多。
  • 完整结果:每个段落都会出现在DataFrame里,未匹配的matched_text列自动填充pd.NA,完全符合你的需求。

扩展玩法(可选)

如果需要更宽松的匹配规则,比如不区分大小写、匹配复数形式,可以调整匹配逻辑:

  • 不区分大小写匹配:
# 把关键词和段落单词都转成小写
all_keywords_lower = {kw.lower() for kw in all_keywords}
matched_words = [word for word in split_words if word.lower() in all_keywords_lower]
  • 复数/词根匹配:可以用NLTK的词干提取器处理:
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
# 先把关键词转成词根形式
all_keywords_stemmed = {stemmer.stem(kw.lower()) for kw in all_keywords}
# 段落单词也转成词根再匹配
matched_words = [word for word in split_words if stemmer.stem(word.lower()) in all_keywords_stemmed]

内容的提问来源于stack exchange,提问作者james joyce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:21:55