Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Фильтр мата на Java


Автор: Се ля ви 21.1.2005, 13:55
Делаю форум для сайта http://www.inoSMI.Ru . Сайт посвящен переводам видной западной прессы о России - даёт представление о мнении элитной западной прессы (разделяемой, как мне кажется, очень многими) о нас.

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

Нужен фильтр, который бы мог заменять мат на "<слово удалено цензурой>" или что-то в этом роде - крайне желательно, что бы он был написан на Java...
Если не найду на Java, задам вопрос в более общий раздел форума - тогда, видимо, придётся заворачивать в веб-сервис или что-то наподобии этого...

Автор: Domestic Cat 21.1.2005, 14:01
Ну вот простой вариант
Код

public class FFilter {
     protected static String[] forbidden = {"Microsoft", "corporation", "Windows"};

     public static String filter(String input) {
        for(int i = 0; i < forbidden.length; i++) {
          StringBuffer stars = new StringBuffer();
          for (int j = 0; j < forbidden[i].length(); j++) {
            stars.append("*");
          }
          input = input.replaceAll("(?i)"+forbidden[i], stars.toString());
        }
        return input;
     }

     public static final void main(String[] arg) {
       String test = "Visual Studio .NET 2003 Copyright Microsoft corporation";
       System.out.println(filter(test));
     }
}


Все дело в том чтобы загнать побольше слов, во всех возможных сочетаниях.

Автор: Се ля ви 21.1.2005, 14:14
Domestic Cat
Спасибо, канешь, но я думаю, нужен намного более сложный алгоритм - хотя бы из-за различных окончаний, которые качественно отличают русский язык от английского, и главное - именно из-за хитрости несдержанного народа, о которой я написал выше...

Поидее, мне нужно фильтровать не столько по написанию, сколько по звучанию - поэтому нужна функция на подобии запроса LIKE БД... Но специфическая...

Автор: Domestic Cat 21.1.2005, 14:23
Цитата
Поидее, мне нужно фильтровать не столько по написанию, сколько по звучанию - поэтому нужна функция на подобии запроса LIKE БД... Но специфическая...


Дык регекспы покруче LIKE будут smile


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


Ну так на любом языке можно сделать :
fuck
f/\ck
f*u*c*k
Fuk
..... ad infinitum
В-первых тебе окончания слов не нужны, достаточно корень вырезать, а это сокращает словарь.
Во-вторых можно подумать как эти слова задать регекспами:
http://java.sun.com/docs/books/tutorial/extra/regex/index.html
то есть не задавать целиком слова / корни.

Автор: Се ля ви 21.1.2005, 14:33
Domestic Cat
RegExp`ы я знаю неплохо, хотя за ссылку спасибо всёравно :-)

Хорошо, допустим, можно сделать действительно на них (RegExp`ах) - идея хорошая, сгодится. Тогда нужен их список для всех слов русского мата... Где-нибудь что-то подобное есть?

Т.е. в цикле перебераем массив регэкспов, заменяя слова в тексте по нему - и на выходе получаем "очищенный" текст...

Да, тогда всё упирается в написание такого массива - первая версия может быть написана за день-два достаточно муторного кропотливого труда, остальное доделывать по факту обнаружения ошибок...

Ещё, менее "дорогие" по времяни варианты?

Неужели никто не сталкивался до меня с такой проблемой? Не вверю... smile

Автор: Sun 21.1.2005, 14:37
Насколько я знаю нормального решения для фильтра матов нет. Если искать по корню, то такие слова как "гребля", "сабля" и т.д. сильно пострадают.

Автор: Domestic Cat 21.1.2005, 14:45
smile А нечего про всякие гребли-сабли писать smile smile
Добавлено @ 14:52
http://www.relib.com/forums/topic.asp?id=810403

Автор: sergejzr 21.1.2005, 14:58
Domestic Cat, и по моему ИМХО тоже smile

Вот кое что. Движек на tcl'e + словарь smile

http://irc.tm-net.ru/soft/eggdrop/scripts/antimat.tar.bz2

Автор: LSD 21.1.2005, 21:28
ИМХО любой фильтр можно обойти, но с другой стороны если админ не спит, то второй раз то же фокус не пройдет. Так что основной поток мата можно отсечь.

Можно попробовать накидать примерный алгоритм:
1) разбиваешь текст на токены
2) ищешь все слова состоящие из смешанных букв, и в них заменяешь все латинские буквы на аналогичные русские буквы (как то икс на ха), и наоборот если требуется фильтр английского мата. Соответственно для каждого токена может быть несколько вариантов. Так же можно заменять псевдографику.
3) переводишь транслит
4) а теперь просто проходишься по списку токенов обычным фильтром

