Морфологический анализатор

Dimonets

Guest
Морфологический анализатор

Есть вопрос.

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

Но! Появилась проблема - многие юзеры из-за лени заполнять эту форму вводят туда чтото типа: "abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc abc" чтобы преодолеть проверку.

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

Появилась идея проводить поиск предлогов, артиклей и специальныз часто встречаемых глаголов типа: "a the is are do does did have has had will 'll 'm 'd was were" а также инговых окончаний "ing".

Проблема в том что я незнаю как лучше сделать подобную проверку, может кто подскажет какое-то регулярное выражение или алгоритм? Проблема усугубляется еще и тем что текст может быть всего-лишь длинной 50 символов, и там могут встречаться искомые предлоги и частицы не часто.

Подскажите плиз.

Спасибо.
 

Кром

Новичок
Dimonets, направь свою бурную энергию в другое русло. Засавляь юзера что-то писать очень плохой тон. А уж делать морфологические проверки глупо вдвойне.
 

Dimonets

Guest
А мне очень надо!

Мне это очень надо!

Юзерам тоже - нет ничего хорошего в юзере который регистрируется и помещает в свое инфо фуфню всякую! Текст из 50 символов несложно набрать и много времени не займет!
 

Dimonets

Guest
Ну пожалуйста!

Ну пожалуйста!

Хоть какой то алгоритм подскажите! Хоть просто словами расскажите куда мне копать.

Очень надо.

Спасибо.
 

Кром

Новичок
Копать в поиск.

А алгоритм простой.
Текст введенный юзером делишь на слова.
Затем ложишь все эти слова в массив.
Перебираешь массив сравнивая с базой слов.

P.S. Все это будет очень тормозить. База со словами должна быть очень большая, чтобы учитывать все падежи и окончания. Нужно использовать различные регулярные выражения и прочее.
Если ты еще не понял, тыы фактически будешь делать фрагмент поисковой системы, причем самое сложное звено.
Успехов.
 

Фанат

oncle terrible
Команда форума
Меня умиляют такие "аргументы".

сразу представляешь себе шестилетнего карапуза за компом, испуганно вцепившегося в игрушку, и повторяющего только один аргумент - "А мне надо!!!! Мне очень надо!!!", и ничего более осмысленного.

Детский сад...
 

Dimonets

Guest
2 Krom:
спасибо, это вариант. Но как определить после обхода всех слов действительно ли это английский текст? По процентному соотношению? Или как? Вот как раз это и интересует меня больше всего. Проблема упрощается - поскольку в английском языке нет падежей и прочего. Нужно искать окончания, артикли, и простые глаголы времени to do.

Допустим я нашел глагол "am"
то текст может выглядить как:
"I am a cool man!" (идеальный вариант)
или же:
"am am am am am" (спам)

Те может как-то оценивать процентное соотношение "глаголов"(не может быть более 50-60%), "одушевленных существительных типа I We She He His They Her Whom ..." (не может быть более 35%), и "окончаний - ing, ed" (не может быть более 50-60%). Но это НЕ может! В таком случае текст без них - те не английский текст попадает под нашу проверку. А вот как определить минимальные соотношения???

2 фАНАТ:
Сайт на котором это будет применяться уже создан - он зарубежный - международный (но все должно быть только на английском) и платный. Мне не нужны там тексты ни на немецком, ни на русском, ни на французском, ни на языке Гватемалу. Кроме того мне не нужны там наборы непонятных слов, я позволяю юзерам регистрироваться бесплатно на срок до 1 месяца, и я считаю, что если я даю возможность пользователям пользоваться бесплатно какое-то время, то они должны уважать правила сайта и других пользователей, которые будут интересоваться информацией о них!
 

Кром

Новичок
Ну знаете батенька, это уже слишком! :)
Боюсь что ты в этом будешь одним из первопроходцев. Ничего похожего (хорошего и бесплатного) еще не видел. Так что думай сам.
Таки не думаю, что этого следует хотеть.
 

Linker

Guest
Dimonets:

Это напоминает борьбу с нецензурными сообщениями введёнными пользователем (кто будет спорить с тем, что бороться с этим "очень надо" ?), но ведь это не возможно!
Всегда можно придумать вариант, чтобы обойти любые проверки, отсюда вывод - игра не стоит свеч.
В таких случаях, если очень очень нужно, единственный выход, имхо, круглосуточная модерация, больше никак.
 

Dimonets

Guest
Ой прикольно!

Это то что надо!

