如何使用apache spark通过列表对文本中的特定单词进行去标识化?

Posted

技术标签:

【中文标题】如何使用apache spark通过列表对文本中的特定单词进行去标识化?【英文标题】:How to de-identify specific words in the text by list using apache spark? 【发布时间】:2017-08-02 04:06:32 【问题描述】:

我想识别那些包含特定单词的句子。 正如您将在我的代码中看到的那样,我已经定义了一些术语和句子。我想打印所有具有这些定义术语的句子。

****这是我的代码:****

import scala.math.random
import org.apache.spark._
object Clasifying 

def main(args: Array[String]) 
val conf = new SparkConf().setAppName("Classification")
.setMaster("local")

val sc = new SparkContext(conf)

val terms = Array("this", "is", "my", "pen")

val sentences = Array("this Date is mine", 
                  "is there something", 
                  "there are big dogs",
                  "The Date is mine", 
                  "there may be something", 
                  "where are pen", 
                  "there is a dog",
                  "there are big cats",
                  "I am not able to to do it")

val rdd = sc.parallelize(sentences) // create RDD
val keys = terms.toSet            // words required as keys.

val result = rdd.flatMap sen => 
                val words = sen.split(" ").toSet; 
                val common = keys & words;       // intersect
                common.map(x => (x, sen))        // map as key -> sen
            
            .groupByKey.mapValues(_.toArray)     // group values for a key
            .collect

println("*********************************")
result.foreach(println)
println("*********************************")
sc.stop()
 

我的代码给出的结果为:

*********************************
(pen,[Ljava.lang.String;@4cc76301)
(this,[Ljava.lang.String;@2f08c4b)
(is,[Ljava.lang.String;@3f19b8b3)
*********************************

虽然我想要这样的结果:

 *********************************
 this, is,(this Date is mine)
 is,(is there something)
 is,(the Date is mine)
 is,(is there something)
 pen,where are pen)
 *********************************

在此先感谢,因为我是 spark 和 stack Overflow 的新手,所以请原谅我的错误并随时编辑我的问题。

我还想要一件事,如果不是定义简单的术语和句子,而是使用一些真实的 terms.txt 文件和 ducoment.txt 来表示句子,该怎么办?这种饱和的代码将如何?

【问题讨论】:

【参考方案1】:

这主要取决于文档的大小和单词表的大小。

如果您能够将完整的单词表保存在内存中,并将完整的文档保存在每个容器中,那么您可以通过仅使用地图的 UDF 轻松完成。 如果没有,那么您可以先收集每个文档中的所有单词,然后将它们与您的单词表连接起来,以使单词“匿名化”。

注意不要烫伤自己 :D

【讨论】:

两个文档的大小会很钝

以上是关于如何使用apache spark通过列表对文本中的特定单词进行去标识化?的主要内容,如果未能解决你的问题,请参考以下文章

Apache Spark 如何保留输出文本文件中的行顺序?

使用 Apache Spark 将键值对缩减为键列表对

使用Apache Spark 对 mysql 调优 查询速度提升10倍以上

如何使用 Scala 从 Spark 中的列表或数组创建行

如何使用 Java API 将文本文件、图像存储到 Apache Spark 中?

Apache Spark 如何将新列从列表/数组附加到 Spark 数据帧