按关键词阅读:
自然语言处理(NLP)入门-预处理 , 单词嵌入 , 文本分类等
使用简单的Python库
文章插图
source
如今 , 自然语言处理领域发生了很多事情(GRU , LSTM , XLNet , BERT等!) 。弄清楚从哪里开始可能会很困难 。本文讨论了自然语言处理的基础 , 包括使用基本但功能强大的Python库进行的数据清理 , 规范化 , 编码 , 情感分析和简单的文本分类器 。这通常是进入复杂的深度学习模型之前的第一步 。
数据清理和规范化根据问题的性质 , 可能需要也可能不需要此步骤 。如果我们的模型正在尝试最大程度地学习语言 , 则最好以原始格式使用数据 , 实际上 , 现代深度学习技术建议不要删除停用词 , 表情符号或小写字母 , 因为它们会提供附加信息和上下文 。但是 , 如果您尝试根据某些单词的出现情况进行趋势分析或分类(例如在词袋模型中) , 则执行此步骤是有帮助的 。我想在此处重点介绍一些常见的预处理步骤:
· 删除标点符号:尝试训练机器学习模型时 , 它可以通过删除标点符号(如! , *等)来减少过度拟合 。但是 , 请注意不要删除重要的内容 , 例如 , 问号(?)有助于识别问题 。
· 删除表情符号:有时人们将表情符号附加到没有空格的单词(例如:you?)上 , 从而难以解释此类单词 。删除表情符号可以在这种情况下提供帮助 。同样 , 删除这些表情符号时要小心 , 因为表情符号实际上可能对情感分析和主题分类等任务非常有用 。
· 删除停用词:对于诸如数据探索和趋势分析之类的任务 , 查看诸如" the" , " and" , " of"等常用词可能不是很有用 。 sklearn软件包实际上包含了一组常用的英语停用词 , 我们可以用来删除这些词 。
· 使所有文本变为小写:这是标准化文本的最简单方法 。(毕竟 , BeTTer和better确实具有相同的语义含义)
· 词干:规范化的另一种方法是将派生词替换为其词根形式(例如 , "posting" , "posted" , "posts"全部替换为"post") 。为了提炼词干 , 我们使用nltk提供的PorterStemmer util 。
· 提取/删除主题标签和注释:主题标签和注释在识别数据趋势方面非常有用 。它有助于将它们从文本中提取出来并分别进行分析 。
这是执行上述任务的简单功能:
import refrom sklearn.feature_extraction.text import ENGLISH_STOP_WORDSfrom nltk.stem.porter import PorterStemmerimport emojiimport stringdef preprocess_text(text, remove_stop = True, stem_words = False, remove_mentions_hashtags = True):"""eg:input: preprocess_text("@water #dream hi hello where are you going be there tomorrow happening happen happens",stem_words = True)output: ['tomorrow', 'happen', 'go', 'hello']"""# Remove emojisemoji_pattern = re.compile("[" "\U0001F1E0-\U0001F6FF" "]+", flags=re.UNICODE)text = emoji_pattern.sub(r"", text)text = "".join([x for x in text if x not in emoji.UNICODE_EMOJI])if remove_mentions_hashtags:text = re.sub(r"@(\w+)", " ", text)text = re.sub(r"#(\w+)", " ", text)text = re.sub(r"[^\x00-\x7F]+", " ", text)regex = re.compile('[' + re.escape(string.punctuation) + '0-9\\r\\t\\n]') # remove punctuation and numbersnopunct = regex.sub(" ", text.lower())words = (''.join(nopunct)).split()if(remove_stop):words = [w for w in words if w not in ENGLISH_STOP_WORDS]words = [w for w in words if len(w) > 2]# remove a,an,of etc.if(stem_words):stemmer = PorterStemmer()words = [stemmer.stem(w) for w in words]return list(words) 字向量-它们是什么?机器学习算法只能处理固定长度的数字输入 , 即它们不能采用字符串输入来处理文本数据! 这是为什么我们需要单词向量 , 我们使用固定长度的向量表示每个单词 。然后将各个单词向量用于编码句子 。
One-hot编码:
这是编码单词的最简单方法 。它假定使用词袋表示法 , 其中每个单词都被视为一个独立的实体 , 并且单词关系被忽略(例如 , 尽管工作和职业实际上具有相同的含义 , 但它们被视为完全独立的单词) 。该方法涉及从整个语料库创建不同单词的词汇表 , 该词汇表的长度是每个单词向量的长度 。每个向量在单词向量中都有自己的指定索引 , 该索引标记为1 , 而其他索引标记为0以表示特定单词 。
例:
文章插图
这里的词汇表由9个不同的词组成 , 这些词可以被一个热编码为长度为9的向量 。 这些词向量的表示形式如下:going: [1,0,0,0,0,0,0,0,0,0], good:[ 0,1,0,0,0,0,0,0,0] , 依此类推 。
使用此表示形式 , ‘Tomorrow will be a good day’的一天的文本可以编码为:[0,1,1,0,1,1,0,1,0] 。注意单词will将被忽略 , 因为它根本不存在于词汇表中 。要使此模型正常工作 , 必须具有良好而广泛的词汇表 。还要注意在此表示形式中如何完全忽略单词关系(出现的顺序 , 语义关系) 。
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111J2V352020.html
标题:自然语言处理(NLP)入门