Шаблоны Java: инженерные потоки данных для задач интеллектуального анализа данных - PullRequest
0 голосов
/ 10 ноября 2011

Я являюсь майнером данных, поэтому я трачу много времени на преобразование необработанных данных различными способами, чтобы обеспечить потребление с помощью прогнозных моделей.Например, прочитайте файл в определенном формате, токенизируйте, запрограммируйте и спроектируйте в какое-нибудь числовое представление.За прошедшие годы я разработал богатый набор методов для выполнения большинства задач по обработке данных, о которых я только могу подумать, но у меня нет хорошего способа настройки этих компонентов всеми, кроме самых элементарных способов - обычно то, что я делаю, очень много.вызовов конкретных методов в исходном коде, который зависит от конкретной задачи.Сейчас я пытаюсь реорганизовать свои библиотеки во что-то более приятное, но я не слишком уверен, что это такое.

Мое текущее мышление состоит в том, чтобы иметь список функциональных объектов, каждый из которых определяет некоторый метод (скажем, операция (...)), которые вызываются последовательно, каждый из которых обрабатывает содержимое некоторого потока данных посредством ссылки.или потребляя вывод предыдущего функционального объекта.Это близко к тому, что я хочу, но поскольку тип вводимых и выводимых данных будет различаться, использование обобщений становится очень трудным.Чтобы использовать приведенный выше пример, я хотел бы пропустить что-то через этот «конвейер», который обрабатывает данные, такие как:

input: string filename
filename -> collection of strings
collection<string> -> (stemming, stopword removal) -> collection of strings
collection<string> -> (tokenize) -> collection of string arrays
collection<string[]> -> (gram-ify) -> augment individual token strings with n-grams -> collection of string arrays
collection<string[]> -> projection into numeric vectors -> collection< double[] >

, это простой пример, но представьте, что у меня есть сотни таких компонентов, и яЯ хотел бы добавить их в некоторый поток данных.это соответствует моему простому в настройке требованию - я мог легко построить конвейерную фабрику, которая читает какой-нибудь файл yaml и создает его.Тем не менее, шаблоны дизайна компонентов меня уже озадачили?как выглядят соответствующие интерфейсы?кажется, что единственный простой способ сделать что-то здесь - это передать объекты, по существу покончить с объектами (или передать некоторый объект контекста, который имеет переменную-член Object), затем проверить на совместимость при вводе, выбрасывая исключения во время выполнения,оба варианта кажутся одинаково плохими.однако, я чувствую, что я близок к действительно хорошей и гибкой системе.ребята, можете ли вы помочь мне протолкнуть это через забор?

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

Я думаю, что более шустрый инструмент для объединения вашей библиотеки был бы хорошим подходом.например, один из новых динамических языков был бы хорош для этого.

Clojure отлично подходит для таких встроенных инструментов, как map, pmap, Reduction Filter и т. Д. Все коллекции Clojure реализуют интерфейсы библиотеки Collection java.util, так что вы можете применять функции Clojure более высокого уровня ксуществующий код Java, или вы также можете передавать структуры данных Clojure непосредственно в код Java (если код Java не ожидает его изменения).

Легкий и динамичный характер языка упрощает егособрать все вместе быстро и без лишних затрат.

1 голос
/ 10 ноября 2011

Возможно, я читаю ваш пример слишком буквально; Это означает, что это решение может быть неприменимо к вашей реальной проблеме.

public interface Interface1 {
  public List<String> operate(List<String> list);
}

public interface InterfaceBridge {
  public List<List<String>> operate(List<String> list);
}

public interface Interface2 {
  public List<List<String>> operate(List<List<String>> list);
}

Очевидно, вы должны выбрать лучшие имена интерфейсов. Затем вы можете составить их с:

public class Interface1Composite implements Interface1 {
  List<Interface1> components = new ArrayList<>();

  public Interface1Composite(Interface1... components) {
    for (Interface1 i1 : components)
      this.components.add(i1);
  }

  @Override 
  public List<String> operate(List<String> list) {
    for (Interface1 i1 : components)
      list = i1.operate(list);
    return list;
  }

Я думаю, это в значительной степени то, что вы уже делаете. Я просто упростил, имея 3 типа интерфейсов вместо того, чтобы пытаться использовать дженерики. Но, как я уже говорил ранее, я не знаю, сможете ли вы применить это к вашей проблеме.

1 голос
/ 10 ноября 2011

У фонда Apache есть проект, называемый конвейерами https://commons.apache.org/sandbox/pipeline/. Возможно, он может быть полезен. Я думал, что там было больше трубопроводных проектов. Может быть полезно просмотреть этот сайт.

...