Реализовывать это конечно будет не просто, но после реализации алгоритма, основная проблема будет только в обучении фильтра, но в этом тебе форумчане помогут smile

Автор: sergejzr 21.1.2005, 21:40
Давайте разработаем антимат на яве?
У меня тоже мысли имеются и кое какой опыт smile

Автор: LSD 21.1.2005, 23:36
Цитата(sergej @ 21.1.2005, 21:40)
У меня тоже мысли имеются и кое какой опыт

Поделись.

Автор: sergejzr 21.1.2005, 23:40
В принципе кластерингом документов в последнее время занимаюсь с использованием онтологий. ну и wordprocessings всякие тоже туда принадлежат. Немного не то, но вполне применимо.

Автор: Се ля ви 22.1.2005, 00:56
Цитата(LSD @ 21.1.2005, 21:28)
Реализовывать это конечно будет не просто, но после реализации алгоритма, основная проблема будет только в обучении фильтра, но в этом тебе форумчане помогут

Цитата(sergej @ 21.1.2005, 21:40)
Давайте разработаем антимат на яве?
У меня тоже мысли имеются и кое какой опыт smile

Давайте вместе, канешь :-)

Автор: chipset 22.1.2005, 02:25
Цитата(sergej @ 21.1.2005, 10:40)
Давайте разработаем антимат на яве?
У меня тоже мысли имеются и кое какой опыт smile

А что? Неплохая идея... smile

Автор: sergejzr 22.1.2005, 02:36
Предлагаю во первых открыть для проекта новую тему в "наших проектах". Кто откроет, тот и будет рулить smile
Туда и идеи и релизы кладывать. На яве будет перспективно-кроссплаттформенно.
Я вообще удивляюсь, что ничего серьёзного в этом направлении нет....

Автор: chipset 22.1.2005, 02:43
А прикол в том что каждый третий захочет помочь нашей системе со словарным запасом... smile

Автор: sergejzr 22.1.2005, 02:46
smile Можно удафф.ком прогнать smile smile

Автор: chipset 22.1.2005, 02:49
Цитата(sergej @ 21.1.2005, 15:36)
Предлагаю во первых открыть для проекта новую тему в "наших проектах". Кто откроет, тот и будет рулить smile

ИМХО, не следует пока... Пусть просто в топике поживет, а то ещё один мертвый раздел делать...

Автор: sergejzr 22.1.2005, 02:52
Говорю же, если кто серьёзно решит. Просто помогать я смогу, а ещё один проект тянуть - нет.
Хотя ужасть как хочется smile

Автор: LSD 22.1.2005, 15:02
Давайте пока попробуем накидать общую концепцию, а там посмотрим как и на чем реализовывать. Как вам мое предложени по поводу схемы анализа. У меня пока нет полной ясности по поводу не регистрозависимого анализа, а в остальном вроде вопросов у меня нет.
sergej.z
Расскажи поподробнее про "кластерингм документов в последнее время занимаюсь с использованием онтологий. ну и wordprocessings всякие тоже туда принадлежат". А то я только онтологию знаю и то как раздел философии smile

P.S. Поскольку тему начал Се ля ви, предалгю его и назначить крайним за все это дело smile
Цитата
Инициатива наказума исполнением!
smile smile smile

Автор: chipset 22.1.2005, 15:14
LSD
ИМХО, должен быть словарь матерных слов (бл*) и словарь защищеных слов (гребля, сабля и т.д.).
Далее, один из вариантов: определяем последовательность из буквы которые находятся недалеко друг от друга (f_u_c_k), проверяем - соответствует ли словарю защищеных слов и если нет - ... smile
Естественно всё это заоптимизируется и т.д и т.п..
Кстати: предлагаю модераторам снять ограничения на мат в этом топике smile

Автор: sergejzr 22.1.2005, 16:57
smile smile
  • Первым делом текст следует нормализовать.
    т.е пробежаться, выкинуть все знаки, оставив только буквы. (позиции однако надо запоминать отдельно).
    Пример: Сейчас мы это используем на форуме. Для проверки соответствия быстрой цитаты и участника. особенно в опере, где возвращаемый выделеммый текст очень не похож на возвращаемое сообщение.
  • Пробелы, табы оставляем для разделения слов.
  • Теперь, нормализуем буквы. Т.е заменяем похожие латинские на русские. Знаки некоторые кстати и их сочетания тоже похожи на буквы так и заменяем |-|-| будет ж.
  • Весь текст в нижний регистр.
  • Теперь у нас прекрасный текст в котором можно искать. stammer-ом прходимся по словам делим на подозрительные и не подозрительные. Конечно альтернативно можно и весь словарь загнать smile
  • После этого проверяем подозрительные на исключения - иначе слово - мат. Исключения как раз "са". не так уж много приличных русских слов с "".
  • В добавку ищем в тексте удалив пробелы.


