我有一个文本-数据形式的注释,我想要预处理。除了去除url、数字等噪音之外……我还想纠正拼写错误。具体来说,我想只对出现次数不超过给定次数的单词执行拼写更正,以避免误报。为此,我使用pyspellchecker进行校正,并使用nltks FreqDist来获取单词频率,然而,这样做会显著增加预处理所需的时间。
我试着让事情尽可能的高效,但是我被卡住了,我想知道是否还有我可以做的改进。
下面是我的代码:进口:from spacy.lang.en import English
from spellchecker import SpellChecker
from nltk.probability import FreqDist
nlp = spacy.load("en_core_web_sm")
spell = SpellChecker()
fdist = FreqDist()
代码:
dict_misspell = {}
pipe = nlp.pipe(list_of_comments, batch_size = 512 ,disable = ["tagger", "parser"])
for j, doc in enumerate(pipe):
tokens = [token.lemma_.lower() for token in doc if not token.is_punct and not token.is_digit
and not token.like_url and not token.like_email and not token.like_num]
processed_comments.append(" ".join(tokens))
fdist += FreqDist(tokens)
#remember which comments contain missspellings to avoid having to look at every comment later
misspelled = spell.unknown(tokens)
if (len(misspelled) > 0):
for misspelled_word in misspelled:
if misspelled_word in dict_misspell.keys():
dict_misspell[misspelled_word].append(j)
else:
dict_misspell[misspelled_word] = [j]
#spell correction is done after the rest because only then is the frequency dict fully build.
for k, mis in enumerate(dict_misspell.keys()):
if(fdist[mis] <= 5): #only fix below certain word frequency to avoid false positives
missspelling_idxs = dict_misspell[mis]
correct_spelling = spell.correction(mis)
for idx in missspelling_idxs:
processed_comments[idx] = processed_comments[idx].replace(mis, correct_spelling)
正如您在上面看到的,我预处理了每个单独的注释,将该注释的所有单词添加到频率字典中,对于拼写检查器认为拼写错误的每个单词,我将这些单词和它们出现在拼写错误字典中的注释索引保存起来。在此之后,频率字典完全构建,我开始纠正可能拼写错误的单词,谁的频率满足个别评论中的条件。
有没有人看到提高性能的方法?
拼写检查是一个相当繁重的过程。
您可以尝试在dict_misspell中过滤掉一些标记,以便在更少的单词上调用correction
。你可以分析你的评论子集中的未知单词,并创建一些规则来过滤某种标记。
示例:少于2个字符的单词;里面有数字的;emojis;命名实体;…).