Python练习调试:统计词及同义词在语料库中的出现次数
问题排查与解决方案
首先,你的代码返回[['happy', 0]]有两个最直接的原因,我们一步步拆解:
核心问题分析
- Thesaurus中没有"happy"的条目
你当前定义的Thesaurus只有dog和cat的Entry,完全没有包含"happy"及其同义词的条目。所以你的search函数里,all_words最终只有你输入的"happy"这一个词。 - 示例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
相关产品推荐
相关产品推荐

