根据他使用的单词发现多个不同用户帐户后面的用户

时间:2012-03-18 11:26:02

标签: algorithm language-agnostic nlp

我想创建算法来区分在不同昵称下在论坛上写作的人。

目标是发现人们匿名注册新帐户到火焰论坛,而不是在他们的主帐户下。

Basicaly我正在考虑使用他们使用的单词并根据相似性或这些单词来比较用户。

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

我在Java中这样做,但我希望这个问题与语言无关。

有任何想法怎么做?

1)如何存储单词/用户?什么数据结构?

2)如何摆脱大家使用的常用词?我必须以某种方式忽略用户特定的单词。也许我可以忽略它们因为它们迷路了。我担心他们会隐藏“用户特定词汇”的显着差异

3)如何识别同一用户? - 以某种方式在每个用户之间计算相同的单词?

我非常感谢你提前的每一条建议。

3 个答案:

答案 0 :(得分:2)

一般来说,这是作者识别的任务,有一些好的论文,如this,可能会给你很多信息。以下是我对此主题的建议。

<强> 1。用户识别/作者识别本身

最简单的文本分类是按主题分类,首先你会采用有意义的词。也就是说,如果你想区分关于苹果公司和苹果公司的文字水果,你会算上“吃”,“橘子”,“iPhone”等字样,但你通常会忽略文章,文字形式,部分等内容。语音(POS)信息等。然而,许多人可能会谈论相同的主题,但使用不同的演讲风格,即文章,单词形式以及按主题分类时忽略的所有内容。因此,您应该考虑的首要问题是为您的算法收集最有用的功能。作者的风格可以用“a”和“the”这样的词的频率来表达,POS信息(例如有些人倾向于使用当前时间,其他人 - 未来),常用短语(“我想要”对比“我是”喜欢“vs.”我想要“)等等。请注意,主题词不应该被完全丢弃 - 它们仍然显示用户感兴趣的主题。但是你应该以某种方式特别对待它们,例如您可以按主题对文本进行预分类,然后区分对其不感兴趣的用户。

完成要素收集后,您可以使用机器学习算法之一来找到文本作者的最佳猜测。至于我,这里有2个最好的建议是文本向量和用户共同向量之间的概率和cosine similarity

<强> 2。区分常用词

或者,在最新的背景下,常见的功能。我能想到的最好的方法是去除所有人或多或少平等使用的单词,为每个这样的特征计算 entropy

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

其中x是一项功能,U - 用户,P(Ui|x) - 第i个用户给定要素x的条件概率,sum是所有用户的总和。

高熵值表明该特征的分布接近均匀,因此几乎无用。

第3。数据表示

这里的常用方法是用户特征矩阵。也就是说,您只需构建表,其中行是用户ID,列是功能。例如。单元格[3][12]显示标准化用户#3使用功能#12的次数(不要忘记按照用户使用的功能总数来标准化这些频率!)。

根据您要使用的功能和矩阵的大小,您可能希望使用稀疏矩阵实现而不是密集。例如。如果您使用1000个功能,并且对于每个特定用户,大约90%的单元格是0,那么将所有这些零保留在内存中是没有意义的,稀疏实现是更好的选择。

答案 1 :(得分:1)

我推荐一种语言建模方法。您可以在每个用户帐户的单词上训练language model(unigram,bigram,parsimonious,...)。这为您提供了从单词到概率的映射,即0到1之间的数字(包括0和1),表示用户使用您在完整训练集中遇到的每个单词的可能性。语言模型可以存储为对,哈希表或sparse vectors的数组。网上有很多用于装配LM的库。

这种映射可以被认为是高维向量,就像在信息检索的vector space model中文档被视为向量一样。然后,您可以使用KL-divergence或任何常用距离指标比较这些向量:Euclidean distancecosine distance等。两个用户向量之间的强相似性/小距离可能表示他们属于同一个用户。

答案 2 :(得分:0)

如何存储字词/用户?什么数据结构?

您可能对用户及其发布的帖子有某种表示形式。我认为你应该有一个单词列表,以及一个对应于每个单词的列表,其中包含使用它的用户。类似的东西:

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

如何摆脱大家使用的常用词?

希望你有一套stopwords。为什么不扩展它以包含论坛中常用的单词?例如,对于stackoverflow,一些最常用的标记名称应符合条件。

如何识别相同的用户?

除了使用基于相似性或基于词频的度量之外,您还可以尝试使用用户之间的交互。例如,user3喜欢/ upvotes /评论每个帖子user8,或新用户以这种方式为其他(较旧)用户做类似的事情。