Ein in der [Künstlichen Intelligenz] lange verfolgtes Ziel ist die natürlichsprachliche Kommunikation zwischen Mensch und Maschine. Bislang ist kein Computer-Programm bekannt, mit dem eine Kommunikation auf höherem Niveau durchgeführt werden könnte. !Abstrakt Unser Ansatz zur maschinellen Sprachverarbeitung besteht in Analyse und Synthese von Sequenzen von Symbolen. Basis ist die Wahrscheinlichkeit, mit der eine Kombination von Symbolen auftritt. Darauf setzt die Wahrscheinlichkeit auf, mit der eine Kombination von Kombinationen auftritt. Folge ist eine Hierarchie von Kombinationen zur Beschreibung der Semantik der Sprache. !Kombination von Symbolen Basis unserer Sprachverarbeitung ist die Kombination von Symbolen. Die Wahrscheinlichkeit, dass die Symbole A und B gemeinsam auftreten ist hypergeometrisch verteilt. Gegeben sei eine Sequenz von n Symbolen vor, in der Symbol A mit der Zahl nA und Symbol B mit der Zahl nB und die Kombination AB mit der Zahl nAB auftritt. Die Wahrscheinlichkeit, dass dies zufällig passiert ist genau hypergeom(n, nA, nB, nAB). {{{ public static double hypergeometricF(int n, int nA, int nB, int nAB) { double p = 0; for (int i = 0; i <= nAB; ++i) { p += hypergeometric(n, nA, nB, i); } return p; } public static double hypergeometric(int n, int nA, int nB, int nAB) { return binomial(nA, nAB) * binomial(n - nA, nB - nAB) / (double)binomial(n, nB); } public static long binomial(int n, int k) { return factorial(n) / (factorial(k) * factorial(n - k)); } public static long factorial(int n) { long z = 1; for (int i = 2; i <= n; ++i) z *= i; return z; } }}} Die hier gezeigte Implementierung der hypergeometrischen Verteilungsfunktion haben wir nicht besonders optimiert, da wir diese durch die Gauß-Verteilung approximieren: {{{ public static double normalF(int n, int nA, int nB, int nAB) { double pA = (double)nA / n; double mu = nB * pA; double c = (n - nB) / (double)(n - 1); double sigma = Math.sqrt(mu * (1 - pA) * c); return normalF(mu, sigma, nAB + 0.5 /* avg */); } public static double normalF(double mu, double sigma, double x) { return normalF((x - mu) / sigma); } public static double normalF(double x) { double t = 1.0 / (1.0 + 0.33267 * Math.abs(x)); double u = t * (0.3480242 + t * (-0.0958798 + t * 0.7478556)); double z = 0.5 * u * Math.exp(-0.5 * x * x); return x < 0 ? z : 1 - z; } }}}