Я хочу, чтобы заменить все биграммы, которые их отсчет частоты больше, чем порог с этим рисунком (word1.concat("-").concat(word2))
, и я пробовал:Заменить биграммы на основе их частоты в Scala и Спарк
import org.apache.spark.{SparkConf, SparkContext}
object replace {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
.setMaster("local")
.setAppName("replace")
val sc = new SparkContext(conf)
val rdd = sc.textFile("data/ddd.txt")
val threshold = 2
val searchBigram=rdd.map {
_.split('.').map { substrings =>
// Trim substrings and then tokenize on spaces
substrings.trim.split(' ').
// Remove non-alphanumeric characters and convert to lowercase
map {
_.replaceAll("""\W""", "").toLowerCase()
}.
sliding(2)
}.flatMap {
identity
}
.map {
_.mkString(" ")
}
.groupBy {
identity
}
.mapValues {
_.size
}
}.flatMap {
identity
}.reduceByKey(_ + _).collect
.sortBy(-_._2)
.takeWhile(_._2 >= threshold)
.map(x=>x._1.split(' '))
.map(x=>(x(0), x(1))).toVector
val sample1 = sc.textFile("data/ddd.txt")
val sample2 = sample1.map(s=> s.split(" ") // split on space
.sliding(2) // take continuous pairs
.map{ case Array(a, b) => (a, b) }
.map(elem => if (searchBigram.contains(elem)) (elem._1.concat("-").concat(elem._2)," ") else elem)
.map{case (e1,e2) => e1}.mkString(" "))
sample2.foreach(println)
}
}
, но этот код удалить последнее слово каждого документа и показать некоторые ошибки, когда я запускаю его в файле, содержит много документов.
Предположим, мой входной файл содержит следующие документы:
surprise heard thump opened door small seedy man clasping package wrapped.
upgrading system found review spring two thousand issue moody audio mortgage backed.
omg left gotta wrap review order asap . understand issue moody hand delivered dali lama
speak hands wear earplugs lives . listen maintain link long .
buffered lightning two thousand volts cables burned revivification place .
cables volts cables finally able hear auditory issue moody gem long rumored music .
и мой любимый выход:
surprise heard thump opened door small-man clasping package wrapped.
upgrading system found review spring two-thousand issue-moody audio mortgage backed.
omg left gotta wrap review order asap . understand issue-moody hand delivered dali lama
speak hands wear earplugs lives . listen maintain link long small-man .
buffered lightning two-thousand volts-cables burned revivification place .
cables volts-cables finally able hear auditory issue-moody gem long rumored music .
Может кто-нибудь мне помочь?
"некоторые ошибки, когда я запустить его на файл содержит много документов.". Какие ошибки? –
scala.MatchError: [Ljava.lang.String; @ 6803a136 (из класса [Ljava.lang.String;) \t при замене $$ anonfun $ 8 $$ anonfun $ применять $ 7.Apply (replace.scala: 74) \t при замене $$ anonfun $ 8 $$ anonfun $ apply $ 7.apply (replace.scala: 74) – Rozita
С какой строки вашего кода? Кроме того, этот код кажется мне (вроде) работает для меня, потому что верхние биграмы заменяются - но из-за вашего алгоритма вторая из пары все еще находится в следующей записи скользящих (2) пар, поэтому «вольт» кабели "становятся" кабелями вольт-кабелей "на выходе. Поэтому ваш подход к замещениям должен измениться. –