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

Python计算spaCy提取动词短语平均词长返回全1.0问题排查

问题根因

你的代码存在两个核心问题,导致返回结果全为1.0:

  • 对pandas apply()的传参逻辑理解错误
    你定义函数时默认参数接收整列数据,但df[col].apply()默认是逐单元格传值——每次传入函数的是单条文本对应的动词短语集合,不是整列数据。
  • 函数内部计算逻辑完全错误
    没有用容器存储所有短语的长度,循环中每次都用当前遍历对象的长度覆盖phrase_length变量,np.mean()每次计算的都是单个值的均值,结果就是值本身。从返回全1的结果可以判断,你当前verb_phrases列的单元格存储的是字符串类型而非短语列表:for phrase in 字符串会遍历字符串的每个字符,单个字符的长度恒为1,最终返回结果自然全是1.0。就算单元格存的是列表,你当前的写法最终只会返回最后一个短语的长度,也不是所有短语的平均长度。
正确实现方案

首先先规范verb_phrases列的存储格式:确保每个单元格存的是列表类型,列表元素为单条文本提取到的单个动词短语(支持spaCy Span对象、分词后的词列表格式,不要存拼接后的整串字符串)。

写法1:自定义函数逐行计算(兼容性更好)

import numpy as np

def get_avg_phrase_len(phrases):
    # 处理空值、空列表场景,避免运行报错
    if not isinstance(phrases, list) or len(phrases) == 0:
        return 0.0
    # 逐个计算每个动词短语的词数
    phrase_len_list = []
    for p in phrases:
        # 如果你存的是字符串格式的短语,把len(p)换成len(p.split())按空格分词算词数
        # 如果你存的是spaCy的Span对象,直接len(p)即可得到词数
        phrase_len_list.append(len(p))
    return np.mean(phrase_len_list)

# 应用函数生成新列
df['verb_phrases_length'] = df['verb_phrases'].apply(get_avg_phrase_len)

如果你的verb_phrases列目前存的是分隔符拼接的字符串(比如用逗号、空格拼接多个短语),先拆分再计算即可,比如逗号分隔的场景可以直接写:

df['verb_phrases_length'] = df['verb_phrases'].apply(
    lambda x: np.mean([len(p.split()) for p in x.split(',')]) if isinstance(x, str) and len(x)>0 else 0.0
)

写法2:lambda简写(适合格式规范的场景)

如果列中所有单元格都是非空的短语列表,且元素为spaCy Span对象,可以直接简写:

df['verb_phrases_length'] = df['verb_phrases'].apply(lambda x: np.mean([len(p) for p in x]))
额外说明

不要在循环内部重复调用np.mean(),这类聚合计算要等拿到所有短语的长度列表后再统一计算,否则既浪费性能,也会因为变量覆盖得到错误结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:39:09