Перейти к содержимому


Фотография

Фильтр мата!


Лучший Ответ ECS , 24 Ноябрь 2017 - 04:34

Ой-ой-ой, какая вопиющая жестокость: теперь нормальным поцыкам-кодерам с района придется пояснять за базар бездушной софтине. Лично я бы реализовал подобную систему следующим образом:
 
Для начала создал бы конфиг с запрещенными к употреблению словами в виде отдельного файла:

-- *** - нецензурные слова
{
  ["***"] = true,
  ["*******"] = true,
  ["*****"] = true,
}

Далее загружал бы конфиг по указанному пути, извлекал бы из сообщения игрока отдельные слова и анализировал их на вхождение в конфиг без учета регистра:

local file = io.open("/chat.cfg", "r")
local forbiddenWords = require("serialization").unserialize(file:read("*a"))
file:close()

for word in message:gmatch("[^%s%,%.%:%;%!%^]+") do
  if forbiddenWords[unicode.lower(word)] then
    -- Вещ или бан
  end
end

Использовать string.find(), конечно, удобно, однако слишком велика вероятность случайных банов, как описал мсье Fingercomp. Однако если по какой-то причине тебе все же требуется использовать стандартный поиск, то держи функцию, поддерживающую юникод:

function string.unicodeFind(str, pattern, init, plain)
  if init then
    if init < 0 then
      init = -#unicode.sub(str,init)
    elseif init > 0 then
      init = #unicode.sub(str, 1, init - 1) + 1
    end
  end
  
  a, b = string.find(str, pattern, init, plain)
  
  if a then
    local ap, bp = str:sub(1, a - 1), str:sub(a,b)
    a = unicode.len(ap) + 1
    b = a + unicode.len(bp) - 1
    return a, b
  else
    return a
  end
end
Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 Оффлайн   Stinger

Stinger
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 24 Ноябрь 2017 - 02:46

Здравствуйте!

Хочу написать Фильтр Мата для игры, а именно русских слов , знаю, что это очень сложно, хочу спросить вашего совета, как лучше фильтровать мат!

 

Функция чата примерно такая:

function GameChat(player,message)    -- Функция чата.
  if (string.find(message, "fuck") ~= nil) then  -- Тут будет фильтроваться МАТ
  local block_time = 10    -- Время блокировки чата
  Message(player,"Ваш чат заблокирован на 10 минут за мат!")    -- Показываем уведомление игроку.
  BlockChat(player, block_time)    -- Блокируем чат игроку на 10 минут.
  return 0    -- Запрещаем выводить сообщение в чат.
end
return 1
end

 

Во первых есть проблемы со string.find, если банально написать Fuck он уже не поймает слово, как это можно решить ?

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


Сообщение отредактировал Alex: 24 Ноябрь 2017 - 09:04


#2 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 958
  • Уровень сигнала: 187,35%
  • В игре: 1148 час. 24 мин.

Награды

                                               

Отправлено 24 Ноябрь 2017 - 03:36

Лучше пусть мат человек фильтрует. А то будешь потом за "наносабля" и "оскорблять" банить невинных, как на IT было.


  • ECS, qwertyMAN и Kartze это нравится

#3 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 161
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 13 мин.
  • ГородСанкт-Петербург

Награды

      7               

Отправлено 24 Ноябрь 2017 - 04:34   Лучший Ответ

Ой-ой-ой, какая вопиющая жестокость: теперь нормальным поцыкам-кодерам с района придется пояснять за базар бездушной софтине. Лично я бы реализовал подобную систему следующим образом:
 
Для начала создал бы конфиг с запрещенными к употреблению словами в виде отдельного файла:

-- *** - нецензурные слова
{
  ["***"] = true,
  ["*******"] = true,
  ["*****"] = true,
}

Далее загружал бы конфиг по указанному пути, извлекал бы из сообщения игрока отдельные слова и анализировал их на вхождение в конфиг без учета регистра:

local file = io.open("/chat.cfg", "r")
local forbiddenWords = require("serialization").unserialize(file:read("*a"))
file:close()

for word in message:gmatch("[^%s%,%.%:%;%!%^]+") do
  if forbiddenWords[unicode.lower(word)] then
    -- Вещ или бан
  end
end

Использовать string.find(), конечно, удобно, однако слишком велика вероятность случайных банов, как описал мсье Fingercomp. Однако если по какой-то причине тебе все же требуется использовать стандартный поиск, то держи функцию, поддерживающую юникод:

function string.unicodeFind(str, pattern, init, plain)
  if init then
    if init < 0 then
      init = -#unicode.sub(str,init)
    elseif init > 0 then
      init = #unicode.sub(str, 1, init - 1) + 1
    end
  end
  
  a, b = string.find(str, pattern, init, plain)
  
  if a then
    local ap, bp = str:sub(1, a - 1), str:sub(a,b)
    a = unicode.len(ap) + 1
    b = a + unicode.len(bp) - 1
    return a, b
  else
    return a
  end
end

Сообщение отредактировал Alex: 24 Ноябрь 2017 - 09:11

  • Sharplook, eu_tomat, Kartze и еще 1 это нравится

#4 Оффлайн   Doob

Doob
  • Пользователи
  • Сообщений: 787
  • Уровень сигнала: 23,85%
  • В игре: 146 час. 10 мин.

Награды

                                   

Отправлено 24 Ноябрь 2017 - 06:43

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

#5 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 24 Ноябрь 2017 - 11:02

Ещё один вариант - использовать какой-нибудь бесплатный API типа этого: Детектор грубости.



#6 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 958
  • Уровень сигнала: 187,35%
  • В игре: 1148 час. 24 мин.

Награды

                                               

Отправлено 24 Ноябрь 2017 - 16:44

Ну всё равно. Бывают, опечатываются, когда предлог "для" пишут. Слово — мат, но наказывать-то за него тупо, да?



#7 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 24 Ноябрь 2017 - 16:49

лучче пусть мат на звёздочки меняет



#8 Оффлайн   Stinger

Stinger
  • Автор темы
  • Пользователи
  • Сообщений: 38
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 24 Ноябрь 2017 - 19:53

Спасибо всем за ответы, буду работать над функцией ECS, если появятся новые идеи то с радостью рассмотрю их, вы правы слово из 3-х букв, можно написать очень многими способами, по этому фильтр почти не реальный, ну  я готов рискнуть, Модератор и так будет следить за чатом, просто хотелось бы какую то Автоматическую карающую машину создать)


Сообщение отредактировал Stinger: 27 Ноябрь 2017 - 15:15





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика