我可以编写一个返回n元组的scala函数,其中n由参数定义吗?

Sal*_*ley 3 scala

我正在尝试编写一个scala函数,从tweets生成n-gram.

该函数将采用两个参数,首先是字符串列表(我们要检查的推文)和一个整数n.如果我们将n设置为2(默认值),那么函数的结果将是2元组的HashMultiset,同样如果我们将其设置为3,那么结果将是3元组的HashMultiset.

有没有办法定义这样的功能?我想明确我的输入,所以我不想只是将函数定义为返回Any的MultiSet.

这是我到目前为止的存根函数,它只适用于n == 2:

def extract_ngrams(tweets:List[String], n:Int=2):HashMultiset[(String,String)] = {
val result = HashMultiset.create[(String,String)]()
result.add(("a", "a"))
result
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*kka 6

Scala中的元组最多只能达到22个.所以即使有可能它只允许n值为2..22.

我只想返回HashMultiset[Array[String]],你可以用n来定义你的结果: val result = HashMultiset[Array[String]].create()

然后,您可以根据需要将其映射到元组,具体取决于用例.

更新

如果我理解你需要什么,我会做类似的事情

def extract_ngrams(tweets:List[String], n:Int=2):Map[List[String],Int] = {
   tweets.sliding(n).toList.groupBy(_.toList).mapValues(_.length)
}
Run Code Online (Sandbox Code Playgroud)


Ben*_*ich 5

对于本机Scala库,这是不可能的.如果此功能对您很重要,您可以使用无形的东西.

你所描述的元组的常见超类型是Product with Serializable,HashMultiset[Product with Serializable]如果你愿意,你可以返回一个,但你可能更好的只是返回一个HashMultiset[Seq[String]]或HashMultiset[Map[Int, String]]或HashMultiset[Array[String]].