Контроль повторяющихся слов
У меня нет времени писать это в коде, поэтому, как Энрико Ферма, я просто набросаю на полях :) Но он набрасывал лишь намёки, а я принципы.
Короче, есть такая стилистическая ошибка в текстах - частое повторение одного и того же слова. Это надо отслеживать, и такой инструмент был бы интересен, как писателям, так и вебмастерам, не желающим, чтобы их статьи приняли за поисковый спам.
Я пока не знаю, как удобнее это сделать - на PHP или jS, просто обрисую шаги, которые вижу.
Реально повторения слов можно допускать, главное, чтобы не было повторений рядом. Чтобы упростить задачу, можно сначала разбить текст на абзацы и выполнить проверку на каждом абзаце отдельно.
Алгоритм проверки абзаца выглядит таким образом:
1. разбить исходный абзац Text на массив слов Words - то есть превратить в массив слов, разбив с помощью пробела
2. Провести в массиве Words подсчёт повторов для каждого слова. В PHP для этого есть встроенная функция array_count_values, кстати.
3. Найти все слова, для которых число повторов превышает заданный предел для абзаца - скажем 2. Но в абзаце, по хорошему, это должно быть 1. Переписать эти слова в массив BadWords
4. Пройтись по массиву BadWords и с помощью функций поиска-замены заменить все эти плохие слова в исходном Text на те же слова, только выделенные тегами или восклицательными знаками.
5. Вернуть новый абзац.
Есть очевидная проблема - повторяющиеся слова могут стоять в разных падежах и формах. Это можно обойти, отбрасывая по 2-3 знака с конца. То есть будем ликвидировать окончания в массиве Words. Количество отбрасываемых символов можно настраивать в зависимости от длины слова.
Такой фокус не избавит нас от повторения однокоренных слов (тоже грубая стилистическая ошибка), но избавит от повторения одного и того же слова в разных падежах - по крайней мере, в русском языке это должно работать, где разные формы слова чаще всего определяются разными окончаниями.
проверка догадки
- игра
- игрой
- игры
- играми
- игре
- играя
Черт, разное количество знаков…. Ха, я понял! Додумываю на ходу - проще не отбрасывать с конца N знаков, а ОСТАВЛЯТЬ N ЗНАКОВ с начала. Ок, так и запишу.
Кстати, последнее слово в проверке показывает, что таким методом можно частично ликвидировать и однокоренные слова. Не все, но тоже бонус.
Вторая мини-проблема - служебные частицы, союзы и предлоги. Их просто выносим из массива Words после его получения, проверяя минимальную длину (скажем 3 буквы). Это не избавит нас от повторения слов типа “эмо”, но от многих других должно помочь.
Хотя…. Какого черта? Пусть минимальная длина будет 1. Пусть авторы стремятся разнообразить даже служебные частицы. Многократное “и” (и жизнь, и слезы, и любовь - для примера) - так и быть, можно оставить. А вот для-для-для и прочие подобные пассажи - в баню!
Такой простой фильтр помог бы значительно улучшить качество текстов - даже при написании рассказов на конкурсы фантастики. К сожалению, я сейчас не могу это реализовать, так как у меня нет даже восьми лишних часов, которые, по моим прикидкам, требуются для “коробочной” версии этой утилиты как в виде плагина WP, так и в виде standalone-сервиса.
Да, надо будет делать это сразу в виде стандалоне-сервиса, чтобы сразу убить многих зайцев.
.
.
.
PS.
дополнительные мысли
1. разбивку текста на абзацы делать с проверкой размера - многие херачат гигантские абзацы, как Джеймс Джойс (у него в романе Улисс, по-моему, всего несколько абзацев).
2. А можно сразу разбивку на абзацы делать по M знаков, скажем по 300. При этом - внимание! - резать тексты надо по последней точке, то есть чтобы не рвалось посреди слова, а бралось законченное предложение. Старый и примитивный хак, но его ещё в эпоху “ушек” на сайтах забывали часто сделать.
3. Все переменные, разумеется, настраивать по желанию юзера.
4. Обработка текста так - засасываем первые 300 знаков или меньше, сколько получится, если “ломать по точке”. Оставляем указатель сразу после точки, полученный кусочек текста форматируем нашей чудо-функцией (то есть выделяем повторяющиеся слова), возвращаем в текст. Экономно и практично, а если текст большой - юзер будет видеть прогресс.