【问题标题】:Tokenize a sentence where each word contains only letters using RegexTokenizer Scala使用 RegexTokenizer Scala 标记每个单词仅包含字母的句子
【发布时间】:2023-03-26 07:23:01
【问题描述】:

我正在使用带有 scala 的 spark 并尝试标记一个句子,其中每个单词只能包含字母。这是我的代码

def tokenization(extractedText: String): DataFrame = {

    val existingSparkSession = SparkSession.builder().getOrCreate()
    val textDataFrame = existingSparkSession.createDataFrame(Seq(
      (0, extractedText))).toDF("id", "sentence")
    val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
    val regexTokenizer = new RegexTokenizer()
      .setInputCol("sentence")
      .setOutputCol("words")
      .setPattern("\\W")
    val regexTokenized = regexTokenizer.transform(textDataFrame)
    regexTokenized.select("sentence", "words").show(false)
    return regexTokenized;
  }

如果我在标记化后提供句子为“我要去上学5”,它应该只有 [i, am, going, to] 并且应该放弃 school5。但是以我目前的模式,它不会忽略单词中的数字。我应该如何删除带数字的单词?

【问题讨论】:

    标签: regex scala apache-spark tokenize


    【解决方案1】:

    您可以使用以下设置来获得所需的标记化。本质上,您使用适当的正则表达式模式提取仅包含字母的单词。

    val regexTokenizer = new RegexTokenizer().setInputCol("sentence").setOutputCol("words").setGaps(false).setPattern("\\b[a-zA-Z]+\\b")
    
    val regexTokenized = regexTokenizer.transform(textDataFrame)
    
    regexTokenized.show(false)
    +---+---------------------+------------------+
    |id |sentence             |words             |
    +---+---------------------+------------------+
    |0  |I am going to school5|[i, am, going, to]|
    +---+---------------------+------------------+
    

    关于我将gaps 设置为false 的原因,请参阅文档:

    一个基于正则表达式的分词器,通过使用提供的正则表达式模式(Java 方言)来拆分文本(默认)或重复匹配正则表达式(如果 gaps 为 false)来提取令牌。可选参数还允许使用最小长度过滤令牌。它返回一个可以为空的字符串数组。

    您希望重复匹配正则表达式,而不是按给定的正则表达式拆分文本。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2015-08-16
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2016-04-26
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多