首页 > 解决方案 > 使用 RegexTokenizer Scala 标记每个单词仅包含字母的句子

问题描述

我正在使用带有 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;
  }

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

标签: regexscalaapache-sparktokenize

解决方案


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

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)来提取令牌。可选参数还允许使用最小长度过滤令牌。它返回一个可以为空的字符串数组。

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


推荐阅读