You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何高效统计DataFrame中指定单词在对应句子中的出现频率?

问题分析

你的原代码之所以运行极慢,核心问题是双重循环的时间复杂度爆炸:你把所有句子拆分成列表后,遍历每一个单词去和所有句子匹配——50k行的话就是50k×50k=25亿次操作,这完全超出了合理的计算范围。

正确的思路应该是逐行处理:每一行只需要统计当前word在对应Sentence中的出现次数,而不是让所有句子和所有单词交叉配对。

高效解决方案

下面提供两种可靠的实现方式,都能轻松处理50k行的数据集:

方法1:准确的单词级计数(推荐)

这个方法会先清理句子中的标点,确保像day!day被视为同一个单词,然后统计目标单词的出现次数:

import pandas as pd
import re
from collections import Counter

def count_target_word(row):
    # 清理句子:移除标点、转小写,避免大小写和标点干扰
    cleaned_sentence = re.sub(r'[^\w\s]', '', row['Sentence']).lower()
    # 拆分句子为单词列表并统计词频
    word_counts = Counter(cleaned_sentence.split())
    # 返回目标单词的计数(转小写匹配)
    return word_counts.get(row['word'].lower(), 0)

# 给DataFrame新增计数列
df['n'] = df.apply(count_target_word, axis=1)

方法2:简化版(适合无标点干扰的场景)

如果你的数据里句子和单词的标点已经统一(比如单词不带标点,句子里的标点也不影响单词识别),可以用更简洁的写法:

import pandas as pd
import re

def count_target_word(row):
    # 拆分句子为单词,同时清理每个单词的标点
    sentence_words = [re.sub(r'[^\w]', '', word) for word in row['Sentence'].split()]
    # 统计目标单词的出现次数
    return sentence_words.count(row['word'])

df['n'] = df.apply(count_target_word, axis=1)

为什么这个方法快?

逐行处理的时间复杂度是O(N×K),其中N是行数(50k),K是每个句子的平均单词数(通常几十),总操作数只有几百万次,比原代码的25亿次快了上千倍,完全能在几秒内跑完。

验证结果

用你提供的示例数据测试,两种方法都会得到你期望的输出:

Sentencewordn
"Such a day! It's a beautiful day out there""beautiful"1
"Such a day! It's a beautiful day out there""day"2
"I am sad by the sad weather""weather"1
"I am sad by the sad weather""sad"2

内容的提问来源于stack exchange,提问作者Onik Rahman

火山引擎 最新活动