/ / Ordne das Wort ngrams zu, das in scala zählt - scala, nlp, n-gram

Kartenwort-Ngrams zu Zählungen in Scala - Scala, Nlp, N-Gramm

Ich versuche, eine Karte zu erstellen, die alle durchläuftdie ngrams in einem Dokument und zählt, wie oft sie erscheinen. Ngramme sind Sätze von n aufeinanderfolgenden Wörtern in einem Satz (so ist im letzten Satz (Ngramme sind) ein 2-Gramm (sind Sätze) das nächste 2-Gramm und so weiter). Ich habe bereits Code, der ein Dokument aus einer Datei erstellt und in Sätze zerlegt. Ich habe auch eine Funktion zum Zählen der Ngramme in einem Satz, ngramsInSentence, der Seq [Ngram] zurückgibt.

Ich bin immer syntaktisch auf, wie man erstelltMeine Zählkarte. Ich durchlaufe alle ngrams im Dokument in der for-Schleife, weiß aber nicht, wie ich die ngrams der Anzahl ihrer Häufigkeit zuordnen soll. Ich bin ziemlich neu in Scala und die Syntax weicht mir aus, obwohl ich "Mir ist konzeptionell klar, was ich brauche!

def getNGramCounts(document: Document, n: Int): Counts = {
for (sentence <- document.sentences; ngram <- nGramsInSentence(sentence,n))
//I need code here to map ngram -> count how many times ngram appears in document
}

Der oben genannte Typ Counts sowie Ngram sind wie folgt definiert:

type Counts = Map[NGram, Double]
type NGram = Seq[String]

Kennt jemand die Syntax zum Zuordnen der Ngramme aus der for-Schleife, um zu zählen, wie oft sie auftreten? Bitte lassen Sie mich wissen, wenn Sie weitere Informationen zu dem Problem wünschen.

Antworten:

2 für die Antwort № 1

Wenn ich Ihren Code richtig interpretiere, ist dies eine ziemlich häufige Aufgabe.

def getNGramCounts(document: Document, n: Int): Counts = {
val allNGrams: Seq[NGram] = for {
sentence <- document.sentences
ngram <- nGramsInSentence(sentence, n)
} yield ngram

allNgrams.groupBy(identity).mapValues(_.size.toDouble)
}

Das allNGrams Variable sammelt eine Liste aller NGrams, die im Dokument erscheinen.
Sie sollten sich irgendwann wenden an Streams Wenn das Dokument groß ist und Sie nicht die gesamte Sequenz speichern können.

Folgende groupByerstellt ein Map[NGram, List[NGram]] welche gruppiert Ihre Werte nach ihrer Identität (das Argument der Methode definiert die Kriterien für die "aggregierte Identifikation") und gruppiert die entsprechenden Werte in einer Liste.

Sie müssen dann nur noch die Werte zuordnen (die List[NGram]) zu seiner size um zu ermitteln, wie viele wiederkehrende Werte es von jedem gab NGram.


Ich nahm an, dass:

  1. NGram hat die erwartete korrekte Implementierung von equals + hashcode
  2. document.sentences gibt a zurück Seq[...]. Wenn nicht, sollten Sie damit rechnen allNGrams von der entsprechenden Sammlungsart sein.

AKTUALISIERT basierend auf den Kommentaren

Ich habe fälschlicherweise angenommen, dass die groupBy(_) würde den Eingabewert verkürzen. Verwenden Sie die identity Funktion stattdessen.

Ich habe die Zählung in a umgewandelt Double


0 für die Antwort № 2

Schätzen Sie die Hilfe - ich habe jetzt den richtigen Code mit den obigen Vorschlägen. Folgendes gibt das gewünschte Ergebnis zurück:

def getNGramCounts(document: Document, n: Int): Counts = {
val allNGrams: Seq[NGram] = (for(sentence <- document.sentences;
ngram <- ngramsInSentence(sentence,n))
yield ngram)
allNGrams.groupBy(l => l).map(t => (t._1, t._2.length.toDouble))
}