热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

特征提取技术–自然语言处理

特征提取技术–自然语言处理原文:https://www.ge

特征提取技术–自然语言处理

原文:https://www . geesforgeks . org/feature-extraction-technologies-NLP/

本文主要研究自然语言处理中的基本特征提取技术,分析文本之间的相似性。自然语言处理是计算机科学和机器学习的一个分支,处理训练计算机处理大量人类(自然)语言数据。简而言之,自然语言处理是计算机理解人类语言的能力。

需要特征提取技术
机器学习算法从训练数据的一组预定义特征中学习,以产生测试数据的输出。但是使用语言处理的主要问题是机器学习算法不能直接在原始文本上工作。因此,我们需要一些特征提取技术来将文本转换成特征矩阵(或向量)。
一些最流行的特征提取方法有:


  • 单词包

  • TF-以色列国防军

单词包:
单词包是将令牌转换为一组特征的最基本方法之一。BoW 模型用于文档分类,其中每个单词都被用作训练分类器的特征。
例如,在基于评论的情感分析任务中,出现像‘难以置信’‘优秀’这样的词表示正面评论,而像‘讨厌’‘差’这样的词表示负面评论。
创建 BoW 模型有 3 个步骤:


  1. 第一步是文本预处理,包括:

    1. 将整个文本转换为小写字符。

    2. 删除所有标点符号和不必要的符号。



  2. The second step is to create a vocabulary of all unique words from the corpus. Let’s suppose, we have a hotel review text.
    Let’s consider 3 of these reviews, which are as follows :



    1. Good movie

    2. Not a good movie.

    3. Sure enough, it doesn't look like


    现在,我们考虑来自上述评论集的所有独特单词来创建一个词汇表,如下所示:

    {好,电影,不是,a,做了,喜欢}



  3. 在第三步中,我们通过为每个单词分配一个单独的列来创建一个特征矩阵,而每行对应一个评论。这个过程被称为文本矢量化。矩阵中的每个条目表示该单词在评论中的存在(或不存在)。如果单词出现在评论中,我们放 1 ,如果单词不出现,我们放 0


对于上面的例子,特征矩阵如下:






































好的电影a喜欢
11ZeroZeroZeroZero
1111ZeroZero
ZeroZero1Zero11

使用这个模型的一个主要缺点是单词出现的顺序丢失了,因为我们以随机的顺序创建了一个标记向量。但是,我们可以通过考虑 N-grams (大部分是二元图)来解决这个问题,而不是考虑单个单词(即单个图)。这可以保持单词的本地排序。如果我们从给定的评论中考虑所有可能的二元模型,上表将如下所示:


































好电影电影a
11ZeroZero
11Zero1
ZeroZero1Zero

然而,这个表会非常大,因为通过考虑所有可能的连续单词对,可能会有很多可能的二元模型。还有,使用 N-gram 会产生一个巨大的稀疏的(有很多 0)矩阵,如果词汇量大的话,使得计算真的很复杂!!
因此,我们必须根据它们的频率去除一些氮克。就像,我们总是可以去掉高频 N 克,因为它们几乎出现在所有的文档中。这些高频 N 克一般是冠词、限定词等。最常被称为 StopWords
同样,我们也可以去掉低频 N 克,因为这些真的很少见(即一般出现在 1、2 篇评论中)!!这些类型的 N-gram 一般都是错别字(或打字错误)。
一般认为中频 N 克最理想。
然而,有一些 N-gram 在我们的语料库中确实很少见,但可以突出某个特定的问题。
假设有一篇评论说–“Wi-Fi 经常断”。

在这里,N-gram 的 Wi-Fi 中断不能太频繁,但它凸显了一个需要关注的主要问题。
我们的 BoW 模型无法捕获这样的 N 克,因为它的频率非常低。为了解决这类问题,我们需要另一个模型,即 TF-IDF 矢量器,我们接下来将研究它。
代码:创建 BoW 模型的 Python 代码是:

