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

Python练习调试:统计词及同义词在语料库中的出现次数

问题排查与解决方案

首先,你的代码返回[['happy', 0]]有两个最直接的原因,我们一步步拆解:

核心问题分析

  1. Thesaurus中没有"happy"的条目
    你当前定义的Thesaurus只有dog和cat的Entry,完全没有包含"happy"及其同义词的条目。所以你的search函数里,all_words最终只有你输入的"happy"这一个词。
  2. 示例Corpus里没有目标词汇
    你给出的doc1和doc2里完全没有"happy"或它的同义词,自然计数为0。

除此之外,你的代码还有两个可以优化的逻辑漏洞:

  • 只能匹配Entry.word完全等于keyword的情况,如果输入的是同义词(比如"glad"),无法找到对应的主条目,也就无法获取整个同义词组。
  • 多层嵌套循环的计数方式效率较低,而且返回的是列表嵌套列表,和你预期的元组格式不符。

修复后的完整代码

我们先补充必要的Thesaurus条目和包含目标词汇的Corpus,再优化搜索逻辑:

class Entry :
    def __init__(self, input_word, input_synonyms) :
        self.word = input_word
        self.synonyms = input_synonyms

# 补充happy的同义词条目
e1 = Entry("dog", ["doggie", "puppy"])
e2 = Entry("cat", ["kitty"])
e3 = Entry("happy", ["glad", "pleased", "delighted", "joyous"])
Thesaurus = [e1, e2, e3]

# 补充包含目标词汇的文档
doc1 = ["this", "is", "a", "single", "document"]
doc2 = ["this", "is", "another", "document"]
doc3 = ["happy", "glad", "pleased", "happy", "happy"]
doc4 = ["delighted", "joyous", "happy", "glad", "pleased"]
Corpus = [doc1, doc2, doc3, doc4]

def search(keyword) :
    all_words = set()  # 用集合避免重复词汇
    # 查找所有包含keyword的条目:既匹配主词,也匹配同义词
    for entry in Thesaurus:
        if entry.word == keyword or keyword in entry.synonyms:
            all_words.add(entry.word)
            all_words.update(entry.synonyms)
            break  # 假设一个词只属于一个同义词组,找到即退出循环
    
    # 如果没找到任何同义词组,就只搜索输入的keyword本身
    if not all_words:
        all_words.add(keyword)
    
    # 用Counter高效统计整个语料库的词频
    from collections import Counter
    total_word_counts = Counter()
    for document in Corpus:
        total_word_counts.update(document)
    
    # 生成预期格式的元组列表
    result = [(word, total_word_counts.get(word, 0)) for word in all_words]
    return result

input_keyword = "happy"
output = search(input_keyword)
print(output)

代码说明

  • 同义词组匹配优化:现在不管输入的是主词("happy")还是同义词("glad"),都能找到对应的完整同义词组。
  • 高效计数:使用collections.Counter一次性统计整个语料库的词频,比多层嵌套循环更简洁高效。
  • 格式对齐:返回的是元组列表,和你预期的[('happy', 16), ('glad', 2), ...]格式一致。
  • 容错处理:如果输入的词不在任何同义词组里,会单独统计这个词的出现次数。

运行上面的代码,你会得到类似这样的输出(根据Corpus里的词汇数量):

[('happy', 4), ('delighted', 1), ('pleased', 2), ('glad', 2), ('joyous', 1)]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:31:53