Как Альтернатива можно пробелы сразу удалять, а потом искать подозрительные корни. Найдя восстанавливать слово, проверять в словаре.



Автор: chipset 22.1.2005, 17:04
sergej.z, а где в твоем алгоритме средства для распознования слов типа: "f^u_c^k"?
Добавлено @ 17:05
Вижу..

Автор: sergejzr 22.1.2005, 17:14
Цитата(LSD @ 22.1.2005, 14:02)
ergej.z
Расскажи поподробнее

Там много рассказывать smile

Берётся онтология - дерево или граф. Как повезёт. Скорее на хватит просто таксономии, потому что онтологические связи я в алгоритме(пока) не учитываю.
Цитата
поездки
/        \
перемещение    проживание
    /        \                /        \
самлёт поезд      отель квартира


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


Каждый узел рассматривается ка концепт. для каждого документа создаётся вектор из концептов.

v(i)= |поездки|перемещение|проживание|самлёт|поезд|отель|квартира|
i - порядковый номер документа
Теперь мы пробегаем по документам и изменяем значение компоненты вектора, если находим в тексте
подходящее словосочетание.

Например
"Гостинница Россия" -> v(i)[отель]++
"Ту 154" -> v(i)[самлёт]++
итд.

Затем мы редуцируем количество компонентов в векторах хитрым алгоритмом коллег из Karlsruhe.
Таким образом сокращаем кол-во измерений в нашем документном пространстве.
То, что получилось кластеруем каким нибудь K-means'ом.

Вот вкратце и всё smile

Извиняюсь, но я многих терминов по русски не знаю, так что мог где нить чушь написать smile

Автор: Се ля ви 22.1.2005, 17:39
Цитата(LSD @ 22.1.2005, 15:02)
Поскольку тему начал Се ля ви, предалгю его и назначить крайним за все это дело smile
Цитата
Инициатива наказума исполнением!

Ок, давайте порулю я. :-)

sergej.z
Схема хорошая. Надо решить, на каких этапах всё делать регэкспами, а где можно и вручную(для быстроты)...

Думаю, сначала можно всё сделать регэкспами, а потом какие-то этапы переписывать, оптимизируя.

Итак, фазы:
1.
Цитата(sergej @ 22.1.2005, 16:57)
Первым делом текст следует нормализовать.
т.е пробежаться, выкинуть все знаки, оставив только буквы. (позиции однако надо запоминать отдельно).

2.
Цитата(sergej @ 22.1.2005, 16:57)
Пробелы, табы оставляем для разделения слов.

3.
Цитата(sergej @ 22.1.2005, 16:57)
Теперь, нормализуем буквы. Т.е заменяем похожие латинские на русские. Знаки некоторые кстати и их сочетания тоже похожи на буквы так и заменяем |-|-| будет ж.

4.
Цитата(sergej @ 22.1.2005, 16:57)
Весь текст в нижний регистр.

5.
Цитата(sergej @ 22.1.2005, 16:57)
Теперь у нас прекрасный текст в котором можно искать. stammer-ом прходимся по словам делим на подозрительные и не подозрительные. Конечно альтернативно можно и весь словарь загнать

6.
Цитата(sergej @ 22.1.2005, 16:57)
После этого проверяем подозрительные на исключения - иначе слово - мат. Исключения как раз "са". не так уж много приличных русских слов с ""

7.
Цитата(sergej @ 22.1.2005, 16:57)
В добавку ищем в тексте удалив пробелы


Думаю, это должен быть класс без конструктора и все его медоды должны быть статичными и более того - private`ными, кроме одного, который возвращает уже отфильтрованный текст. В качестве входного параметра можно ему передавать объект JavaBean с библиотекой регэкспов и, собственно, слово, на которое мы заменяем весь мат.
JavaBean (не Enterprise, конечно) - в свою очередь может быть интерфейсом к файлу, к БД или вообще наполняться программой извне через setter`ы - это уже как usr`у будет удобней.

Какие будут встречные предложения? Прежде всего - относительно того, на каких фазах мы пользуемся RegExp`ами...

P.S. sergej.z вот только я не понял - что такое stammer?...
Добавлено @ 17:40
Да, собственно, все его методы этого главного класса должны соответствовать фазам. :-)

Автор: sergejzr 22.1.2005, 17:53
stammer оставляет от слова лишь его корень.
обрезаются приставки и окончания. посмотрим действие на практике...

RegExp можно применять в конце не стандартизированный текст. ИМХО в ручную лучше регулировать мелочи можно

Добавлено @ 17:56
Надо еще функцию, которая возвращает процент мата в тексте.

PS:
Сейчас в голову пришло:
Заменять мат можно на "Гав, гав" как у старика Хоттабыча smile smile smile