# Creating the Bag of Words model 
word2count = {} 
for data in dataset: 
    words = nltk.word_tokenize(data) 
    for word in words: 
        if word not in word2count.keys(): 
            word2count[word] = 1
        else: 
            word2count[word] += 1

TF-IDF 矢量器:
TF-IDF 代表术语频率-逆文档频率。它强调了一个特定的问题,这个问题在我们的语料库中可能不太常见,但非常重要。TF–IFD 值随着单词在文档中出现的次数成比例增加,随着语料库中包含该单词的文档数量减少。它由两个子部分组成,分别是:


  1. 术语频率

  2. 反向文档频率

术语频率(TF) :
术语频率指定术语在整个文档中出现的频率。它可以被认为是在文档中找到一个单词的概率。它计算单词w_i在评论r_j中出现的次数,相对于评论r_j中的单词总数。其表述如下:

[tf(w_i, r_j)=\frac{No.\, of \, times \, w_i \, occurs \, in \, r_j}{Total \, no. \, of \, words \, in \, r_j}]

计算 tf 的不同方案是对数归一化。它被表述为:

[tf(t, d)=1 + \log{(f_{t, d})}]

其中,
f_{t, D}是文档 d 中术语 t 的出现频率。

反向文档频率(IDF) :
反向文档频率是对一个术语在整个语料库的文档中是稀有还是频繁的度量。它突出了那些出现在语料库中非常少的文档中的单词,或者用简单的语言来说,那些罕见的单词具有很高的 IDF 分数。IDF 是一个对数归一化值,它是通过将语料库中的文档总数D除以包含术语t的文档数,并取整个术语的对数而获得的。

[idf(d, D)=\log{\frac{|D|}{{d \epsilon D:t \epsilon D}}}]

其中,
f_{t, D}是单词 t 在文档 d 中出现的频率。
|D|是语料库中的文档总数。
{d \epsilon D:t \epsilon D}是语料库中文档的计数,其中包含术语 t。

由于 IDF 的对数函数中的比值必须始终大于或等于 1,因此 IDF(以及 TF–IDF)的值大于或等于 0。当一个术语出现在大量文档中时,对数内的比值接近 1,IDF 更接近 0。

术语频率-逆文档频率(TF-IDF)
TF-IDF 是 TF 和 IDF 的乘积。其表述如下:

[tfidf(t, d, D) = tf(t, d)*idf(d, D)]

高 TF-IDF 分数是通过在文档中具有高频率而在语料库中具有低文档频率的术语获得的。对于出现在几乎所有文档中的一个词,IDF 值接近 0,使得 tf-idf 也更接近 0。当 IDF 和 TF 值都很高时,TF-IDF 值很高,即该词在整个文档中很少见,但在文档中却很常见。

让我们举同一个例子来更好地理解这一点:



  1. Good movie

  2. Not a good movie.

  3. Sure enough, it doesn't look like


在这个例子中,每个句子都是一个单独的文档。

考虑到二元模型,我们计算每个二元模型的 TF-IDF 值:






























好电影电影
好电影1*log(3/2) = 0.171*log(3/2) = 0.170*log(3/1) = 0
不是好电影1*log(3/2) = 0.171*log(3/2) = 0.170*log(3/1) = 0
不喜欢0*log(3/2) = 00*log(3/2) = 01*log(3/1) = 0.47

在这里,我们观察到,与其他标记相比,bigram 没有是罕见的(即仅出现在一个文档中),因此具有更高的 tf-idf 分数。

代码:使用 python 内置函数 TfidfVectorizer 计算任意语料库的 tf-idf 评分

# calculating tf-idf values
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
texts = {
"good movie", "not a good movie", "did not like"
}
tfidf = TfidfVectorizer(min_df = 2, max_df = 0.5, ngram_range = (1, 2))
features = tfidf.fit_transform(texts)
pd.Dataframe{
     features.todense(),
     columns = tfidf.get_feature_names()
}

