Я новичок в PHP
У меня есть такой массив
$suspiciousList = array( array ("word" => "badword1", "score" => 400, "type" => 1), array ("word" => "badword2", "score" => 250, "type" => 1), array ("word" => "badword3", "score" => 400, "type" => 1), array ("word" => "badword4", "score" => 400, "type" => 1));
У меня возникают проблемы, когда пользователи вводят слова с такими пробелами, как (badw ord1, b adword2 и т. Д.), Или пользователь может вводить как (badword 1)
Как я могу обнаружить или искать комбинации из массива (словарь)?
Моя идея состоит в том, чтобы каждое слово стало массивом, разделенным пробелами.
$ this-> suspiciousPart [] = $ word;
Я пишу следующую функцию
public function deepDetect2() { for($i=0;$i<sizeof($this->suspiciousPart);$i++) { $word = ""; for($j=$i;$j<sizeof($this->suspiciousPart);$j++) { $word .= $this->suspiciousPart[$j]; //var_dump($word); if(strpos(in_array($word, $this->suspiciousList), $word) !== false) { if($this->detect($word) == true) { $i++; } else { $j++; } } else { $i++; } } } }
У кого-нибудь есть другие идеи, как это сделать?
благодаря
Этот вопрос является хорошим началом: как вы реализуете хороший фильтр ненормативной лексики? – и я согласен с заключением, то есть обнаружение всегда будет иметь плохие результаты.
Я бы попробовал эти подходы:
1) Просто определите слова, которые являются вульгарными в соответствии с вашим словарем.
2) Придумайте несколько эвристик, таких как «непрерывная последовательность слов», состоящая из одной буквы »(« badword »), и используйте их для оценки сообщений пользователей. Затем вы можете вычислить ожидаемое количество вульгарных слов: \sum_i^{number of your heuristics} P_i * N_i
, где P_i
– вероятность того, что слово, найденное с эвристикой i
, действительно является вульгарным, а N_i
– это количество слов, найденных эвристиками i
, Я думаю, что вероятностный подход лучше, чем просто заявить, что «этот пост (не) содержит пошлое слово».
3) Пусть модератор решит, действительно ли пост пошлый или нет. В противном случае несовершенство вашего метода автоматической замены, скорее всего, заставит ваших пользователей сходить с ума.
4) Я думаю, что бесполезно искать слова в английском (или турецком?) Словаре, чтобы найти слова, которые на самом деле не являются английскими словами, потому что люди слишком часто ошибаются в словах.
Во всяком случае, вы можете mb_
пробельные символы и использовать ( mb_
) substr_count()
но это приводит к получению ложных срабатываний.
Как сказал Йирка Хельмих, вы можете удалить пробелы (и, возможно, другие специальные символы), а затем искать строку, чтобы найти слова из вашего массива.
public function searchForBadWords($strippedText) { foreach($suspiciousList as $suspiciousPart) { $count = substr_count($strippedText, $suspiciousPart['word']); //you can use str_replace here or something, it depends what you want to achive } }
Проблема в том, что если у вас есть слова, такие как blablabad wordblabla, и вы удаляете пробелы, чтобы обычные слова могли стать плохими словами blablabadwordblabla
(знаете, что я имею в виду?): D
ура
Редактировать: Итак, Ахмад, я вижу, что вы просто получаете слова, распознающие их «» в начале / конце (в ярлыке). Возможно, вам следует попытаться реализовать оба метода: ваш с одним словом и выше, с поиском подстроки. Это зависит и от того, насколько вы заботитесь о производительности. Может быть, вам стоит попробовать сделать несколько решеток или посмотреть, насколько они эффективны?: D
@ f1ames: Я использую следующий код для создания массива.
$words = mb_strtolower($words, 'UTF-8'); $words = $this->removeUniCharCategories($words); $words = explode(" ",$words); //Remove empty Array ! $words = array_filter($words); foreach ($words as &$value) { $newWords[] = $value; } $words = $newWords;
Но я все еще нахожу лучшее решение