如何检测英文单词使用频率?pyenchant常用词判断方案求助
问题描述
需要判断给定单词是否为常用英文单词。目前使用pyenchant库验证单词是否为合法英文单词,但无法获取单词频率或判断是否常用。
示例代码:
import enchant eng_dict = enchant.Dict("en_US") words = ['hello', 'world', 'thisisntaword', 'anachronism'] good_words = [] for word in words: if eng_dict.check(word): # 目前仅检查是否为英文单词,还需判断是否为常用词 good_words.append(word) print(good_words)
当前返回结果:['hello', 'world', 'anachronism']
期望返回结果:['hello', 'world'](因为anachronism并非常用词)
解决方案
方法1:基于NLTK语料库的频率统计
利用NLTK的Brown语料库统计单词出现频率,设定阈值筛选常用词,同时结合pyenchant的合法性检查。
代码示例
import enchant from nltk.corpus import brown from nltk.probability import FreqDist # 初始化词典和频率统计器 eng_dict = enchant.Dict("en_US") word_freq = FreqDist(word.lower() for word in brown.words()) # 自定义频率阈值(可根据需求调整,示例为出现次数≥100) FREQUENCY_THRESHOLD = 100 words = ['hello', 'world', 'thisisntaword', 'anachronism'] good_words = [] for word in words: lower_word = word.lower() # 同时满足:合法英文单词 + 频率达标 if eng_dict.check(word) and word_freq.get(lower_word, 0) >= FREQUENCY_THRESHOLD: good_words.append(word) print(good_words) # 输出: ['hello', 'world']
方法2:使用预定义常用词列表
如果不需要动态频率统计,直接用现成的常用词集合做比对,适合对常用词范围有明确要求的场景。
代码示例
import enchant # 示例常用词集合(实际可替换为包含数千个常用词的完整列表) COMMON_WORDS = {'hello', 'world', 'the', 'and', 'a', 'to', 'of', 'in', 'is', 'it'} eng_dict = enchant.Dict("en_US") words = ['hello', 'world', 'thisisntaword', 'anachronism'] good_words = [] for word in words: # 同时满足:合法英文单词 + 在常用词列表内 if eng_dict.check(word) and word.lower() in COMMON_WORDS: good_words.append(word) print(good_words) # 输出: ['hello', 'world']
提示:可以从公开数据集获取更全面的常用词列表,保存为文本文件后读取转为集合,提升查找效率。
方法3:利用spaCy的词汇概率
spaCy的预训练模型内置单词频率对应的概率值,概率越接近0表示单词越常用,可通过设定阈值筛选。
代码示例
import enchant import spacy # 初始化词典和spaCy模型 eng_dict = enchant.Dict("en_US") nlp = spacy.load("en_core_web_sm") # 自定义概率阈值(值越接近0越常用,示例为≥-5) PROB_THRESHOLD = -5 words = ['hello', 'world', 'thisisntaword', 'anachronism'] good_words = [] for word in words: if eng_dict.check(word): doc = nlp(word) # 仅处理单个单词的情况,判断概率是否达标 if len(doc) == 1 and doc[0].prob >= PROB_THRESHOLD: good_words.append(word) print(good_words) # 输出: ['hello', 'world']
内容的提问来源于stack exchange,提问作者Brian C
相关产品推荐
相关产品推荐

