?

Log in

No account? Create an account
Фейл - В Северном Ледовитом
June 22nd, 2013
13:43

[Link]

Previous Entry Share Next Entry
Фейл
Хотел написать скрипт, чтобы в публикуемых статьях на сайте boychoir.ru автоматически проставлялись тэги по всем именам собственным (сейчас тэги проставляютя вручную, и авторы часто ленятся это делать). Ведь, в принципе, найти имена собственные не так сложно: нужно искать все слова, начинающиеся с прописной буквы и стоящие не после точки. Можно даже сразу определять сочетания имён и фамилий — это рядом стоящие, не разделённые знаками препинания слова с прописных букв.

Понятно, что имена в тексте по всякому склоняются, видоизменяются (например, может быть написано «Пашка» вместо «Павел»). Однако можно было бы, как минимум, выдавать список имён, а дальше автор уже сам мог бы отредактировать его, превратив в список тэгов.

Ничего не вышло: php не дружит с юникодом, и парсить русский текст оказалось весьма затруднительно.

Tags: , ,

(20 comments | Leave a comment)

Comments
 
[User Picture]
From:wildcat78
Date:June 23rd, 2013 09:48 pm (UTC)
(Link)
1. http://php.net/manual/ru/ref.mbstring.php не?
у меня работает, если че... по крайней мере для реализации алгоритма из п.2 степень кривизны приемлимая ;)

2. "искать все слова, начинающиеся с прописной буквы и стоящие не после точки" сработает не всегда - например, точно не сработает на предложении "Павел пошел на...", если оно будет не первым в тексте ;)

более надежно будет искать вхождения имен из базы персон, уже упомянутых на сайте.
возможно, "нечетким" поиском - тем самым убирая проблемы со склонениями.
[User Picture]
From:ptrue
Date:June 24th, 2013 09:20 am (UTC)
(Link)
1. Спасибо, да, работает. С некоторыми ограничениями. Часть стандартных php-шных строковых функций пришлось всё-таки переписать самому.

2. Да, имена, стоящие в начале фраз, скрипт проигнорирует. Но это встречается довольно редко.

Искать вхождения из базы персон — тоже вариант, но дополнительный. Попробую. Хотя искать нечётким поиском я не умею. Ты знаешь варианты? В любом случае, это именно дополнительный вариант, поскольку часто в статьях упоминаются имена собственные, отсутствующие в базе: левые действующие лица, композитор, географические названия и т. д.

Пока что всё это дело работает вот так: http://boychoir.ru/test/tagsearch/?articleId=437
Соответственно, тэги, которые уже есть в базе, оформлены, как ссылки. Их можно добавлять безоговорочно. С остальными надо что-то делать.
[User Picture]
From:kivagant
Date:June 24th, 2013 12:01 am (UTC)
(Link)
php не дружит с юникодом? о.О Что за странное утверждение.
Ну а по-поводу определения имён — мне кажется достаточно выбирать любые слова, которые начинаются с заглавной буквы, т.к. имя может стоять и в начале предложения.
Я бы реализовывал эту задачу в отложенном режиме. Т.е. после написания статьи запускал бы асинхронную обработку, которая по результатам разбора текста отправляла бы автору уведомление: найдены такие-то имена собственные, зайдите отредактируйте если что не так.
[User Picture]
From:ptrue
Date:June 24th, 2013 09:13 am (UTC)

Дружба с юникодом

(Link)
Ну, кагбэ, половина стандартных функций с юникодными строками не работает. Например, пришлось написать свои аналоги для ctype_upper, ctype_alph и т. д.

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

Асинхронная обработка — да, идея хорошая, спасибо. Наверное, так и сделаю.
[User Picture]
From:kivagant
Date:June 24th, 2013 09:45 am (UTC)

Re: Дружба с юникодом

(Link)
Зачем же начальное слово каждый раз в список тегов ложить. Оно туда попасть должно только если найдено совпадение по словарю, с учетом склонений. Другое дело, насколько полным будет этот словарь. Хотя тут вопрос — кого надо теггировать. Судя по сайту, там не требуется в тегах видеть какого-нибудь непонятного персонажа. Состав причастных к хору заранее известен, их ФИО можно во всех склонениях внести в базу и перебор делать по ней, при чем без учета регистра вообще — мало ли как опечатаются.
[User Picture]
From:ptrue
Date:June 24th, 2013 09:51 am (UTC)

