最近总结修改了下预处理方法,记录下
首先download需要的依赖
pip install pyenchant
pip install nltk
pyenchant 是用来检测拼写正确的,如果你的文本里面可能包含非正确拼写的单词,那就忽略它,nltk用来做分词的。
python -m nltk.downloader punkt
python -m nltk.downloader stopwords
from nltk.corpus import stopwords
import nltk
import enchant
import re
def is_spelled_correctly(word, language='en_US'):
spell_checker = enchant.Dict(language)
return spell_checker.check(word)
def preprocess_text(text):
text= re.sub(r'\W+', ' ',re.sub(r'[0-9]+', '', text.replace('-', '').replace('_', ' ')))
words=nltk.word_tokenize(text)
stop_words = set(stopwords.words('english'))
words = [item for word in words for item in re.findall(r'[A-Z]+[a-z]*|[a-z]+', word)if is_spelled_correctly(item) and item.lower() not in stop_words]
return ' '.join(words).lower()
if __name__ == '__main__':
print(preprocess_text('ServiceHandlerId caedbe-85432-xssc-dsdabffdddbea An exception of some microservice TargetDownService occurred and was test #@/*-sss '))
#service handler id exception target service occurred test
这里最后再转小写是因为防止ServiceHandlerId这种连续的单词链接成的字符串被拼写检查剔除,只有保持驼峰情况下,才能用 re.findall(r'[A-Z]+[a-z]*|[a-z]+', word) 成功把他分成单独的单词,所以最后再处理大小写。
改进方案1:
之后测试的时候发现数据量一大,他就很慢,后面优化了一下,速度大大提升了
from nltk.corpus import stopwords
import nltk
import enchant
import re
spell_checker = enchant.Dict(language)
def memoize(func):
cache = {}
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
@memoize
def check_spelling(word):
return spell_checker.check(word)
def preprocess_text(text):
text= re.sub(r'\W+', ' ',re.sub(r'[0-9]+', '', text.replace('-', '').replace('_', ' ')))
words=nltk.word_tokenize(text)
stop_words = set(stopwords.words('english'))
words = [item for word in words for item in re.findall(r'[A-Z]+[a-z]*|[a-z]+', word)if check_spelling(item) and item.lower() not in stop_words]
return ' '.join(words).lower()
if __name__ == '__main__':
print(preprocess_text('ServiceHandlerId caedbe-85432-xssc-dsdabffdddbea An exception of some microservice TargetDownService occurred and was test #@/*-sss '))
#service handler id exception target service occurred test
这里面使用了memoization 技术,它是一种将函数调用和结果存储在一个字典中的优化技术。我这里用来缓存单词的拼写检查结果。
这样之后数据量大了之后速度依然不会太慢了。
改进方案2:
使用spellchecker 这个的速度就比enchant 快的多
pip install pyspellchecker
spell = SpellChecker()
def preprocess_text(text):
text= re.sub(r'\W+', ' ',re.sub(r'[0-9]+', '', text.replace('-', '').replace('_', ' ')))
words=nltk.word_tokenize(text)
stop_words = set(stopwords.words('english'))
words = [item for word in words for item in spell.known(re.findall(r'[A-Z]+[a-z]*|[a-z]+', word)) if item.lower() not in stop_words]
return ' '.join(words).lower()
区别:
SpellChecker是一个基于编辑距离的拼写检查库,它可以在内存中加载一个词典,并对给定的单词列表进行快速的拼写检查。enchant是一个基于C语言的拼写检查库,它可以使用不同的后端,如aspell, hunspell, ispell等,来检查单词是否存在于词典中。SpellChecker比enchant更快,尤其是当单词列表很大时。文章来源:https://www.toymoban.com/news/detail-634010.html
新增改进
这边用了一段时间,发现有些字符串是不是正确拼写,但是确实对我之后的分类有用处,所以新加一个list文章来源地址https://www.toymoban.com/news/detail-634010.html
spell = SpellChecker()
exceptions_words = ['jwt','json',......]
def preprocess_text(self, text):
text = re.sub(
r'\W+', ' ', re.sub(r'[0-9]+', '', text.replace('-', ' ').replace('_', ' ')))
split_text = re.findall(r'[A-Z]+[a-z]*|[a-z]+', text)
new_sentence = ' '.join(split_text)
words = nltk.word_tokenize(new_sentence)
stop_words = set(stopwords.words('english'))
words = [word for word in words if (word in self.spell.known([word]) and word.lower() not in stop_words) or word.lower() in exceptions_words]
return ' '.join(words).lower()
到了这里,关于文本NLP噪音预处理(加拼写检查)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!