Ты не мог бы мне показать код? Плз.
Если можешь пришли плз на [email protected]
Меня как раз такая простая проверка и интересует.

Кстати я тут рылся в инете и нашел кое что. Правда без исходников, зато очень жесткая вещь! Кому интересна эта тема, смотрите:
http://complingone.georgetown.edu/~langid/index.html
это специально разработанный алгоритм для определения языка, для меня он не подходит поскольку для более менее точного определения требуется минимум 200 символов. Но зато отлично работает с 1000 символами и больше.

Спасибо!
 

fixxxer

К.О.
Партнер клуба
Я щас покажу код, и топик можно будет переносить в юмор. :)
 

fixxxer

К.О.
Партнер клуба
PHP:
<?

$MINGZRATIO = 77;

if (isset($_POST['text'])) {

$txt = $_POST['text'];

if(strlen($txt)<50) {
  echo "It's too short, enter at least 50 chars please!<br>\n";
} else if(strlen(gzcompress($txt,9)) * 100 / strlen($txt) < $MINGZRATIO) {
   echo "<font color=red>It seems that you have entered some shit, man! Try again!</font><br>\n";
} else {
   echo "<font color=green>It's OK!</font><br>\n";
}

}

?>

<form method=post>
Tell us something about yourself, please:<br>(at least 50 characters)<br>
<textarea onKeyPress="document.forms[0].elements['chars'].value=document.forms[0].elements['text'].value.length+1;" rows=8 cols=50 name=text></textarea>
<input type=text name=chars disabled> chars entered<br><br>
<input type=submit value="OK">
</form>
 

Dimonets

Guest
хм

Странно, но эта штука вроде работает.

Как я понял - она пытается ужать текст и если у нее это получается, сжаты текст сравнивается с длино исходного текста, и как мне кажется они не должны сильно отличаться поскольку слова из 50 символов, если они разные - сильно не ужмешь.

Я правильно понял?

Если да то это не решает проблемы языков тумба-юмба а также транслита. Но зараза со спамом пытается бороться - это приятно!

Но тем не менее нужны более совершенные решения - трансит не должен прокатывать.

Спасибо.
 

fixxxer

К.О.
Партнер клуба
да все ты правильно понял. оно по большому счету ничего кроме фильтрации инпута типа qwe qwe qwe asd asd asd xxx не делает - просто мне было интересно что получится из идеи с gzcompress :) но как элемент такого верификатора вполне можно использовать, как оказалось. :)
 

Dimonets

Guest
Я нашел выход!

Вот смотрите и качайте!
Исходные коды на перле но там всего 2 странички - переписать на пхп - нечего делать. Используется специальная база со значениями буквосочетаний для каждого языка. База там прилагается. Если текст 60-70 символов по идее определит на 99% точно.

http://odur.let.rug.nl/~vannoord/TextCat/Demo/

Это как второй шаг моей проверки (напомню первый был - определение что длина текста больше 50 символов и проверка на символы до номера x7F - те все символы латинского алфавита и служебные символы). Как второй шаг проверка на язык текста подходит тоже.

И вот для третьего шага (для избежания ситуации "I am I am I am I am Was Were Had", те спама английскими словами) можно использовать код flixxa. Но пока я не уверен. Кто-нибудь может точно сказать, не возникнет ли некорректной ситуации с корректным английским текстом в коде с gzcompress?

Спасибо.
 

Dimonets

Guest
Результаты тестирования

Только что протестил найденный скрипт на 30 действующих профайлах.

В большинстве своем все профайлы содержат текст из 10-15 слов. В результатах 70% процентов определено как English и 30% как Scots (шотландский). Что не есть плохим результатом! Если учесть что слов очень мало для точной проверки. Кроме того есть предположение что если удалить файл базы шотландского языка, система все же будет определять его как английский.

Теперь интересует все же вопрос насчет gzcompress. Можно ли его использовать и какие могут быть последствия (всегда ли корректно будет работать приведенный выше код)? А кроме того, установлен ли gzcompress по умолчанию на большинстве серверов с php?

PS. Кстати код с gzcompress как выяснилось еще и решает проблему повторяющихся знаков препинания! Типа: . . . . . . . . . . . . . . ! ! . . . . . . . . ! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Хотя по идее такие постинги не пройдут проверку на втором этапе определения английского текста.
 

Кром

Новичок
О чем тут говорить. Этот скрипт с gzcompress полная профанация. На каждом втором фрагменте текста он ошибается. Это действительно из области сатиры и юмора.
 
Сверху