7
votes

Comment générer N-grammes dans Scala?

J'essaie de coder l'algorithme de presse dissocié basé sur N-gram dans Scala. Comment générer un N-gramme pour un grand fichier: Par exemple, pour le fichier contenant "l'abeille est l'abeille des abeilles".

  1. Il faut d'abord choisir un N-gramme aléatoire. Par exemple, l'abeille.
  2. alors il doit rechercher des n-grammes à partir des mots (N-1). Par exemple, abeille de.
  3. Il imprime le dernier mot de ce n-gram. Puis répète.

    Pouvez-vous me donner quelques astuces comment le faire? Désolé pour le dérangement.


3 commentaires

Je ne sais pas ce qu'est un n-gramme. Vous choisissez-vous simplement des mots au hasard? Ou a une certaine logique?


@santiagobasulto Wikipedia est votre ami: en.wikipedia.org/wiki/n-gram


Est-ce par hasard lié à Stackoverflow.com/Questions/8256830/... ?


3 Réponses :


13
votes

Vos questions pourraient être un peu plus spécifiques, mais voici mon essai.

val words = "the bee is the bee of the bees"
words.split(' ').sliding(2).foreach( p => println(p.mkString))


2 commentaires

Ce n'est pas que cela ne vous donnera que 2 grammes. Si les N-grammes sont souhaités, alors n doit être paramétré.


@tuxdna mais il peut être facilement ajusté



5
votes

Vous pouvez essayer cela avec un paramètre de N

val words = "the bee is the bee of the bees"
val w = words.split(" ")

val n = 4
val ngrams = (for( i <- 1 to n) yield w.sliding(i).map(p => p.toList)).flatMap(x => x)
ngrams foreach println

List(the)
List(bee)
List(is)
List(the)
List(bee)
List(of)
List(the)
List(bees)
List(the, bee)
List(bee, is)
List(is, the)
List(the, bee)
List(bee, of)
List(of, the)
List(the, bees)
List(the, bee, is)
List(bee, is, the)
List(is, the, bee)
List(the, bee, of)
List(bee, of, the)
List(of, the, bees)
List(the, bee, is, the)
List(bee, is, the, bee)
List(is, the, bee, of)
List(the, bee, of, the)
List(bee, of, the, bees)


0 commentaires

4
votes

Voici une approche basée sur le flux. Cela ne nécessitera pas trop de mémoire lors de l'informatique N-grammes.

List(the, bee)
List(bee, is)
List(is, the)
List(the, bee)
List(bee, of)
List(of, the)
List(the, bees)
List(the, bee, is)
List(bee, is, the)
List(is, the, bee)
List(the, bee, of)
List(bee, of, the)
List(of, the, bees)
List(the, bee, is, the)
List(bee, is, the, bee)
List(is, the, bee, of)
List(the, bee, of, the)
List(bee, of, the, bees)


2 commentaires

Je l'aime, pas sûr de l'utilité du processus . Pourquoi ne pas simplement faire ngrams (...). Foreach (x => println (x.toliste)) ?


@Mortimère: question intéressante. processus est juste une fonction supplémentaire. Nous pouvons absolument utiliser ngrams2 foreach {x => println (x.tolist)} . Merci :-)