Re: Дружба с юникодом

(Link)
Теггировать желательно всех — не только тех, кто в базе участников.

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

Теперь всё работает вот так: http://boychoir.ru/test/tagsearch/?articleId=439

(тэги, имеющиеся в базе, подчёркнуты, как ссылки)

Перебор во всех склонениях, да ещё и в базе иметь, это, по-моему, жестоко по отношению к базе. Можно ведь, наверное, имена из базы просто на лету склонять и сравнивать с кандидатами?
[User Picture]
From:kivagant
Date:June 24th, 2013 10:27 am (UTC)

Re: Дружба с юникодом

(Link)
Склонять имена — гиблое дело. Это очень непростая задача.
[User Picture]
From:kivagant
Date:June 24th, 2013 10:31 am (UTC)

Re: Дружба с юникодом

(Link)
А хранить в базе со всеми склонениями на самом деле не слишком-то тяжело. Используй nosql, если есть возможность на сервере что-нибудь разворачивать. При желании можно добиться большой скорости выборки. Вопрос в объеме такой базы и мощности сервера.
[User Picture]
From:ptrue
Date:June 28th, 2013 06:18 am (UTC)
(Link)
Реализовал вариант с базой. Работает :)
База пополняется по мере поступления новых склонений/вариантов вручную. Т.е. когда вылез какой-нибудь вариант типа "Женю Иванова", мы кликаем по нему и сообщаем, что это алиас для основного тэга "Евгений Иванов". И далее каждый раз для найденного алиаса автоматом будет использоваться основной.
(Deleted comment)
From:ptrue
Date:June 28th, 2013 06:11 am (UTC)
(Link)
Я реализовал хитрый вариант с базой алиасов.
Первый раз, когда автоматически отыскивается "Пашка", мы вручную можем вбить, что это алиас для тэга "Павел", и уже в следующий раз, когда в тексте найдётся "Пашка",— вместо него автоматически вылезет "Павел" :)
From:ptrue
Date:June 28th, 2013 06:26 am (UTC)
(Link)
Другая проблема — как избавиться от HTML-разметки. Потому что, допустим, встретится там что-то типа "Франкфурте-<nobr>на-Майне</nobr>" — и тэг пропадает. Ну и анализировать хэш-коды для вставленного видео тоже как-то большой нужды нет.

Вот бы одной командой выкинуть всю разметку и оставить только текст...
[User Picture]
From:ptrue
Date:June 24th, 2013 09:53 am (UTC)
(Link)
Думаю, что если нашлись имена, уже имеющиеся в базе тэгов, то их можно добавлять в тэги статьи вообще без спросу, правильно?
[User Picture]
From:kivagant
Date:June 24th, 2013 10:26 am (UTC)
(Link)
Конечно, особенно если это участники хора. Я вообще в данном случае придерживался бы варианта — добавить+уведомить. Т.к. в ином случае зайти и подтвердить не каждый захочет, смысл затеи теряется.
From:ptrue
Date:June 28th, 2013 06:19 am (UTC)
(Link)
Можно и не уведомлять. Когда автор постит статью, он сразу просматривает результат со списком автоматически добавленных тэгов и со списком предлагаемых, и он сразу может отказаться от какого-то из добавленных или добавить новый.
(Deleted comment)
From:ptrue
Date:June 28th, 2013 07:08 am (UTC)
(Link)
Ну вот ещё, вводить верификацию тэгов? Слишком много чести. Сделал добавление автоматом, и все счастливы. Если лишний тэг добавится (а это ооочень редкий случай), то автор статьи сразу это заметит, и его уберёт.
(Deleted comment)
From:ptrue
Date:June 28th, 2013 11:54 am (UTC)
(Link)
А мне показалось, ты предложил дополнительный промежуточный шаг.
Потому что тэги, которые автоматически добавились, сразу становятся видны всем. Если случайно добавилось лишнее, ничего страшного: посетители не умрут. Т.е. система постмодерируемая, а не премодерируемая :)
(Deleted comment)
Powered by LiveJournal.com