我们正在寻找“巨魔”。碎片算法和余弦相似度



我认为,在互联网上的紧张讨论中,许多人都面临着人们指责他们是机器人,巨魔,并被克里姆林宫,基辅或华盛顿所为。但是,如何真正地识别那些人或仅仅是试图积极地将自己的意见传达给其他人的人呢?



以四个文本(注释)为例:



text_1 = '       ,    '
text_2 = '      ,    ,    '
text_3 = '             '
text_4 = '   ,   ,     ,    '


从人的角度来看,第一条评论和第二条评论肯定有相似之处,它们是写给一个人的,并刻画了他的积极方面。而且它们也与第三和第四文本无关。



在数学方面,您如何得出相同的结果?

比较两个文本中相同单词的数量是很老套的。但是问题立即出现了-如何比较“聪明”和“聪明”两个词文本的合法化并不总是适合的,因为现成的库不支持许多语言。



在这种情况下,有必要使用Shingle算法来拆分n个部分的文本,对于特定任务,根据经验选择其大小。



例:



n = 3的文本1
['', '', '', '', '', '', '', '', '', ' ', ' ', '  ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', '  ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '']




n = 5的文本1
['', '', '', '', '', '', '', ' ', ' ', '  ', '  ', '  ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', '  ', '  ', '  ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '']




让我们通过以下公式计算n(1.9)的第一和第二/第一和第四文本的相似度:



sim = len(set(Shingles_1) & set(Shingles_2)) / len(set(Shingles_1) | set(Shingles_2)))


ShingleSize: 1
0.9166666666666666 / 0.7857142857142857
ShingleSize: 2
0.5196078431372549 / 0.40350877192982454
ShingleSize: 3
0.3404255319148936 / 0.2375
ShingleSize: 4
0.28205128205128205 / 0.18497109826589594 
ShingleSize: 5
0.2289156626506024 / 0.13812154696132597
ShingleSize: 6
0.1896551724137931 / 0.10752688172043011
ShingleSize: 7
0.15730337078651685 / 0.07894736842105263
ShingleSize: 8
0.13333333333333333 / 0.057291666666666664
ShingleSize: 9
0.10989010989010989 / 0.04145077720207254


自然的图片,随着长度的增加,带状疱疹的总数增加,而带状疱疹的总数与总体积的比率降低。因此,对于大量文本,最好使用带状疱疹的长度从5到8,并且在处理短文本(例如,推文或注释)时最好使用2-4。



但是,回到实践中,让我们从流行的俄罗斯娱乐门户网站获取预先收集的数据。链接到kaggle



为了收集最热烈的讨论,选择了标签(部分)-政治,收集的总计:



  • 944个帖子被标记为政治
  • 267,000对他们的评论
  • 其中超过100个字符〜14万个字符


继续执行代码:



清除文本并将其拆分为小块:



def clean_text(text):
    text = text.split('\n')
    text = list(filter(None, text))
    text = ' '.join(text)
    text = re.sub(r"http\S+", "", text)
    text = re.sub(r'[^\w\s]', '', text)
    shingle = [text[i:i + ShingleSize] for i in range(len(text))][:-ShingleSize]
    return ','.join(shingle)


如果我们仅接受长度超过100个字符的注释,则比较迭代次数为: 140,000/140,000--22,这是很多事情,即使在多线程模式下也要花费很长时间。



因此,我们不会成对比较,而是使用余弦相似度与矩阵m * n进行比较, 其中m是行数,可以根据RAM的数量进行选择,而n是列数(所有带状疱的总数); 算法实现:









csrMatrix = []
idArray = []
textArray = []
for i in range(ChunkSize, sparse_matrix.shape[0] + ChunkSize, ChunkSize):
    temp = sparse_matrix[i - ChunkSize:i - 1]
    idArray.append(corpusId[i - ChunkSize:i - 1])
    textArray.append(OriginalCorpus[i - ChunkSize:i - 1])
    csrMatrix.append(temp)

matrixCombinations = itertools.combinations_with_replacement(range(len(csrMatrix)), 2)


m = 20,000和带状疱长度= 8时,我们得到7个矩阵,每个矩阵的大小为20,000 *≈8,800,000,因此有21个比较迭代。已经好多了。



def Sim(A, B, C, D):
    similarities = cosine_similarity(B[A[0]].astype(np.float32), B[A[1]].astype(np.float32))
    x, y = np.where(similarities > similarityPercent)
    res = []
    for k, j in zip(x, y):
        if D[A[0]][k] != D[A[1]][j]:
            res.append((D[A[0]][k], C[A[0]][k], similarities[k][j].item(), D[A[1]][j], C[A[1]][j]))
    return res

s = pool.starmap(Sim, zip(matrixCombinations, itertools.repeat(csrMatrix), itertools.repeat(textArray), itertools.repeat(idArray)))
s = [item for sublist in s for item in sublist]


为了减少占用的空间,我们还使用float32数据类型。它的准确性足以使算法正常工作。



工作结果将输入到MySQL数据库中以进行进一步处理。因此,例如,让我们对注释进行分组,对每个注释及其对的相似度进行计数:



SELECT FirstText, SUM(sim) as c FROM pikabu.similarity GROUP BY FirstId ORDER BY c DESC


热门比赛:



  1. 评论已被删除。原因:该帐户已被删除。
  2. 评论已被删除。原因:侮辱用户。
  3. 评论已被删除。原因:侮辱,粗鲁的沟通和挑衅。
  4. 评论已被删除。原因:禁止发表仅以引起敌对或煽动敌对为目的的评论,也禁止发表带有暴力或骚扰言论的评论。


互联网上政治讨论的标准情况。



丢弃链接,来自管理部门的消息以及其他噪音,我们直接去分析注释的语义负载:



八场比赛
DaimosShip,2020-08-14 23:03:48,

,

DaimosShip,2020-08-14 23:05:41,

,

DaimosShip,2020-08-14 23:05:52,

,

DaimosShip,2020-08-14 23:05:26,

,

DaimosShip,2020-08-14 23:05:22,

,

DaimosShip,2020-08-14 23:07:02,

,

DaimosShip,2020-08-14 23:06:53,

,

DaimosShip,2020-08-14 23:06:18,

,



在五分钟内,一名男子在同一个话题上写了关于白俄罗斯事件的8条相同的信息。该数据库中总共包含260条该作者的消息,快速浏览它们即可清楚地看出对白俄罗斯局势的明显消极态度,用户本人处于领先地位,并称其对手为机器人。



他的兄弟是选举的观察员:



DaimosShip,2020-08-18 22:52:41

我的兄弟是观察员-不允许他们进入任何地方




另外6个匹配项
NoisePanzer,2017-11-20 14:58:26,

17 . , , , 80% ( !) .



NoisePanzer,2017-11-20 15:33:26,

. . ( !) . , , . ( ) , .



NoisePanzer,2017-11-20 15:26:55,

. . . ( !) . , , . ( ) , .



NoisePanzer,2017-11-21 03:51:46,

. . . ( !) . , , . ( ) , .



NoisePanzer,2017-11-21 03:52:14,

. . . ( !) . , , . ( ) , .



NoisePanzer,2017-11-21 03:53:22,

. ( !) . , , . ( ) , .



作者显然是德国历史文学迷



还有另外4个
Kumuj,2018-03-25 01:46:10,

, . ?



Kumuj,2018-03-25 01:53:56,

, . ?



Kumuj,2018-03-25 01:46:26,

, . ?



Kumuj,2018-03-25 01:42:29,

, . ?



该名男子正在寻找巨魔工厂的踪迹。同事好



继续:6个人在不同主题下引用同一本书-当心,将死!
Strannik196,2018-03-21 23:53:00,

:"« , «-22» : , , . , — . , : , , . .— , — . — . . , . , . . :— …»"



Fynjif18,2020-09-09 13:44:56,

.— , — . — , «-22» : , , . , — . , : , , .



wakeonlan,2020-06-23 01:38:29,

«-22» : , , ** . ** , — . , : * , , .



KKirill1992,2017-06-18 00:06:30,

, "«-22»" . , , , . . - ? , ?



nezabuddha,2018-11-01 15:29:56,

ru.m.wikipedia.org/wiki/-22 . , .



ihateyou,2016-09-19 02:52:14,

, «-22» : , , . , — . , : , , . .— , — . — . . , . , . . :— … "«Empire V»"



作者正试图将其余部分的数据传递给苏联支持水平的增长
EtovamneTo,2020-08-18 01:50:22,

, , … . . , 18-24 , , 2008- 2019- , . , , « », . . , , – , ( 18-24- ). , , , , – « » ( 14 ..) «, , » ( 18 ..).https://www.levada.ru/2019/06/24/chernovik/



EtovamneTo,2020-08-18 00:50:15,

, , , , . , IQ . : . : . , 18-24 , , 2008- 2019- , . , , « », . . , , – , ( 18-24- ). , , , , – « » ( 14 ..) «, , » ( 18 ..).https://www.levada.ru/2019/06/24/chernovik/



EtovamneTo,2020-08-27 23:22:35,

. *****(). 18 . . , 18-24 , , 2008- 2019- , . , , « », . . , , – , ( 18-24- ). , , , , – « » ( 14 ..) «, , » ( 18 ..).https://www.levada.ru/2019/06/24/chernovik/



EtovamneTo,2020-09-10 03:32:13,

? ? 25. 2010 44 . 2020 274 . ? . , 18-24 https://www.levada.ru/2019/06/24/chernovik/



EtovamneTo,2020-09-09 19:00:42,

. , 18-24 , , 2008- 2019- , . , , « », . . , , – , ( 18-24- ). , , , , – « » ( 14 ..) «, , » ( 18 ..).https://www.levada.ru/2019/06/24/chernovik/



给出的示例在表面上。为了识别更紧密的关系,有必要将数据集扩展一个数量级,不仅是信息量,而且是时间间隔。这将使得可以更准确地确定围绕其进行讨论的关键主题,其发起者,分析事件的时间戳及其相关性。

但是,即使是在这样的环境中,通过进行详细的手动分析(例如,考虑单个连接),您仍可以找到一些有趣的东西,这为思考和进一步的工作奠定了基础。



GitHub



PS在rayzen 5 1600处理器处理矩阵140,000 * 8800000花费了大约7分钟。



将来,我计划继续这个话题,我将很高兴提出批评和建议。



All Articles