- •Титульный лист
- •Оглавление
- •Введение
- •1. Постановка задачи
- •2. Анализ задачи
- •2.1. Анализ предметной области
- •2.2. Методы автоматической классификации текстов
- •2.3. Метрики оценки качества рубрицирования
- •2.4. Существующие решения
- •2.5. Предлагаемые алгоритмы для работы классификатора
- •2.6. Анализ архитектуры модуля
- •2.7. Средства реализации
- •3. Аппаратные и программные требования
- •Серверная часть
- •Клиентская часть
- •4. Реализация
- •4.1. Структура базы данных
- •4.2. Реализация классов
- •4.3. Пример использования
- •5. Оценка качества рубрицирования
- •Заключение
- •Список литературы
- •Приложение 1. Класс-action ShowRubricProbability
- •Приложение 6. Результаты автоматической классификации объявлений
Приложение 1. Класс-action ShowRubricProbability
Приложений может быть сколько угодно, но они должны что-то добавлять к работе, а не просто цитировать мегабайты исходников и xml. Обычно сюда идут особо интересные исходники, подробные описания таблиц БД, классов, справочная информация и т.п.
public class ShowRubricsProbability extends BaseAction {
public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
AdProbabilityForm adProbabilityForm = (AdProbabilityForm) form;
String adText = adProbabilityForm.getAdText();
List<Long> rubricsIds = DAOFactory.getFactory().getLearningSelectionDAO().getRubricIds();
HashMap<Long, Long> adsInRubric = DAOFactory.getFactory().getLearningSelectionDAO().countAdsInRubricGroupedByRubricId(rubricsIds);
List<String> firstForms = DAOFactory.getFactory().getBayesVocabularyDAO().getFirstForms(ClassifierUtils.splitWordsOfAd(adText));
// для инф_частей
HashMap<Long, Long> countWordInRubrics;
HashMap<Long, Double> avgWordInRubric = new HashMap<Long, Double>();
HashMap<Long, Double> rubricProbability = new HashMap<Long, Double>();
double absAvgWordInRubrics = 0;
double absAvgWordInRubric;
for (String word : firstForms) {
// для инф_частей
countWordInRubrics = DAOFactory.getFactory().getWordInRubricStatisticDAO().getCountsGroupedByRubric(word);
ClassifierUtils.addRubricWithEmptyCount(countWordInRubrics, rubricsIds);
// вычисление частоты встречаемости слова в рубрике
//для инф_частей
for (Map.Entry<Long, Long> countWordInRubricsEntry : countWordInRubrics.entrySet()) {
// если в карте "объявлений в рубрике" есть нужная рубрика
if (adsInRubric.containsKey(countWordInRubricsEntry.getKey())) {
absAvgWordInRubric = (double) countWordInRubricsEntry.getValue() / adsInRubric.get(countWordInRubricsEntry.getKey());
avgWordInRubric.put(countWordInRubricsEntry.getKey(), absAvgWordInRubric);
absAvgWordInRubrics += absAvgWordInRubric;
}
absAvgWordInRubric = 0;
}
// для инф_частей
if (absAvgWordInRubrics != 0) {
for (Map.Entry<Long, Double> avgWordInRubricEntry : avgWordInRubric.entrySet()) {
if (!rubricProbability.containsKey(avgWordInRubricEntry.getKey()))
rubricProbability.put(avgWordInRubricEntry.getKey(), (avgWordInRubricEntry.getValue() + 1) / absAvgWordInRubrics);
else {
double tmpProb = rubricProbability.get(avgWordInRubricEntry.getKey());
tmpProb *= (avgWordInRubricEntry.getValue() + 1) / absAvgWordInRubrics;
rubricProbability.put(avgWordInRubricEntry.getKey(), tmpProb);
tmpProb = 0;
}
}
}
// для инф_частей
absAvgWordInRubrics = 0;
countWordInRubrics.clear();
}
// Учет априорной вероятности выбора рубрики.
for (Long rubricId : rubricsIds) {
if (rubricProbability.containsKey(rubricId)) {
double tmpProb = rubricProbability.get(rubricId);
Long adsInOneRubric = adsInRubric.get(rubricId);
double apriorProb = (double) adsInOneRubric / adsInAllRubrics;
tmpProb *= apriorProb;
rubricProbability.put(rubricId, tmpProb);
}
}
if (rubricProbability.size() > 0)
request.setAttribute("maxProbs", ClassifierUtils.basedOnValuesSort(ClassifierUtils.getMaxsProbabilities(rubricProbability, 5)));
else
request.setAttribute("errorNoProb", 1);
return mapping.findForward("success");
}
}