Автор: LSD 22.1.2005, 19:34
Цитата(sergej @ 22.1.2005, 16:57)
Весь текст в нижний регистр.

Таким макаром мы исключим весь текс типа: nJIaksa.spb.

На мой взгляд надо текст разбить на атомарные единицы: токены. А далее анализировать: если токен состоит из букв одного алфавита, то просто анализировать его, независимо от регистра. Если нет, то надо попробовать его транслитерировать (тут есть над чем поработать). Все возможные варианты транслитерации сохраняются, как возможные варианты толкования токена. А затем они анализируются по словарю.
Так же надо анализировать возможные варианты когда сами токены не несут орицательной нагрузки, но вот их последовательность имеет негативный смысл:
Цитата(chipset @ 22.1.2005, 17:04)
f^u_c^k
Вообщем полный: RFC!

Автор: sergejzr 22.1.2005, 19:45
Цитата(LSD @ 22.1.2005, 18:34)
текс типа: nJIaksa.spb.

По этому в нижний регистр переводится в самом конце. До этого фильтруются знако и буквосочетания.
Mы кстати мысленно при чтении делаем так же smile

LSD На практике не знаю, можно ли будет такой анализатор реализовать.
Особенно
Цитата
возможные варианты толкования токена

Я просто боюсь, что такое не реализуется, потому что всем надоест проект до того, как будут интересные результаты.
Т.е идею вижу, реализацию концепта - нет.

Автор: Се ля ви 23.1.2005, 01:00
smile
Мне вот тут вдруг стало непонятно другое - ну перелопатили мы текст, всё вбили в нижний регистр, да ещё и пробелы убрали - отфильстровали мат - и что с этим месивом делать? Это ведь всё восстановить в нормальном виде ещё надо...

Автор: sergejzr 23.1.2005, 01:08
см. пункт 1
Цитата
(позиции однако надо запоминать отдельно).

каждая буква в стандартизированном массиве соответстует индексу в настоящей мессаге. Его мы запоминаем.
Это сделсть очень легко, если например вести параллельный массив.
Добавлено @ 01:08
По индексам и находим нехорошие слова.

Автор: lovermann 23.1.2005, 04:19
С посещаемостью этого форума вопрос о том, чтобы новую систему потестить не встанет smile За месяц можно столько извращенских написаний собрать, что потом уже трудно будет придумать что-то новое.

Автор: Domestic Cat 23.1.2005, 05:19
1. Парсим стринг по чарам. Берем 1 чар и сиздаем объект Pair содержащий char, int[] положения в исходной строке (если мы впоследствии переведем ya->я то нужно помнить две позиции а не одну) и булиновый флаг.
а. Пробелы выбрасываем сразу (то есть даже Пару под них не создаем), т.к. можно ведь написать
f u c k
и потом он ни под один регексп не подойдет.
б. Выбрасываем все "очевидные" знаки пунктуации: ? , .
в. Записываем все подряд в массивлист.
г. При этом переводя в нижний регистр.

2. Нужны есессно свои методы поиска, т.к. регеспы при всем желании на массиве объектов не заработают.

3. Теперь ищем неочевидную гадость со знаками / | \ ^ * типа б/|я. Заменяем на нужные буквы.
Незаменяемые символы выбрасываем.

4. Переводим весь инглиш в русский как в транслите.

5. Переводим 1234567890@$%& <> - например п1д0р
Незаменяемые символы выбрасываем.

6. Имеем рашн текст, по которому ищем все известные нам корни если нашли, заменяем в Парах флаг на ТРУЕ.

7. Теперь проходим по массиву и для тех Пар у которых ТРУЕ берем индекс и заменяем символ в стринге по этому индексу на *.

Автор: sergejzr 23.1.2005, 05:39
Код

chiffreText="k03eeee/|";

char chiffre[];
chiffre[0]=k;
chiffre[1]=0;
chiffre[2]=3;
chiffre[3]=e;
chiffre[4]=e;
chiffre[5]=e;
chiffre[6]=e;
chiffre[7]=/;
chiffre[8]=|;



int[][] key;// массив из интервалов. индекс соответствует индексу в plainText, интервал - интервалу в chiffreText
plainText=Хитрый_алгоритм_нормализации_текста(chiffreText, key);
//plainText теперь = "козел";



char plain[];
plain[0]=к;
plain[1]=о;
plain[2]=з;
plain[3]=е;
plain[4]=л;


key[0][0]=key[0][1]=0; //первая последняя буква совпадают интервал =0 к=k
key[1][0]=key[1][1]=1; //первая последняя буква совпадают интервал =0 о=0
key[2][0]=key[2][1]=2; //первая последняя буква совпадают интервал =0 з=3

