如何删除文本中不在自定义vocabulary词表内的token?
代码运行无效的核心原因
- 变量名拼写错误:词表定义时命名为
vocbulary,后续判断逻辑里引用的是vocabulary,变量名不匹配导致判断逻辑实际使用的词表无效 - 入参格式错误:
texte被定义为只有一个字符串元素的列表,但nltk.word_tokenize要求传入字符串类型参数,直接传入列表会触发类型错误,后续re.sub操作的入参也是列表类型,不符合方法要求 - 大小写匹配问题:词表中存储的
Get等词为首字母大写格式,而文本中对应的词为小写get,严格匹配下无法命中词表 - 替换逻辑错误:每次循环都基于原始文本
texte执行替换,之前的替换结果会被后续操作完全覆盖,同时re.sub会触发部分字符匹配问题,比如替换单字a时会误删其他单词里的a字符
修正方案
建议直接筛选符合要求的token再拼接成新文本,无需用正则替换,执行效率更高也不会出现匹配偏差:
import nltk # 修正词表拼写,转为集合提升查找效率 vocabulary = {'Get','owns', 'about', 'for', 'to', 'by', 'person', 'movie', 'school', 'Movie', 'Person'} # 直接定义为字符串,若要保留原列表格式可改为texte = texte[0]取出字符串元素 texte = "good morning i oll know most terrible things you've done in your life up to this point but clearly a commons ot of balance to get a sign to my class i professor annile's keeting and this is criminal law one hundred or as i prefered to college ow to get away with murder\nunlike many of my colleagues i will not be teaching you how to study the law a theorize about it but rather how to practise what was the men" # 分词后筛选符合词表要求的token valid_tokens = [word for word in nltk.word_tokenize(texte) if word in vocabulary] # 拼接为最终文本 x = ' '.join(valid_tokens)
如果需要不区分大小写匹配,可以调整判断逻辑:
# 词表统一转为小写存储 vocabulary_lower = {w.lower() for w in vocabulary} valid_tokens = [word for word in nltk.word_tokenize(texte) if word.lower() in vocabulary_lower]
内容的提问来源于stack exchange,提问作者Doul Jack
相关产品推荐
相关产品推荐

