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

Python缩写词替换代码未达预期效果,寻求排查与修正

排查并修正Python缩写替换代码问题

我来帮你看看这段代码的问题所在,以及怎么修正它。

首先,先把你的原代码贴出来方便分析:

def acronyms(text):
    my_dict = {}
    with open('acronym.txt') as fileobj:
        for line in fileobj:
            key, value = line.split('\t')
            my_dict[key] = value
    acronym_words = []
    words = word_tokenize(text)
    for word in words:
        for candidate_replacement in my_dict:
            if candidate_replacement in word:
                word = word.replace(candidate_replacement, my_dict[candidate_replacement])
        acronym_words.append(word)
    acronym_sentence = " ".join(acronym_words)
    return acronym_sentence

问题分析

你的代码主要有几个导致结果不符合预期的问题:

  1. 未处理文件行的换行符:读取acronym.txt时,每行末尾的换行符会被保留在value里。比如如果文件里的行是gr8\tgreat\nline.split('\t')得到的valuegreat\n,替换后文本会带有换行,导致输出混乱。
  2. 子串匹配而非全词匹配:用candidate_replacement in word会匹配单词中的子串,比如如果有缩写gr对应great,那么gr8会被错误替换成great8,而不是匹配整个单词gr8
  3. 低效的遍历方式:对每个单词遍历所有缩写键,其实直接检查单词是否在字典键里会更高效,也避免不必要的替换。
  4. 缺少word_tokenize的导入:这个函数来自nltk库,代码里没导入的话会直接报错,你可能漏写了导入语句。

修正后的代码

# 先导入需要的库(如果使用word_tokenize)
from nltk.tokenize import word_tokenize

def acronyms(text):
    my_dict = {}
    with open('acronym.txt', 'r') as fileobj:
        for line in fileobj:
            # 先去掉每行首尾的空白(包括换行符),再分割
            line_stripped = line.strip()
            if not line_stripped:  # 跳过空行
                continue
            key, value = line_stripped.split('\t')
            # 确保键和值都没有多余空白
            my_dict[key.strip()] = value.strip()
    
    acronym_words = []
    words = word_tokenize(text)
    for word in words:
        # 直接检查当前单词是否是缩写(全词匹配)
        if word in my_dict:
            acronym_words.append(my_dict[word])
        else:
            acronym_words.append(word)
    
    return " ".join(acronym_words)

关键修改说明

  • 处理文件行的空白:用line.strip()去掉每行的换行符和首尾空白,再分割键值对,避免替换后的文本带换行。
  • 全词匹配:直接判断word in my_dict,确保只有当整个单词是缩写时才替换,避免子串匹配的错误。
  • 跳过空行:如果acronym.txt里有空行,会被跳过,避免split报错。
  • 明确导入word_tokenize:补上了必要的导入语句,确保代码能正常运行。

现在调用acronyms("we are gr8 and awsm"),只要你的acronym.txt里有对应的行(比如gr8\tgreatawsm\tawesome),就能得到预期的we are great and awesome了。

内容的提问来源于stack exchange,提问作者Asmaa M. Elmohamady

火山引擎 最新活动