读取NLTK语料库时如何完整保留或还原缩写与缩略形式?
解决NLTK语料库分词时缩写被拆分的问题
方法一:改用智能分词器保留缩写整体
NLTK自带的words()方法仅按空白和标点简单拆分,会把带标点的缩写拆碎。可以替换为nltk.tokenize.word_tokenize(),它能识别常见缩写(如U.S.、I'm)并保留为整体:
先导入并准备必要模块:
import nltk from nltk.tokenize import word_tokenize # 首次使用需下载分词模型 nltk.download('punkt')
修改你的读取函数:
START_TOKEN = "<START>" END_TOKEN = "<END>" def read_corpus(package, category): """ Read files from corpus(package)'s category. Params: package (nltk.corpus): corpus category (string): category name Return: list of lists, with words from each of the processed files assigned with start and end tokens """ files = package.fileids(category) corpus = [] for f in files: # 读取原始文本而非直接调用words() raw_text = package.raw(f) # 用word_tokenize分词,自动保留缩写整体 tokens = word_tokenize(raw_text) # 转小写并添加起止标记 processed_tokens = [START_TOKEN] + [w.lower() for w in tokens] + [END_TOKEN] corpus.append(processed_tokens) return corpus
测试后,U.S.会被处理为"u.s.",I'm会变成"i'm",均作为单个元素保留。
方法二:还原缩写为完整形式(可选)
如果需要把缩写转换成完整表达(比如I'm→I am,U.S.→United States),可以用以下两种方式:
手动映射表方式
适合处理常见缩写,灵活性强:
abbrev_map = { "i'm": "i am", "u.s.": "united states", "don't": "do not", # 可按需添加更多缩写映射 } def read_corpus_with_expansion(package, category): files = package.fileids(category) corpus = [] for f in files: raw_text = package.raw(f) tokens = word_tokenize(raw_text) processed_tokens = [START_TOKEN] for token in tokens: lower_token = token.lower() # 匹配到映射则替换,否则保留原小写形式 processed_tokens.append(abbrev_map.get(lower_token, lower_token)) processed_tokens.append(END_TOKEN) corpus.append(processed_tokens) return corpus
工具库自动还原方式
如果有大量缩写需要处理,可使用contractions库(需先安装:pip install contractions),它能自动还原大部分英语缩写:
import contractions def read_corpus_with_expansion(package, category): files = package.fileids(category) corpus = [] for f in files: raw_text = package.raw(f) # 先还原缩写,再分词 expanded_text = contractions.fix(raw_text) tokens = word_tokenize(expanded_text) processed_tokens = [START_TOKEN] + [w.lower() for w in tokens] + [END_TOKEN] corpus.append(processed_tokens) return corpus
注:这类工具对U.S.这类专有名词缩写的还原效果有限,仍需手动补充映射表。
内容的提问来源于stack exchange,提问作者rd142857
相关产品推荐
相关产品推荐