最后,我们可以说,尽管词袋是特征提取和文本矢量化中最基本的方法之一,但它无法捕捉文本中的某些问题。然而,这个问题是由 TF-IDF Vectorizer 解决的,这也是一种特征提取方法,它捕获了一些在整个语料库中不太频繁出现的主要问题。


推荐阅读
  • 探索聚类分析中的K-Means与DBSCAN算法及其应用
    聚类分析是一种用于解决样本或特征分类问题的统计分析方法,也是数据挖掘领域的重要算法之一。本文主要探讨了K-Means和DBSCAN两种聚类算法的原理及其应用场景。K-Means算法通过迭代优化簇中心来实现数据点的划分,适用于球形分布的数据集;而DBSCAN算法则基于密度进行聚类,能够有效识别任意形状的簇,并且对噪声数据具有较好的鲁棒性。通过对这两种算法的对比分析,本文旨在为实际应用中选择合适的聚类方法提供参考。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
  • 技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告
    技术日志:使用 Ruby 爬虫抓取拉勾网职位数据并生成词云分析报告 ... [详细]
  • 本课程深入探讨了 Python 中自定义序列类的实现方法,涵盖从基础概念到高级技巧的全面解析。通过实例演示,学员将掌握如何创建支持切片操作的自定义序列对象,并了解 `bisect` 模块在序列处理中的应用。适合希望提升 Python 编程技能的中高级开发者。 ... [详细]
  • 基于OpenCV的图像拼接技术实践与示例代码解析
    图像拼接技术在全景摄影中具有广泛应用,如手机全景拍摄功能,通过将多张照片根据其关联信息合成为一张完整图像。本文详细探讨了使用Python和OpenCV库实现图像拼接的具体方法,并提供了示例代码解析,帮助读者深入理解该技术的实现过程。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • Unity3D 中 AsyncOperation 实现异步场景加载及进度显示优化技巧
    在Unity3D中,通过使用`AsyncOperation`可以实现高效的异步场景加载,并结合进度条显示来提升用户体验。本文详细介绍了如何利用`AsyncOperation`进行异步加载,并提供了优化技巧,包括进度条的动态更新和加载过程中的性能优化方法。此外,还探讨了如何处理加载过程中可能出现的异常情况,确保加载过程的稳定性和可靠性。 ... [详细]
  • 提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射)
    提升视觉效果:Unity3D中的HDR与Bloom技术(高动态范围成像与光线散射) ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 分享一款基于Java开发的经典贪吃蛇游戏实现
    本文介绍了一款使用Java语言开发的经典贪吃蛇游戏的实现。游戏主要由两个核心类组成:`GameFrame` 和 `GamePanel`。`GameFrame` 类负责设置游戏窗口的标题、关闭按钮以及是否允许调整窗口大小,并初始化数据模型以支持绘制操作。`GamePanel` 类则负责管理游戏中的蛇和苹果的逻辑与渲染,确保游戏的流畅运行和良好的用户体验。 ... [详细]
  • 每年,意甲、德甲、英超和西甲等各大足球联赛的赛程表都是球迷们关注的焦点。本文通过 Python 编程实现了一种生成赛程表的方法,该方法基于蛇形环算法。具体而言,将所有球队排列成两列的环形结构,左侧球队对阵右侧球队,首支队伍固定不动,其余队伍按顺时针方向循环移动,从而确保每场比赛不重复。此算法不仅高效,而且易于实现,为赛程安排提供了可靠的解决方案。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 【图像分类实战】利用DenseNet在PyTorch中实现秃头识别
    本文详细介绍了如何使用DenseNet模型在PyTorch框架下实现秃头识别。首先,文章概述了项目所需的库和全局参数设置。接着,对图像进行预处理并读取数据集。随后,构建并配置DenseNet模型,设置训练和验证流程。最后,通过测试阶段验证模型性能,并提供了完整的代码实现。本文不仅涵盖了技术细节,还提供了实用的操作指南,适合初学者和有经验的研究人员参考。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
author-avatar
津pig
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有