暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

使用PySpark在NLP中实现计数矢量器和TF-IDF

原创 eternity 2022-09-26
550

介绍

自然语言处理是企业级应用最广泛的技能之一,因为它可以处理非数字数据。正如我们所知,机器用0或1进行通信。然而,作为人类,我们用我们的母语进行通信(英语在大多数地区是第二语言),因此我们需要一种技术,通过它我们可以迭代我们的语言并使机器理解这一点。由于NLP帮助我们使用了广泛的工具,因此本文是第二篇讨论使用PySpark在NLP中使用的工具的文章。

在本文中,我们将继续讨论NLP的两个工具,它们对自然语言处理应用程序同样重要,它们是:

  • 1.TF-IDF:TF-IDF缩写为术语频率与文档频率的倒数,其目的是获取单词在语料库中的相关程度。

  • 2.计数矢量器:计数矢量器的主要目的是将字符串文档转换为矢量化标记。

因此,让我们深入研究剩下的两个NLP工具,以便在下一篇文章中,我们可以使用PySpark构建真实的NLP应用程序。

image.png

在实现上述工具之前,我们首先需要启动并启动Spark Session来维护分布式处理,同样,我们将从PySpark导入SparkSession模块。

from pyspark.sql import SparkSession

spark_nlp2 = SparkSession.builder.appName('nlp_tools_2').getOrCreate()
spark_nlp2
复制

image.png

推断:函数的层次结构用于创建PySpark会话,其中builder函数将构建PySpark可以容纳的环境,然后appName将为会话命名,get或create()将最终创建具有特定配置的Spark Session。

NLP中的TF-IDF

TF-IDF是最精巧的特征提取和刺激工具之一,它仅适用于标记化句子,即它不适用于原始句子,而只适用于标记;因此,首先,我们需要应用标记化技术(它可以是RegexTokenizer的基本标记器,也可以根据业务需求而定)。现在,当我们有了令牌,我们可以在它的基础上实现这个算法,它将返回该文档中每个令牌的重要性。请注意,这是一种特征矢量化方法,因此任何输出都只采用矢量的格式。

现在,让我们分解TF-IDF方法;这是一个两步过程:

1.术语频率(TF):顾名思义,术语频率寻找我们想要考虑的特定单词的总频率,以获得整个文档语料库中的关系。有几种方法可以执行术语频率步骤。

  • 计数:这是一个原始计数,将返回一个单词/标记在文档中出现的次数。

  • Count/Total number of words:将单词出现的总数除以语料库中的单词总数后,返回术语频率。

  • 布尔频率:它有最基本的方法来考虑术语是否发生,即,如果术语发生,则值为1;否则为0。

  • 对数标度:频率根据公式计算(log(1+原始计数))。

2.反向文档频率:虽然“频率”一词在文档语料库的另一端寻找特定单词的出现,但IDF有一项非常主观和关键的工作要做,它可以根据单词在整个文档中的常见程度和不常见程度对单词进行分类。

from pyspark.ml.feature import HashingTF, IDF, Tokenizer

sentenceData = spark_nlp2.createDataFrame([
    (0.0, "Hi I heard about Spark"),
    (0.0, "I wish Java could use case classes"),
    (1.0, "Logistic regression models are neat")
], ["label", "sentence"])

sentenceData.show(truncate=False)
复制

image.png

代码细分:

1.第一步是导入所需的库以实现TF-IDF算法,为此我们导入了HashingTf(术语频率)、IDF(反向文档频率)和Tokenizer(用于创建令牌)。

2.接下来,我们使用createDataFrame()函数创建了一个简单的数据帧,并在其中传递了索引(标签)和句子。

3.现在,我们可以使用Pyspark的show函数轻松地显示上述数据集,将truncate参数保持为False,以便整个句子都可见

tokenizer = Tokenizer(inputCol="sentence", outputCol="words")
wordsData = tokenizer.transform(sentenceData)
wordsData.show(truncate=False)
复制

