Кластеризация строковых данных с помощью ELKI
Мне нужно сгруппировать большое количество строк, используя ELKI на основе расстояния Edit / Levenshtein Distance. Поскольку набор данных слишком велик, я бы хотел избегать предварительно рассчитанных матриц расстояний на основе файлов. Как я могу
(а) загрузить строковые данные в ELKI из файла (только "Метки")?
(б) реализовать функцию расстояния для доступа к меткам (расширить функцию AbstractDBIDDistanceFunction, но как получить метки?)
Некоторые фрагменты кода или примеры входных файлов будут полезны.
1 ответ
Это на самом деле довольно просто:
А) написать Parser
это подходит для вашего формата входного файла (зачем пытаться использовать синтаксический анализатор, написанный для числовых векторов с метками?), возможно, подклассы AbstractStreamingParser
, производя отношение нужного типа данных (возможно, вы можете просто использовать String
, Если вы хотите быть более общим TokenSequence
может быть более подходящей концепцией для этих расстояний. Строки - это просто простейший случай.
Б) реализовать DistanceFunction
основанный на этом типе вектора вместо DBID, то есть PrimitiveDistanceFunction<String>
, Опять же, подклассы AbstractPrimitiveDistanceFunction
может быть проще всего сделать.
Из соображений производительности вы также можете обратиться к алгоритмам индексации, чтобы эффективно извлечь, например, k наиболее похожих строк. Я не уверен, какие структуры индекса существуют для расстояния редактирования строки и расстояния Левенштейна.
У коллеги есть ученик, у которого, видимо, есть некоторые рабочие расстояния редактирования токена, но я еще не видел и не просматривал код. Поскольку он обрабатывает файлы журналов, он, вероятно, будет использовать подход на основе токенов вместо символов.