【问题标题】:Scala split a 2 words which aren't seperatedScala拆分了两个未分隔的单词
【发布时间】:2021-03-31 10:20:04
【问题描述】:

我有一个带有applefruit 之类的词的语料库,它没有被我想做的任何分隔符分隔。因为这可能是一个非线性问题。我想仅在字典中的单词是语料库中单词的子字符串时才传递自定义字典进行拆分。

如果我的词典只有apple 和语料库中的三个单词aaplefruitapplebananafruitbananafruit。输出应该类似于 apple , fruit apple, bananafruit, bananafruit

请注意,我没有拆分 bananafruit,目标是通过仅拆分字典中提供的文本来加快处理速度。我正在使用 scala 2.x。

【问题讨论】:

  • 您能描述一些要实现的逻辑目标吗?因为我并没有真正理解为什么预期的输出是:apple , fruit apple, bananafruit, bananafruit - 你想用apple 世界分割每个令牌还是将其作为前缀删除?还是别的什么?
  • @IvanKurchenko 我有一些行要拆分成单词以供进一步分析,但是由于文本不干净,我得到了像 badapple 这样的词,即加入了 2 个词,我希望能得到一些东西把这个分成两部分。这显然会帮助我在单词层面上做的任何分析。我想通过字典来查看的原因是因为数据量很大,它可以减少运行时间。

标签: scala text data-preprocessing


【解决方案1】:

您可以使用带有拆分的正则表达式:

scala> "foobarfoobazfoofoobatbat".split("(?<=foo)|(?=foo)")
res27: Array[String] = Array(foo, bar, foo, baz, foo, foo, batbat)

或者如果您的字典(和/或要拆分的字符串)包含多个单词...

   val rx = wordList.map { w => s"(?<=$w)|(?=$w)" }.mkString("|")
   val result: List[String] = toSplit.flatMap(_.split(rx))

【讨论】:

  • 是的,这是我将拥有一本大字典的问题之一。所以可能需要相当长的时间。
【解决方案2】:

您可以按照以下模式进行正则表达式查找和替换:

(?=apple)|(?<=apple)

然后用逗号替换,两边都用空格包围。我们可以试试:

val input = "bananaapplefruit"
val output = input.replaceAll("(?=apple)|(?<=apple)", " , ")
println(output)  // banana , apple , fruit

【讨论】:

    猜你喜欢
    • 2011-12-30
    • 2012-10-09
    • 2020-03-15
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    • 2021-09-07
    相关资源
    最近更新 更多