Обнаружить пользователя за несколькими различными учетными записями пользователей по словам - PullRequest
5 голосов
/ 18 марта 2012

Я хотел бы создать алгоритм, позволяющий различать людей, пишущих на форуме под разными псевдонимами.

Цель состоит в том, чтобы найти людей, регистрирующих новую учетную запись на форуме анонимно, а не под своей основной учетной записью.

По сути, я думал о том, как использовать слова, которые они используют, и сравнивать пользователей по сходству или по этим словам.

Users using words

Как показано на рисунке, есть user3 и user4, которые используют одни и те же слова.,Это означает, что за компьютером, вероятно, один человек.

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

Ввод (относится к изображению выше):

<word1, user1>
<word2, user1>
<word2, user2>
<word3, user2>
<word4, user2>
<word5, user3>
<word5, user4>
... etc. The order doesnt matter

Вывод должен быть:

user1
user2
user3 = user4

Iя делаю это на Java, но я хочу, чтобы этот вопрос не зависел от языка.

Есть идеи, как это сделать?

1) как хранить слова / пользователей?Какие структуры данных?

2) как избавиться от общих слов, которые все используют?Я должен как-то игнорировать их среди пользовательских слов.Может быть, я мог бы просто игнорировать их, потому что они теряются.Боюсь, что они скроют существенную разницу в «пользовательских словах»

3) как распознать одних и тех же пользователей?- как-то считать одни и те же слова между каждым пользователем?

Я очень благодарен за каждый совет заранее.

Ответы [ 3 ]

2 голосов
/ 18 марта 2012

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

1. Само распознавание пользователя / идентификация автора

Самый простой вид классификации текста - это классификация по темам, и в первую очередь вы берете значимые слова. То есть, если вы хотите различить текст об Apple, компании и яблоке с фруктами, вы считаете слова «есть», «апельсины», «iPhone» и т. Д., Но обычно игнорируете такие вещи, как статьи, формы слов, части информации (POS) и так далее. Однако многие люди могут говорить на одни и те же темы, но используют разные стили речи , то есть статьи, формы слов и все то, что вы игнорируете при классификации по темам. Итак, первое и главное, что вы должны рассмотреть, это собрать самых полезных функций для вашего алгоритма. Авторский стиль может быть выражен частотой слов типа «а» и «the», POS-информацией (например, некоторые люди склонны использовать настоящее время, другие - будущее), общими фразами («Я бы хотел» против «Я бы хотел»). как "против" я хочу ") и так далее. Обратите внимание, что тематические слова не должны отбрасываться полностью - они по-прежнему показывают темы, которые интересуют пользователя. Однако вы должны относиться к ним как-то специально, например. Вы можете предварительно классифицировать тексты по темам, а затем различать пользователей, не заинтересованных в этом.

Когда вы закончите с набором функций, вы можете использовать один из алгоритмов машинного обучения, чтобы найти наилучшее предположение для автора текста. Что касается меня, 2 лучших предложения здесь - это вероятность и косинусное сходство между вектором текста и общим вектором пользователя.

2. Различающие общие слова

Или, в последнем контексте, общие черты. Лучший способ избавиться от слов, которые более или менее одинаково используются всеми людьми, - это вычислить энтропию для каждой такой функции:

entropy(x) = -sum(P(Ui|x) * log(P(Ui|x)))

, где x - это функция, U - пользователь, P(Ui|x) - условная вероятность того, что i-й пользователь получает данную функцию x, а sum - сумма по всем пользователям.

Высокое значение энтропии указывает, что распределение для этой функции близко к равномерному и, таким образом, практически бесполезно.

3. Представление данных

Общепринятым подходом здесь является матрица пользовательских функций . То есть вы просто строите таблицу, в которой строки - это идентификаторы пользователей, а столбцы - функции. Например. ячейка [3][12] показывает нормализованное количество случаев, когда пользователь № 3 использовал функцию № 12 (не забудьте нормализовать эти частоты по общему числу функций, которые пользователь когда-либо использовал!).

В зависимости от функций, которые вы собираетесь использовать, и размера матрицы, вы можете использовать реализацию разреженной матрицы вместо плотной. Например. если вы используете 1000 функций и для каждого конкретного пользователя около 90% ячеек равны 0, не имеет смысла хранить все эти нули в памяти, и разреженная реализация - лучший вариант.

1 голос
/ 18 марта 2012

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

Такое отображение можно рассматривать как многомерный вектор, точно так же, как документы рассматриваются как вектор в модели векторного пространства .информационного поиска.Затем вы можете сравнить эти векторы, используя KL-расхождение или любую из популярных метрик расстояния: Евклидово расстояние , косинусное расстояние и т. Д. Сильное сходство / небольшоеРасстояние между векторами двух пользователей может указывать на то, что они принадлежат одному и тому же пользователю.

0 голосов
/ 18 марта 2012

как хранить слова / пользователей? Какие структуры данных?

У вас, вероятно, есть какое-то представление для пользователей и сообщений, которые они сделали. Я думаю, что у вас должен быть список слов и список, соответствующий каждому слову, содержащему пользователей, которые его используют. Что-то вроде:

<word: <user#1, user#4, user#5, ...> >

как избавиться от общих слов, которые все используют?

Надеюсь, у вас есть набор стоп-слов . Почему бы не расширить его, чтобы включить часто используемые слова с вашего форума? Например, для stackoverflow некоторые из наиболее часто используемых имен тегов должны соответствовать ему.

как узнать тех же пользователей?

В дополнение к использованию мер, основанных на сходстве или частоте слов, вы также можете попробовать использовать взаимодействия между пользователями. Например, user3 любит / поднимает / комментирует каждое сообщение user8, или новый пользователь делает аналогичные вещи для какого-то другого (более старого) пользователя таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...