key[3][0]=3; key[3][1]=6; // интервал =3 3-6 в оригинале е=eeee
key[4][0]=7; key[4][1]=8; // интервал =1 7-8 в оригинале л=/|



Ну вот теперь регэкспом по plain'y и с помощью key выцепляем интервал слова козел
В нормализованном он 0-4, следовательно в оригинале:
key[0][0] - key[4][1]; == 0-8

Автор: Domestic Cat 23.1.2005, 05:43
Ээээ .... че козлом ругаешься ? smile

Автор: sergejzr 23.1.2005, 05:49
Domestic Cat Да ты что? smile smile Просто отправилось раньше времени smile

Автор: Domestic Cat 23.1.2005, 05:56
Цитата(sergej @ 22.1.2005, 20:39)
Ну вот теперь регэкспом по plain'y


Дык регесп на char[] не працюе smile

Автор: sergejzr 23.1.2005, 05:59
Ну ё-маё!
Код


char plain[];
String plainText = new String(plain);


Это же только схема smile Псевдокод так сказать

Автор: Domestic Cat 23.1.2005, 06:02
Ну хорошо, вот ты его нормализовал, выкинул все и пр. Потом регекспом ищещь и заменяешь что не нужно. Как регесп скажет тебе какие конкретно буквы он заменил и что нужно исправлять в исходной строке?

Автор: sergejzr 23.1.2005, 06:03
Я добавил в самый низ smile

Автор: Domestic Cat 23.1.2005, 06:04
Аа, торможу.

Цитата
Я добавил в самый низ smile


Да это понятно, я ж про регексп - там есть методы start, end.

Автор: sergejzr 23.1.2005, 06:14
Лана smile до завтра smile

Автор: Domestic Cat 23.1.2005, 06:24
Единственное что мне тут не нравится - нужно возиться с массивами. Придется
1. искать слово
2. брать его границы
3. смотреть в инт[][]
4. заменять
Тогда как на Парах можно было бы, сделав метод поиска самим, избежать этого.

Автор: Domestic Cat 23.1.2005, 07:41
Вот кое что сделал, пока только убирает слова из словаря + знаками пунктуации / вайтспейсом ее не обдуришь. Словари задаются в текстовых файлах с соотв. названиями и окончаниями, задается также язык (русский/английский). Пока фильтруются только слова и выбрасывается пунктуация, а также затираются повторяющиеся буквы если они входят в состав матерного слова; нужно добавить транслит и символы типа /|, 4, 1, ...

Пример:
Цитата
This fffUUuUUUccckkKaaa this piece of s-h-i-t he f*u*c*k*e*d me up!

->>>

This ***************aaa this piece of *-*-*-* he ********e*d me up!




Автор: LSD 23.1.2005, 12:39
Цитата(Domestic @ 23.1.2005, 05:19)
Пробелы выбрасываем сразу

Все, гребля не прошла smile
Цитата(Domestic @ 23.1.2005, 05:19)
При этом переводя в нижний регистр.

А вот bJIR пройдет smile


Цитата(Domestic @ 23.1.2005, 05:19)
т.к. можно ведь написать f u c k и потом он ни под один регексп не подойдет.

Надо ввести запрещенную последовательность токенов.

Автор: Domestic Cat 23.1.2005, 13:22
Цитата(LSD @ 23.1.2005, 03:39)
Все, гребля не прошла smile

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


Цитата(LSD @ 23.1.2005, 03:39)
А вот bJIR пройдет

Опять-таки, записываем в словарь j| = л ; правда с R не пройдет, но ведь все возможные истолкования в любом случае не уловишь, да и кому будет охота материться когда для этого нужно будет выдумывать малопонятные символы?


Цитата(LSD @ 23.1.2005, 03:39)
Надо ввести запрещенную последовательность токенов.

Я решил отбрасыванием вайтспейса.

Автор: LSD 23.1.2005, 13:44
Цитата(Domestic @ 23.1.2005, 13:22)
Ну так запишем слова типа "гре" и "подстрахуй" в отдельный словарь и их трогать не будем.

Тогда начнет прокатывать "гре ".

Цитата(Domestic @ 23.1.2005, 13:22)
да и кому будет охота материться когда для этого нужно будет выдумывать малопонятные символы?

Еще как охота будет, это же такой азартный спорт smile

Цитата(Domestic @ 23.1.2005, 13:22)
все возможные истолкования в любом случае не уловишь

Конечно, но надо дать возможность администратору самому добавлять новые извороты пользователей в фильтр.

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

Автор: Domestic Cat 23.1.2005, 14:01
Цитата(LSD @ 23.1.2005, 04:44)
Тогда начнет прокатывать "гре ".


Ну тут уже надо учить программу понимать смысл предложения, а иначе не получится. Ведь можно тогда ругаться : греБЛЯ!!!


