Java: как думать о моделировании цепи Маркова? - PullRequest
4 голосов
/ 29 апреля 2011

У меня есть программа, для которой я пытаюсь сделать марковский текстовый генератор. Я планирую разделить некоторый текст с заданным интервалом, а затем сохранить его в классе. Проблема, которую я не знаю, как решить, состоит в том, как обработать именование экземпляров класса, который я собираюсь создать. Я планировал создать экземпляры в цикле for. Пользователь передаст методу некоторое количество текста (длина которого заранее не известна). Псевдокод ниже:

    create vector for sets and tail letter;
for (int c = 0; c < text.length; c++) {
    Check to make sure overflow doesnt happen;
    Create instance of set named c;
    store set and tailLetter into vector;
}

public class set {
    String characters;
    char tailLetter;
}

Извините, если это не достаточно ясно. Я учу себя Java, и это мой первый пост здесь.

Ответы [ 4 ]

4 голосов
/ 29 апреля 2011

Если вы изучаете Java, я бы посоветовал вам сначала сосредоточиться на моделировании проблемы с классами и методами Java.

Марковская цепь - это модель или статистическая проработка исходного текста, верно?Используя его для моделирования текста, он обычно описывает, как часто за каждым словом следуют слова.(обычно вы разделяете текст на границы слов).Такое ощущение, что ему нужен класс;это можно назвать MarkovChain.

В классе MarkovChain вам нужно что-то для хранения каждого слова, встречающегося в тексте, и сопоставления этого слова с другими словами в тексте, а также для подсчета частоты этих других слов.

Предположим, слово "и".В тексте «и» сопровождается «четыре раза» и «затем» 3 раза.Таким образом, вам понадобится некоторая структура данных для хранения чего-то вроде этого:

 and --> 
        the (4)
        then (3) 

Один из способов сделать это - использовать ArrayList для хранения всех слов, затем Map<T1,T2>, который содержит отношения между словами ичастота следующих слов.В этом случае T1, вероятно, является строкой, а T2, вероятно, ArrayList пар - строка и число (целое число) для этой строки.

Но подождите, теперь вам не нужна база ArrayList<> для хранения слов, потому что это всего лишь ключи на карте.

... и так далее.Следующим шагом будет выяснить, как заполнить эту структуру данных.Вероятно, это внутренний (частный) метод, который вызывается, когда вызывающая сторона создает экземпляр класса MarkovChain с начальным текстом.

Возможно, вы также хотите, чтобы этот класс MarkovChain предоставил другой метод, открытый., вызывающие стороны вызывают, когда они хотят сгенерировать некоторую случайную последовательность из цепочки, полагаясь на вероятности, основанные на частотных счетчиках.

...

Это всего лишь один из способов думать о моделировании проблемы.

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

3 голосов
/ 29 апреля 2011

Разве вы не можете использовать Map<String, Set>, где ключом является сгенерированное имя?

0 голосов
/ 29 апреля 2011

Я не вижу смысла в именах:

  • Если они просто так, что у 'set' объектов будет некоторая отдельная строка для отладки, реализация по умолчанию toString()даст вам это.

  • Если вам специально нужно выполнить поиск этих «установленных» объектов, тогда числовой идентификатор или порядковый номер будет работать лучше.

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

0 голосов
/ 29 апреля 2011

Вы можете использовать ArrayList для управления экземплярами.Мне больше нравится идея карты, поэтому вы можете динамически устанавливать имена, а не пытаться получить доступ к экземплярам по номеру индекса.

...