如何用Python检测英文句子是否全为无意义词汇及优化、自定义语料方法
代码优化方案
原代码的核心问题是words.words()返回的是列表结构,单次in查询时间复杂度为O(n),句子越长、调用次数越多性能越低,另外未处理大小写匹配问题,比如输入TEST会因为nltk词汇表默认全小写导致漏判。
优化后的代码如下:
import nltk nltk.download('words', quiet=True) from nltk.corpus import words # 全局只初始化一次词汇集合,查询复杂度O(1) VALID_WORDS = set(word.lower() for word in words.words()) def is_sentence_meaningless(sentence): # 统一转小写后判断,all有任意不满足就提前终止,和原逻辑一致 return all(word.lower() not in VALID_WORDS for word in sentence.split()) # 测试 print(is_sentence_meaningless("sss sss asdfasdf asdfasdfa asdfasfsd")) # 输出True print(is_sentence_meaningless(" sss sss asdfasdf asdfasdfa asdfasfsd TEST")) # 输出False
优化点说明:
- 提前将nltk词汇表转成小写集合,全局仅初始化一次,查询效率提升数十倍
- 统一对输入单词做小写转换,避免大小写不匹配导致的识别错误
- 用
all()生成器表达式替代显式循环,逻辑更简洁,且保持遇到有效词立刻终止的特性
自定义领域语料实现
可以实现,只需要把你的领域特定词汇加到上面的VALID_WORDS集合里即可。示例如下:
import nltk nltk.download('words', quiet=True) from nltk.corpus import words # 你的领域自定义词汇,可自行扩展,也可以从本地txt文件按行读取 CUSTOM_DOMAIN_WORDS = {"chatgpt", "llama", "stable diffusion", "word2vec"} # 合并nltk通用词汇和自定义领域词汇,统一转小写 VALID_WORDS = set(word.lower() for word in words.words()) VALID_WORDS.update(word.lower() for word in CUSTOM_DOMAIN_WORDS) def is_sentence_meaningless(sentence): return all(word.lower() not in VALID_WORDS for word in sentence.split()) # 测试自定义词汇识别 print(is_sentence_meaningless("asdf qwer zxcv llama")) # 包含自定义有效词llama,输出False
如果自定义词汇量很大,可以存放到本地txt文件,每行一个词汇,用以下代码加载即可:
# 从本地custom_words.txt加载自定义词汇 with open("custom_words.txt", "r", encoding="utf-8") as f: CUSTOM_DOMAIN_WORDS = [line.strip() for line in f if line.strip()]
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