Цитата(LSD @ 23.1.2005, 04:44)
Еще как охота будет, это же такой азартный спорт smile


Ну это уже будет ерунда, особенно если убрать основное.


Цитата(LSD @ 23.1.2005, 04:44)
Конечно, но надо дать возможность администратору самому добавлять новые извороты пользователей в фильтр.


В аттачменте словари задаются в отдельных текстовых файлах - добавляй что хочешь.


Цитата(LSD @ 23.1.2005, 04:44)
И не надо зацикливаться на русском и английском, есть и другие языки, это тоже надо учесть.


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


Цитата(LSD @ 23.1.2005, 04:44)
Я считаю что важнее разработать нормальную, хорошо расширяемую систему анализа и фильтрации текста, а не пытаться предусмотреть сейчас все варианты.


А предложенный вариант - это не система фильтрации текста?
1. Переводим все в нижний регистр.
2. Выбрасываем "безопасные" символы типа . , и пробелы, из которых мат не составишь
3. Повторяющиеся буквы убираем (точнее, они сохраняются как children в предшествующей Pair, чтоб убрать слова типа CcccRRRAAAPP)
4 В зависимости от языка трансформируем часто применяемые обозначения/транслит в буквы
5. Заменяем слова из словаря на ****
Без словарей тут не обойтись.
Кроме того, все возможные варианты все равно не отловим. С каждой новой проверкой добавляются тормоза, потому нужно остановиться на отлавливании основного.

Автор: sergejzr 23.1.2005, 14:08
Тормоза - финя.
Проверок можно разных сделать и несколько раз по тексту пробежаться.
Почему бы непрогить несколько вариантов параллельно?

LSD, Где твой алгоритм?

Автор: LSD 23.1.2005, 14:32
Вот мои приблизительные наметки по поводу данного фильтра.
Критика приветствуется smile

Автор: Domestic Cat 23.1.2005, 17:52
Как я понял суть в том чтобы была возможность подключать произвольные фильтры/токенайзеры.

1. Зачем нужны токенайзеры, я не понял.
2. Подключать фильтр - идея хорошая, если бы речь шла о фильтрации различных типов слов; например одинт фильтр - для мата, другой - для слов с сексуальной окраской, и т п. Опыт показывает что в основном нужен антиматовый фильтр. Потому фильтры-плагины идея конечно гут, но зачем она тут не представляю.
Действие фильтров не обязательно складывается. Это если б один фильтр отдсекал слова "дурак" и "козел", а второй слово - "гад", то да. Но чтобы отловить мат нужно сначала как-то преобразовать исходный текст. Суть состоит в наиболлее оптимальном выборе алгоритма. Если же алгоритм разный то после действия одного фильтра действие другого практически равно 0.

------------
Единственный кто стянул мой код - ну как, есть замечания?

Автор: sergejzr 23.1.2005, 17:59
Цитата(Domestic @ 23.1.2005, 16:52)
Единственный кто стянул мой код - ну как, есть замечания?

Ага, не компилируется smile
Но это мои проблемы. Сейчас некогда решать...

Цитата(Domestic @ 23.1.2005, 16:52)
Если же алгоритм разный то после действия одного фильтра действие другого практически равно 0.

Это будет видно. тем более, что я предлагаю использовать не последовательно, а параллельно.
На вуходе массивы - keys как я описывал. Просто не один, а несколько.
Потом решаем (чего нить придумаем), какие интервалы фильтровать.
PS:
Дело в том что наши концепты (мой, твой и LSD) практически друг другу не мешают, но дополняют smile

Автор: Domestic Cat 23.1.2005, 18:03
Цитата(sergej @ 23.1.2005, 08:59)
Ага, не компилируется smile


Т.к. нужна 1.5. Переделать в 1.4?


Автор: LSD 23.1.2005, 18:44
Цитата(Domestic @ 23.1.2005, 18:03)
Т.к. нужна 1.5. Переделать в 1.4?

Если нет веских причин использовать 1.5, то конечно лучше переделать. Ниже 1.4 имхо не стоит делать, т.к. там регекспов нет.

Цитата(sergej @ 23.1.2005, 17:59)
Дело в том что наши концепты (мой, твой и LSD) практически друг другу не мешают, но дополняют

Пока попробуем довести до ума каждый свой вариант (у меня даже не все классы пока есть) а там решим.

Цитата(Domestic @ 23.1.2005, 17:52)
1. Зачем нужны токенайзеры, я не понял.

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

Цитата(Domestic @ 23.1.2005, 17:52)
2. Подключать фильтр - идея хорошая, если бы речь шла о фильтрации различных типов слов; например одинт фильтр - для мата, другой - для слов с сексуальной окраской, и т п. Опыт показывает что в основном нужен антиматовый фильтр. Потому фильтры-плагины идея конечно гут, но зачем она тут не представляю.

