В общем, это задача идентификации автора, и есть несколько хороших статей, таких как 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
, не имеет смысла хранить все эти нули в памяти, и разреженная реализация - лучший вариант.