Я использую ELKI в java для кластеризации текста твита в алгоритме kmeans. Перед кластеризацией я рассчитал сходство текста твита с мерой tf-idf, которую он использовал для кластеризации.
public void clustering(String file) throws FileNotFoundException {
//Distance.calSim("after sorting.txt");
similarity = MainElki.getSimilarity();
PrintWriter writer = new PrintWriter(new File(file));
StringBuilder strBuilder = new StringBuilder();
for (int k = 0; k < numCorpus; k = k + 20) {
double[][] subArray = new double[20][20];
subArray = getSubArray(k, k);
DatabaseConnection dbc = new ArrayAdapterDatabaseConnection(subArray);
Database db = new StaticArrayDatabase(dbc, null);
db.initialize();
SquaredEuclideanDistanceFunction dist = SquaredEuclideanDistanceFunction.STATIC;
RandomlyGeneratedInitialMeans init = new RandomlyGeneratedInitialMeans(RandomFactory.DEFAULT);
KMeansLloyd<NumberVector> km = new KMeansLloyd<>(dist, 3, 0, init);
Clustering<KMeansModel> c = km.run(db);
Relation<NumberVector> rel = db.getRelation(TypeUtil.NUMBER_VECTOR_FIELD);
DBIDRange ids = (DBIDRange) rel.getDBIDs();
strBuilder.append("\n******** subArray[" + k + "]" + "[" + k + "]");
int i = 2;
for (Cluster<KMeansModel> clu : c.getAllClusters()) {
// K-means will name all clusters "Cluster" in lack of noise support:
strBuilder.append("\n #" + i + ": " + clu.getNameAutomatic() + "\n");
strBuilder.append(" Size: " + clu.size() + "\n");
strBuilder.append(" Center: " + clu.getModel().getPrototype().toString() + "\n");
strBuilder.append(" Objects: ");
for (DBIDIter it = clu.getIDs().iter(); it.valid(); it.advance()) {
// To get the vector use:
NumberVector v = rel.get(it);
// Offset within our DBID range: "line number"
final int offset = ids.getOffset(it);
strBuilder.append(" " + (offset + k));
// Do NOT rely on using "internalGetIndex()" directly!
}
i++;
}
}//end of for subArray
writer.write(strBuilder.toString());
writer.close();
}//end of clustering function
Теперь я хотел бы использовать другую функцию твитов в кластеризации (например, хэштеги, количество лайков, количество ретвитов, …). Я знаю, что могу определить пользовательскую функцию расстояния в ELKI, но весь абстрактный класс функции расстояния ELKI находится в одном типе данных (например, AbstractNumberVectorDistanceFunction), но функция твитов отличается: double для istance текста твита, int для количества лайков и ретвитов, Строка для хэштегов.
public class CustomizedDistance extends AbstractNumberVectorDistanceFunction {
@Override
public double distance(NumberVector arg0, NumberVector arg1) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
Есть ли способ написать настраиваемую функцию расстояния, которая вычисляет расстояние до текста твита, а затем вычисляет окончательное расстояние, используя другие функции, такие как количество лайков?