image.png

代码细分:

1.如前所述,我们首先需要通过令牌化过程来使用TF-IDF。因此,创建标记器对象是为了将句子分解为标记。

2.创建标记器对象的实例后,我们需要对其进行转换,以便可以看到更改。然后在最后一步中,我们展示了“单词”列,其中句子被分解为标记。

hashingTF = HashingTF(inputCol="words", outputCol="rawFeatures", numFeatures=20)
featurizedData = hashingTF.transform(wordsData)

idf = IDF(inputCol="rawFeatures", outputCol="features")
idfModel = idf.fit(featurizedData)
rescaledData = idfModel.transform(featurizedData)

rescaledData.select("label", "features").show(truncate=False)
复制

image.png

代码细分:

在这一部分中,我们正在实现TF-IDF,因为我们已经完成了执行它所需的先决条件。

1.该过程首先为术语频率步骤创建HashingTf对象,我们在其中传递输入、输出列和总数量的特征,然后对其进行转换以在数据帧中进行更改。

2.现在是执行IDF进程的部分。首先,我们创建IDF对象,只传递输入和输出列。

3.现在我们正在拟合IDF模型,可以注意到,为此,我们首先使用拟合函数,然后在特征数据上使用变换方法(就像K-Means算法一样)。

TF-IDF的结论:在输出中,我们可以看到,从总共20个特征中,它首先指示了这些相关特征的出现([6,8,13,16]),然后向我们展示了它们之间的共同程度。

NLP中的CountVectorizer

每当我们谈论CountVectorizer时,CountVetorizeModel都会与使用此算法紧密相关。使用经过训练的模型将文本文档矢量化为原始语料库文档中的标记数。后端中的Count Vectorizer充当估计器,提取词汇表并生成模型。注意,这个特殊的概念适用于离散概率模型。

现在理论部分已经讲够了。让我们在实现相同的过程中做一些事情。

从pyspark.ml.feature导入CountVectorizer

df = spark_nlp2.createDataFrame([
    (0, "a b c".split(" ")),
    (1, "a b b c a".split(" "))
], ["id", "words"])

# fit a CountVectorizerModel from the corpus.
cv = CountVectorizer(inputCol="words", outputCol="features", vocabSize=3, minDF=2.0)

model = cv.fit(df)

result = model.transform(df)
result.show(truncate=False)
复制

image.png

代码细分:

1.首先,我们从ml.特征库导入CountVectorizer开始。

2.然后,我们将从createDataFrame函数创建虚拟数据帧。请注意,我们在这里创建的每一行都是一组具有特定ID的单词。

3.现在,作为最后一步,我们将通过将词汇大小传递为3来拟合和转换语料库中的CountVectorizerModel,以便在相同的基础上评估特征。

4.看一下输出,我们可以看到,发声和思维强调3个单词都被考虑在内。

结论

这里是本文的最后一节,我们将讨论本文中关于TF-IDF算法和CountVectorizerModel所做的一切。首先我们收集了关于每个算法的理论知识,然后进行了相同的实际实现。

1.首先,我们从一些关于NLP工具的背景信息开始,我们已经介绍了这些工具,现在我们将介绍哪些新内容。

2.然后我们转向TF-IDF模型/算法,通过对其进行分解,对其进行了深入讨论,在获得理论知识后,我们实现了相同的模型/算法并获得了预期的结果。

3.同样,我们对CountVectorizerModel也做了同样的操作,即了解它的工作原理和使用它的原因,然后实现它以获得结果。

请在LinkedIn上与我联系,以进一步讨论MLIB或其他问题。

本文中显示的媒体并非Analytics Vidhya所有,由作者自行决定使用。

原文标题:Implementing Count Vectorizer and TF-IDF in NLP using PySpark
原文作者:Aman Preet Gulati
原文链接:https://www.analyticsvidhya.com/blog/2022/09/implementing-count-vectorizer-and-tf-idf-in-nlp-using-pyspark/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论