Мне хотелеось реализовать более универсальную идею фильтрации, вот я и сделал это через плагины.

Автор: sergejzr 23.1.2005, 19:02
Цитата(Domestic @ 23.1.2005, 17:03)
Т.к. нужна 1.5. Переделать в 1.4?

Да, будет лучше.

Цитата(LSD @ 23.1.2005, 17:44)
Пока попробуем довести до ума каждый свой вариант (у меня даже не все классы пока есть) а там решим.


smile

ИМХО лучше умно в кучу собрать.

Автор: LSD 23.1.2005, 20:26
Цитата(sergej @ 23.1.2005, 19:02)
ИМХО лучше умно в кучу собрать.

Есть идеи как? Я пока не вижу как, хотя код Domestic Cat пока не смотрел.

Автор: sergejzr 23.1.2005, 21:06
Это должен рулевой решать. Там надо всё сравнивать искать пути. Короче работа smile

Автор: Domestic Cat 24.1.2005, 02:31
sergej.z, а там у тебя в подписи не мат ? smile

Пока ишшо идея - нуна предосмотреть вариант козел.

Автор: sergejzr 24.1.2005, 02:47


Цитата(Domestic @ 24.1.2005, 01:31)
нуна предосмотреть вариант

А что с ним?
Такое препроцессор должен убивать. (В смысле тэги хавать)

Автор: Domestic Cat 24.1.2005, 02:49
Дык если препроцессор не написать, кто есть их будет?

Автор: sergejzr 24.1.2005, 03:11
Вот смотри, как на этой страничке текст отображается, так после препроцессора и должно быть.
Текст в таком виде всё равно в каком то месте можно вычитать.

Автор: Domestic Cat 24.1.2005, 03:18
Хм. а инфа о стилях отдельных слов/параграфов где хранится?

Автор: Domestic Cat 24.1.2005, 08:40
Вообще хорошо было бы определиться что писать и как писать. Нужна ли поддержка других языков, может на уровне плагинов, насколько серьезно нужно бороться с матом. Скажем мой код + перевод в транслит и дописание трансляции особых символов убьет мат на 99% при наличии словарей и незнании постящего. Если же он знает о фиче, то тут убрать мат невозможно. Все варианты перебрать не сможем. Можно отдельные буквы цвтом выделять, формировать большие буквы из символов, и пр.


Автор: Zandr 24.1.2005, 12:49
Почитайте комменты к http://algolist.manual.ru/games/fiveinarow.php smile smile smile Это для словаря.

Автор: Domestic Cat 24.1.2005, 13:23
Цитата(Zandr @ 24.1.2005, 03:49)
Почитайте комменты к статье smile smile smile Это для словаря.


smile

Автор: Zandr 24.1.2005, 14:09
Если что - это не я smile

Автор: Се ля ви 24.1.2005, 16:09
Цитата(Domestic @ 23.1.2005, 05:19)
3. Теперь ищем неочевидную гадость со знаками / | \ ^ * типа б/|я. Заменяем на нужные буквы.
Незаменяемые символы выбрасываем.

Ещё ">" и "<" - что бы отсечь, например, слово ">|<опа"

Цитата(Domestic @ 23.1.2005, 05:19)
Выбрасываем все "очевидные" знаки пунктуации: ? , .

Я вот тут подумал - ведь эти знаки можно использовать для создания больших букв в сочетании с концами строк, например:
,
И

И вообще, с псевдо графикой можно огромедные буквы писать на десятки строк - их вообще не отловишь простыми алгоритмами... smile
Придётся, наверное, на них действительно забить. По крайней мере пока - нужно просто определять соответствие позиций в разных строках и если символы псевдографики находятся над-под друг-другом, обрезать их сразу, иначе можно будет писать:
\|/
/|\ опа, и т.д. - поэтому надо в парах отслеживать не только их непосредственный номер, но и номера в строке...

Хотя я посовещался с бывшим админом - пока матершинники не такие догадливые, такого ещё не было, поэтому это пока вобщем-то ждёт...

Автор: sergejzr 24.1.2005, 16:31
Сперва следует реализовать пусть маленькую, но 100% рабочую часть. A потом уже расширять.

Автор: LSD 3.2.2005, 21:34
У меня в процессе реализации возник вопрос: есть необходимость транслитерирования, но для буквы может быть несколько вариантов транслитерации. А если таких букв в слове несколько, то общее колиество вариантов транслитерации слова будет велико. Есть идеи как с этим бороться?

Автор: sergejzr 3.2.2005, 23:47
Цитата(LSD @ 3.2.2005, 20:34)
А если таких букв в слове несколько, то общее колиество вариантов транслитерации слова будет велико. Есть идеи как с этим бороться?

