Есть опен срорсные программы. Правда плохие, и для английского :).
Если хотите сделать свое, нужно определить некий критерий, к примеру - энтропию или перплексию и постараться его минимизировать. Либо создавать матрицы и пытаться реконструировать low-rank с минимальной потерей.