Предположим, у нас есть база данных:
Actions_tbl:
-------------------------------------------------- ------ id | Action_name | user_id | -------------------------------------------------- ------ 1 | Джон читает одну книгу | 1 2 | чтение книги Джона | 1 3 | Джо прыгает через огонь | 2 4 | чтение другой книги | 2 5 | Джон читает книгу в библиотеке | 1 6 | Джо прочитал книгу | 2 7 | читать книгу | 3 8 | прыжок без причины - привычка Рональда | 3
Users_tbl:
----------------------- user_id | user_name | ----------------------- 1 | Джон 2 | Джо 3 | Рональд 4 | Араз -----------------------
Интересно, могу ли я выбрать наиболее повторяющееся подобное действие независимо от его пользователя и заменить собственное имя пользователя своим текущим пользователем!
Прочитайте одну книгу, прочитайте книгу, прочитайте другую книгу, прочитайте книгу в библиотеке, прочитайте книгу и прочитайте книгу – это те, у кого есть самые распространенные СЛОВА, поэтому сотрудники, связанные с чтением книги, повторяются 6 раз, моя система должна показывать одно из этих шести предложений случайным образом и заменить Araz на user_name
Например: Араз читает книгу
Моя идея заключалась в том, чтобы
select replace(a.action_name , b.user_name) from actions_tbl a, user_tble b where a.user_id = b.user_id group_by
а затем проверить сходства по одному в php, используя
levenshtein()
Но у этого нет производительности вообще!
Предположим, что я хочу сделать то же самое для большого db и для нескольких разных таблиц. Это уничтожит мой сервер !!!
Любая лучшая ИДЕЯ?
в http://www.artfulsoftware.com/infotree/queries.php#552 функция levenshtein () реализована как функция MySQL, но, во-первых, вы думаете, что она обладает достаточной производительностью? а затем, как его использовать в моем случае? Может быть, автомат для самостоятельной работы исправить эту проблему, но я не так хорош с sql!
* Подобное действие, действия, которые имеют более X% общих слов
** Дополнительная информация и примечания: **
Я ограничен PHP и MySQL.
Это просто пример, в моем реальном проекте действия – это длинные абзацы. Вот почему производительность – это вопрос. Реальный сценарий: пользователь вводил описание своего проекта для нескольких проектов, эти данные могут быть слишком похожими (пользователи будут иметь одинаковую область работы), я хочу автоматически заполнить (базу на предыдущих заполнениях) описание следующего проекта, сэкономить время.
Я был бы признателен, если бы у вас было какое-нибудь прагматическое решение. Я проверил связанные с НЛП решения, хотя они интересны, но я не думаю, что многие из них могут быть точными и могут быть реализованы с использованием PHP.
Результат должен иметь смысл и быть соответствующим абзацем, как и все другие проекты. Вот почему я подумывал о выборе из предыдущих.
Спасибо за ваши интеллектуальные ответы, его действительно оценили, если бы вы могли пролить свет на ситуации
То, о чем вы говорите, это процесс текстовой кластеризации. Вы пытаетесь найти похожие фрагменты текста и произвольно выбираете один из них. Я не знаком с какой-либо базой данных, которая делает эту форму интеллектуального анализа.
Для того, что вы описали, вероятно, будет работать довольно простой метод интеллектуального анализа текста. Создайте матрицу term-document со всеми словами, кроме имен пользователей. Затем используйте разложение сингулярных значений, чтобы получить наибольшее сингулярное значение и вектор (это первый главный компонент корреляционной матрицы). Подобные действия должны группироваться вдоль этой линии.
Если у вас ограниченный словарный запас и есть условия в таблице, вы можете измерить расстояние между двумя действиями на долю слов, которые перекрываются. У вас есть список всех слов в действиях?
Во-первых, вам нужно будет решить, хотите ли вы сравнить данный вход со всеми существующими текстами или провести парное сравнение всех текстов. Ваш вопрос задает последний вопрос, но приложение, которое вы начертаете, похоже на первое.
Если вы сравните только один вход с вашей базой данных, то я бы надеялся, что вычисление расстояния levenshtein будет достаточно быстрым до средних размеров базы данных. И, вероятно, будет несколько способов сделать что-то быстрее, если вы не сохраните некоторую форму промежуточной структуры данных о текущем содержании вашей текстовой базы. Перерасчет чего-либо для каждого нового ввода, вероятно, будет столь же дорогостоящим.
Если вы хотите сделать сравнение для каждой пары, то вычисление levenshtein для каждого из них займет слишком много времени. Вам придется придумать еще одну концепцию сходства. Первое, что приходит мне на ум, которое было бы несколько устойчиво к различным формам слова, было бы деревом суффикса . Вы можете вставить все абзацы в это дерево. Если деревья суффикса обычно хранят один указатель, вы можете захотеть сохранить пару индексов, один из которых определяет строку базы данных, а другую – позицию в тексте этой строки. После того, как вы построили дерево, вы можете пересечь его, чтобы определить общие подстроки, и увеличить соответствующий счетчик сходства для соответствующей пары. Вам придется немного поэкспериментировать, чтобы настроить эту меру. Вы можете наложить минимальную длину для общей строки, прежде чем увеличивать счетчик. Поскольку длинные тексты имеют больше шансов на общие слова, даже если они семантически не связаны, вам, возможно, придется каким-то образом компенсировать длину. Я сомневаюсь, что есть канонический способ сделать это.
Матричный подход к терминам-документам, предложенный Гордоном, также кажется интересным, и вы также сможете реализовать это на PHP. Этот подход будет чувствителен к изменениям текстовой формы, даже если корень одинаковый. С другой стороны, было бы легче сохранить подходящую матрицу для хранения в вашей базе данных и сохранить синхронизацию этой структуры при обновлении основной текстовой таблицы. Оба эти подхода имеют принципиальное значение для расстояния между левенштейном: они меньше заботятся об общем порядке. Я верю, что это хорошо в вашем случае, потому что они рассмотрят тексты «Джон читал книгу после того, как он купался в озере», более похожее на «После купания в озере Джо читал книгу», чем левенштейнское расстояние бы.
Ваш пример указывает на то, что вы не только хотите оценивать сходства, но и принимать решения о границах кластера, т. Е. Говорите «эти формы группы» и «те, которые принадлежат к отдельным группам». Для этого не будет чистого отсечения, поэтому вам придется экспериментировать с эвристикой для этого. Если для вашего приложения недостаточно обычного текста наиболее подходящего текста или большинства наиболее похожих текстов. В любом случае, я сначала сосредоточусь на вычислении подобия и добавлю такие вещи, как замена имени пользователя позже.