стандартизировать текст smile

Автор: LSD 4.2.2005, 19:10
Цитата(sergej @ 3.2.2005, 23:47)
стандартизировать текст

Поясни.

P.S. Где можно надыбать азбуку транслита?

Автор: sergejzr 4.2.2005, 19:17
Цитата(LSD @ 4.2.2005, 18:10)
стандартизировать текст


Посмотри мой алгоритм в самом начале smile

Цитата(LSD @ 4.2.2005, 18:10)
P.S. Где можно надыбать азбуку транслита?

Их куча, все разные.



Добавлено @ 19:23
Вот наша:
http://forum.vingrad.ru/index.php?act=ST&f=27&t=29188&hl=%C0%E7%E1%F3%EA&view=findpost&p=221352

Автор: LSD 4.2.2005, 19:25
Цитата(sergej @ 23.1.2005, 05:39)
Код
int[][] key;// массив из интервалов. индекс соответствует индексу в plainText, интервал - интервалу в chiffreText
plainText=Хитрый_алгоритм_нормализации_текста(chiffreText, key);
//plainText теперь = "козел";

Ты об этом? smile

Автор: sergejzr 4.2.2005, 19:30
Ну да smile

Автор: LSD 4.2.2005, 19:30
Цитата(sergej @ 4.2.2005, 19:17)
Вот наша:
http://forum.vingrad.ru/index.php?act=ST&f...ndpost&p=221352

Danke sehr.

Автор: sergejzr 4.2.2005, 19:51
Bitte, bitte smile

Автор: LSD 12.2.2005, 18:20
Вот очередная версия, эта вроде работает smile
Принцип следующий:
  • текст разбивается на токены Tokeniser-ом, на выходе получаем массив Token-ов. Каждый Token содержит: первоначальный текст, позицию этого текста, словоформы (это возможные варианты написания этого токена после применения к нему транслитерации, удаления дублирующихся букв и т.п.), и рейтинг этого слова (чем выше тем хуже это слово.
  • по Token-ам прогоняются Transformer-ы, которые и порождают новые словоформы
  • ко всем Token-ам применяются FilterRule, которые изменяют рейтинг слова. рейтинг может не только повышаться, например фильтр разрешенных слов может для слова гребля обнулить рейтинг
  • далее Filter для тех слов рейтинг которых превышает заданный предел, заменяет их на знаки @#$%&*
Для практического применения там еще куча работы, но принцип ясен. Принимается:
  • критика
  • пожелания
  • советы
  • денежные переводы

Автор: sergejzr 12.2.2005, 19:22
Сории, но я когда запускаю, весь ДОС - экран какими то значками заполняется....

Автор: Domestic Cat 12.2.2005, 20:53
Аналогично. Плюс я не пойму зачем рейтинг нужен smile

Автор: LSD 12.2.2005, 22:13
Цитата(sergej @ 12.2.2005, 19:22)
Сории, но я когда запускаю, весь ДОС - экран какими то значками заполняется....

Это потому, что при компиляции надо указать javac -encoding UTF-8. т.к. исходники именно в этой кодировке. Я выложил новую версию, ее можно просто запускать, она уже скомпилена. Файлы читаются и пишутся в родной кодировке ОС. В файле словаря слова нада разделять пробелами, табуляцией или переводом строки.
На данный момент подерживаются следующие преобразования: транслитерация (по винградовскому словарю), замена одинаково пишущихся английских символов на русские, и неких сочетаний спецсимвлов /| = Л, удаление повторяющися букв блииин = блин, разбиение слова на отдельные слова по типу символов (строчные, заглавные, цифры и т.д.) МногоеМОЖНОсказатьОднимСловом = многое можно сказать одним словом. Пока это все кодом, но если будет развиваться дальше, то надо будет вынести в файлы настроек или БД.

Цитата(Domestic @ 12.2.2005, 20:53)
Плюс я не пойму зачем рейтинг нужен

Надо же как-то отделять плохие слова от хороших smile . Можно например в фильтр включить не только мат но просто грубые слова, а исключать их в зависимости от настроек пользователя. В простейшем случае все можно свести к rating > 0.

Автор: LSD 16.2.2005, 23:42
Я произвел некоторые доработки, теперь преобразование замены унифицированно и задается в виде XML, словарь теперь тоже задается в XML, добавлено преобразование позволяющее проводить суперпозицию других преобразований.
Теперь осталось напролнить словарь и потестировать на реальных примерах. Мне нужна помощь по наполнению словаря, т.к. для каждого слова нужны или все словоформы (предпочтительно) или выделить общую часть.

Автор: helloalleo 31.7.2016, 09:07
Есть ли обновления этой темы?

Автор: tigraff 31.7.2016, 12:40
посмотрите http://snowball.tartarus.org/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)