我正在尝试编写一个scala函数,可以从推文中生成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
}
答案 0 :(得分:6)
Scala中的元组最多只有22个。所以即使有可能它只允许n值为2..22。
我只需返回HashMultiset[Array[String]]
,您就可以使用n来定义结果:
val result = HashMultiset[Array[String]].create()
然后,您可以根据需要使用map it to tuples。
更新
如果我理解你需要什么,我会做类似
的事情def extract_ngrams(tweets:List[String], n:Int=2):Map[List[String],Int] = {
tweets.sliding(n).toList.groupBy(_.toList).mapValues(_.length)
}
答案 1 :(得分:5)
本机Scala库无法实现这一点。如果此功能对您很重要,您可以使用shapeless之类的内容。
您所描述的元组的常见超类型为Product with Serializable
,因此如果您愿意,可以返回HashMultiset[Product with Serializable]
,但您可能更好地返回{{} {1}}或HashMultiset[Seq[String]]
或HashMultiset[Map[Int, String]]
。
答案 2 :(得分:1)
我建议元组可能是错误的数据结构。案例类可以解决这个问题:
case class Data(v: String*)
def makeData(v: String*) = {
Data(v: _*)
}
val s = Set[Data]()
s += makeData("a", "b")
s += makeData("c", "d", "e")
for(i <- s) i match {
case Data(v @ _*) => println(v)
}