36 Python 时序和文本:中文文本处理入门:为什么要先做分词和停用词过滤?
中文文本处理入门为什么要先做分词和停用词过滤刚接触文本分析时很多人都会有一个疑问文本明明已经有内容了为什么不能直接拿去做分类、聚类或者情感分析这个问题其实正好指向了文本挖掘里最基础、也最关键的一步文本预处理。文本挖掘通常包括文本预处理、文本挖掘和模式评估与表示三个主要过程 。如果预处理没有做好后面的分析效果往往会受到明显影响。这篇文章主要回答两个问题为什么中文文本通常要先分词为什么分词之后还要做停用词过滤下面就从这两个问题开始。一、为什么文本不能直接分析从人的角度看一段文本的意思通常很容易理解。比如下面几条评论这个电影真的很好看我很喜欢剧情太拖沓了不推荐演员表现不错但是节奏一般画面很棒音乐也很好听人很容易看出它们在表达什么但计算机并不能直接做到这一点。因为对计算机来说原始文本最开始只是一串字符它并不知道哪些字应该组合成一个词哪些词更重要哪些词只是语气词或结构词哪些词真正能帮助区分文本内容而文本挖掘的目标是从大量文本数据中抽取未知但有用的知识。由于文本数据具有模糊性、非结构化等特点所以文本挖掘本身就是一项相对复杂的工作 。这也是为什么文本不能直接“原样进入模型”而需要先经过预处理。二、文本预处理在做什么文本预处理的作用可以简单理解为先把原始文本整理成计算机更容易处理的形式。在文本挖掘流程中文本预处理的任务是选取与任务相关的文本并将其转化成文本挖掘工具可以处理的中间形式 。对于中文文本来说这里面最基础的两步通常就是分词停用词过滤这两步看起来简单但后面的很多工作都建立在它们之上。三、为什么中文文本通常要先分词这个问题和中文本身的表达方式有关。英文文本通常有空格例如This movie is very good至少可以先按空格切开。但中文通常是连续书写的例如这个电影真的很好看我很喜欢对计算机来说它并不知道应该切成这个 / 电影 / 真的 / 很 / 好看 / 我 / 很 / 喜欢还是别的形式。在中文文本处理中一般认为词语是最小的语义单元。一句话可以由多个词语组成而词语又可以由一个或多个汉字组成。因此在进行文本分类等任务之前首先要把文本切分成计算机可以处理的语义单元 。也正因为如此和英文相比中文文本预处理更重要也更复杂。四、什么是分词分词就是把连续的中文文本切分成一个个词语。比如下面这句话这个电影真的很好看我很喜欢分词之后可能会得到这样的结果这个 / 电影 / 真的 / 很 / 好看 / 我 / 很 / 喜欢分词的意义在于把整句文本拆成更小的语义单元为后续的统计分析提供基础为特征提取和建模做准备如果不先分词后续很多文本分析工作很难展开。五、分词之后为什么还不够分词做完之后文本确实从“句子”变成了“词语集合”但这还不等于已经可以直接做分析。原因在于词出现得多并不等于它就更有价值。在你提供的课件中也提到文本中的词并不是出现频率越高代表性就越强 。例如下面这些词的了啊唉它们可能在很多文本里都频繁出现但对于表达主题帮助很小。这些词既不能很好地区分不同文本也很难帮助模型判断文本内容。所以分词之后还需要继续做一步处理停用词过滤。六、什么是停用词如果一个词在文档中出现得很频繁但并不能帮助表达主题比如“的”“啊”“唉”这类词那么这些词对区分文档是没有意义的这类词就叫做停用词Stop Word。停用词通常有几个特点出现频率高信息量低对文本分类、聚类、关键词提取等任务帮助不大因此通常需要把这些词从原始文本中去掉这个过程就叫做停用词过滤。七、为什么要做停用词过滤停用词过滤的目的核心上是为了减少噪声让文本中更有价值的信息更容易保留下来。可以从几个角度来理解。1. 停用词会干扰统计结果如果不做过滤词频统计里排在前面的往往会是“的”“了”“我”“也”这一类词。这些词虽然常见但通常不能代表文本主题。2. 停用词会降低区分度如果我们要判断一段文本是正面评价还是负面评价那么像“的”“了”这种词在两类文本里都可能大量出现它们并不能帮助分类。3. 停用词会影响后续特征提取后面做词袋模型、TF-IDF 或文本分类时如果保留了太多停用词就会引入很多低价值特征影响分析效果 。所以停用词过滤并不是“可有可无的小优化”而是文本预处理中很常见、也很必要的一步 。八、停用词一般怎么过滤常见有两种方式。方法 1按词频比例过滤统计每个词在整个文档集中的出现情况如果某个词出现得过于频繁比如超过文档总量的一定比例例如 80%就把它视为停用词 。这种方法的特点是可以结合当前语料自动判断高频词但阈值设置有一定经验性也可能误删一些高频但其实有用的词方法 2使用停用词表另一种更常见的方法是提前准备一个停用词表凡是出现在表里的词都过滤掉 。常见停用词表包括哈工大停用词表四川大学机器学习智能实验室停用词库百度停用词表对于入门练习和一般课程实验来说通常直接使用停用词表会更方便。九、代码演示中文分词与停用词过滤下面用一个简单示例把“分词 停用词过滤”的流程完整跑一遍。十、准备示例文本先准备几条电影评论文本texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]十一、安装并导入依赖库如果本地还没有安装jieba先执行pipinstalljieba然后导入importjiebafromcollectionsimportCounter十二、第一步对文本进行分词texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]segmented_texts[]fortextintexts:wordsjieba.lcut(text)segmented_texts.append(words)fori,wordsinenumerate(segmented_texts,1):print(f文本{i}分词结果{words})运行后不同环境下分词结果可能略有差异但大体上会得到一组词语序列。十三、第二步准备停用词表为了方便演示这里手工定义一个小型停用词表。实际项目中也可以换成外部停用词文件。stopwords{的,了,我,也,很,太,这部,这个,,。,,,是,在,不,得,看得}这里要提醒一点停用词表不是绝对固定的。比如做情感分析时“不”有时就很重要不一定适合直接删除。十四、第三步进行停用词过滤filtered_texts[]forwordsinsegmented_texts:filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]filtered_texts.append(filtered_words)fori,wordsinenumerate(filtered_texts,1):print(f文本{i}过滤后结果{words})过滤之后保留下来的词通常会更接近文本真正想表达的内容。十五、过滤前后做一个对比把原文本、分词结果和过滤后结果放在一起看会更直观。foriinrange(len(texts)):print(f\n 文本{i1})print(原文本,texts[i])print(分词结果,segmented_texts[i])print(过滤后,filtered_texts[i])你会看到过滤后留下来的词往往更有分析价值比如电影好看喜欢演员演技剧情拖沓睡觉推荐音乐无聊浪费时间相比之下“的、了、我、很”这类词就没有那么重要。十六、统计高频词看看过滤效果为了更直观地看到停用词过滤的作用可以分别统计过滤前和过滤后的高频词。1. 统计过滤前高频词all_words_before[]forwordsinsegmented_texts:all_words_before.extend([wforwinwordsifw.strip()])counter_beforeCounter(all_words_before)print( 过滤前高频词 )forword,countincounter_before.most_common(15):print(f{word}:{count})2. 统计过滤后高频词all_words_after[]forwordsinfiltered_texts:all_words_after.extend(words)counter_afterCounter(all_words_after)print(\n 过滤后高频词 )forword,countincounter_after.most_common(15):print(f{word}:{count})一般情况下过滤前高频词里会出现很多标点和功能词过滤之后留下来的词会更接近文本主题。这也正好说明了一个很重要的结论词频高不代表词就更有代表性。十七、完整可运行代码下面是一份可以直接复制运行的完整代码。importjiebafromcollectionsimportCounter# 1. 原始文本texts[这个电影真的很好看我很喜欢演员演技也不错。,剧情太拖沓了看得我想睡觉不推荐。,画面非常漂亮但是故事比较一般。,音乐很好听节奏也不错整体体验很好。,这部电影太无聊了浪费时间。]# 2. 停用词表演示版stopwords{的,了,我,也,很,太,这部,这个,,。,,,是,在,不,得,看得}# 3. 分词segmented_texts[]fortextintexts:wordsjieba.lcut(text)segmented_texts.append(words)# 4. 停用词过滤filtered_texts[]forwordsinsegmented_texts:filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]filtered_texts.append(filtered_words)# 5. 输出对比结果foriinrange(len(texts)):print(f\n 文本{i1})print(原文本,texts[i])print(分词结果,segmented_texts[i])print(过滤后,filtered_texts[i])# 6. 统计过滤前高频词all_words_before[]forwordsinsegmented_texts:all_words_before.extend([wforwinwordsifw.strip()])counter_beforeCounter(all_words_before)print(\n 过滤前高频词 )forword,countincounter_before.most_common(15):print(f{word}:{count})# 7. 统计过滤后高频词all_words_after[]forwordsinfiltered_texts:all_words_after.extend(words)counter_afterCounter(all_words_after)print(\n 过滤后高频词 )forword,countincounter_after.most_common(15):print(f{word}:{count})输出Building prefix dict from the default dictionary ... Loading model from cache C:\Users\35979\AppData\Local\Temp\jieba.cache Loading model cost 0.603 seconds. Prefix dict has been built successfully. 文本1 原文本 这个电影真的很好看我很喜欢演员演技也不错。 分词结果 [这个, 电影, 真的, 很, 好看, , 我, 很, 喜欢, , 演员, 演技, 也, 不错, 。] 过滤后 [电影, 真的, 好看, 喜欢, 演员, 演技, 不错] 文本2 原文本 剧情太拖沓了看得我想睡觉不推荐。 分词结果 [剧情, 太, 拖沓, 了, , 看得, 我, 想, 睡觉, , 不, 推荐, 。] 过滤后 [剧情, 拖沓, 想, 睡觉, 推荐] 文本3 原文本 画面非常漂亮但是故事比较一般。 分词结果 [画面, 非常, 漂亮, , 但是, 故事, 比较, 一般, 。] 过滤后 [画面, 非常, 漂亮, 但是, 故事, 比较, 一般] 文本4 原文本 音乐很好听节奏也不错整体体验很好。 分词结果 [音乐, 很, 好听, , 节奏, 也, 不错, , 整体, 体验, 很, 好, 。] 过滤后 [音乐, 好听, 节奏, 不错, 整体, 体验, 好] 文本5 原文本 这部电影太无聊了浪费时间。 分词结果 [这部, 电影, 太, 无聊, 了, , 浪费时间, 。] 过滤后 [电影, 无聊, 浪费时间] 过滤前高频词 : 8 。: 5 很: 4 电影: 2 我: 2 也: 2 不错: 2 太: 2 了: 2 这个: 1 真的: 1 好看: 1 喜欢: 1 演员: 1 演技: 1 过滤后高频词 电影: 2 不错: 2 真的: 1 好看: 1 喜欢: 1 演员: 1 演技: 1 剧情: 1 拖沓: 1 想: 1 睡觉: 1 推荐: 1 画面: 1 非常: 1 漂亮: 1十八、如果要读取外部停用词表如果你已经准备好了stopwords.txt文件也可以这样写importjieba# 读取停用词表withopen(stopwords.txt,r,encodingutf-8)asf:stopwordsset(line.strip()forlineinf)text这个电影真的很好看我很喜欢演员演技也不错。wordsjieba.lcut(text)filtered_words[wordforwordinwordsifwordnotinstopwordsandword.strip()]print(分词结果,words)print(过滤结果,filtered_words)这种方式更适合后续扩展到更大的文本集。十九、几个容易忽略的问题1. 词频高不一定就重要这是文本处理中很常见的误区。出现得多只能说明它常见不代表它真的有区分能力 。2. 停用词表不是固定不变的不同任务中停用词可能不同。某些词在一个任务里没用在另一个任务里可能很重要。3. 分词不是文本预处理的全部分词和停用词过滤只是开始。后面通常还会继续做文本表征比如词袋模型或 TF-IDF把词变成算法可以处理的数值形式 。二十、课后思考可以试着想一想下面几个问题如果我要做“好评 / 差评”分类停用词表能不能直接照搬“不”这个词在情感分析中到底该不该删如果文本换成新闻标题而不是电影评论停用词会不会发生变化如果完全不做停用词过滤后面的特征提取会受到什么影响二十一、小结这篇文章主要讲了两件事。第一为什么中文文本通常要先分词。因为中文没有天然空格而词语通常被看作最小语义单元所以分词是文本处理的基础 。第二为什么分词之后还要做停用词过滤。因为文本中的词并不是出现频率越高就越重要那些高频但对表达主题帮助不大的词需要在预处理阶段先过滤掉 。可以把这一步简单理解成分词把文本拆开停用词过滤把噪声去掉这两步处理之后文本才更适合进入后续的特征提取和建模流程。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452622.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!