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

Python实现推文提及次数查询接口时无法得到预期文件操作结果

可行实现思路

核心逻辑不需要依赖复杂字符串方法或者第三方库,靠单次线性遍历文本就能完成所有提及关系的识别,完全满足约束要求:

  • 识别规则落地:只要用户名紧邻@符号(不管@在用户名左侧、右侧还是两侧),就算一次有效提及,不需要做字符串替换操作
  • 遍历状态维护:全程只需要维护两个状态标记,一个是当前正在拼接的连续用户名字符列表,一个是上一个遍历到的字符是否为@
  • 计数触发条件:当遍历到非用户名字符(比如@、空格、标点、换行)时,如果当前已经拼接出完整用户名,且满足「上一个字符是@」或者「当前碰到的字符是@」,就给该用户名的提及次数+1
  • 边界处理:遍历完整个文本后,要检查最后一段是否是跟着@的用户名,避免漏记文本末尾的提及

核心实现代码

from collections import defaultdict
import urllib.request

# 加载待处理推文文本
resp = urllib.request.urlopen("待处理推文文本的访问地址")
content = resp.read().decode("utf-8")

mention_count = defaultdict(int)
current_uname_chars = []
prev_is_at = False

for c in content:
    # 匹配合法用户名字符:字母、数字、下划线,可根据实际用户名规则调整判定条件
    if c.isalnum() or c == "_":
        current_uname_chars.append(c)
    else:
        # 碰到分隔符,先处理已经拼接好的用户名
        if current_uname_chars:
            uname = "".join(current_uname_chars)
            # 只要用户名左边是@ 或者 右边紧接@,就算一次提及
            if prev_is_at or c == "@":
                mention_count[uname] += 1
            current_uname_chars = []
        # 更新上一个字符是否为@的标记
        prev_is_at = (c == "@")

# 补处理文本末尾可能残留的用户名
if current_uname_chars and prev_is_at:
    uname = "".join(current_uname_chars)
    mention_count[uname] += 1

# 查询接口:传入用户名返回对应提及次数
def query_mention_count(username: str) -> int:
    return mention_count.get(username, 0)

校验说明

  • 针对提到的特殊格式用例:mark@会统计mark提及1次、@mark会统计mark提及1次、@mark@john@会统计mark提及1次、john提及1次,完全符合@在任意位置都要识别的要求
  • 实现全程没有调用replace()等受限的高级字符串方法,也没有引入任何第三方依赖,全部基于Python基础语法和标准库实现
  • 单次线性扫描的时间复杂度为O(n),即使文本量较大也能保持不错的处理效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:21:37