「トロール」を探しています。シングルアルゴリズムとコサインの類似性



インターネットでの緊迫した議論の多くは、彼らがボット、トロールであり、クレムリン、キエフ、またはワシントンによって支払われたという人々の非難に直面していると思います。しかし、他の人に積極的に意見を伝えようとしている人や単に人を実際に特定するにはどうすればよいでしょうか。



たとえば、4つのテキスト(コメント)を考えてみましょう。



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


人間の観点からは、最初と2番目のコメントには間違いなく類似点があり、それらは1人の人物について書かれており、彼の肯定的な側面を特徴づけています。また、テキスト3と4とは何の関係もありません。



数学に関してどのようにして同じ結果に到達しますか?

両方のテキストで同じ単語の数を比較するのは大変です。しかし、問題はすぐに発生します-スマートスマートという言葉をどのように比較するのですか?既製のライブラリは多くの言語をサポートしていないためテキストのレマタイゼーションは必ずしも適切ではありません。



そのような瞬間に、n個の部分のテキスト分割するシングルアルゴリズムを使用することは正当化されます。そのサイズは特定のタスクのために経験的に選択されます。



例:



n = 3のテキスト1
['', '', '', '', '', '', '', '', '', ' ', ' ', '  ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', '  ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '']




n = 5のテキスト1
['', '', '', '', '', '', '', ' ', ' ', '  ', '  ', '  ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', '  ', '  ', '  ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '']




n(1.9)の1番目と2番目/ 1番目と4番目のテキストの類似性を次の式で計算してみましょう。



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 =2万とシングル長= 8、我々はサイズ20,000 *≈8800,000の7つのマトリックス、従って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. コメントを削除しました。理由:敵意または敵意を扇動することを唯一の目的とするコメントを投稿することは禁止されており、暴力または嫌がらせを要求するコメントは禁止されています。


インターネット上での政治的議論の標準的な状況。



リンク、管理者からのメッセージ、およびその他のノイズを破棄して、コメントの意味的負荷の分析に直接進みます。



8試合
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,

,



5分で、ある男性がベラルーシでの出来事に関して同じトピックで8つの同じメッセージを書きました。合計260のこの作者のメッセージがデータベースに入りました。それらを一目見れば、ベラルーシの状況に対する明確な否定的な態度が明らかになります。ユーザー自身が時代を先取りしており、敵のボットを議論として呼んでいます。



そして彼の兄弟は選挙のオブザーバーでもありました:DaimosShip、2020-08-182252



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»"



著者は、USSRのサポートレベルの成長に関するデータを残りの部分に伝えようとしています。
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/



与えられた例は表面上にありました。より緊密な関係を特定するには、情報の量だけでなく、時間間隔によってもデータセットを1桁拡張する必要があります。これにより、ディスカッションが構築されている主要なトピック、その開始者をより正確に識別し、イベントのタイムスタンプとそれらの相関関係を分析することが可能になります。

しかし、そのようなセットでも、たとえば単一の接続を考慮した詳細な手動分析を使用すると、興味深いものを見つけることができ、思考とさらなる作業の根拠が得られます。



GitHubの



PS処理* 880000014万がrayzen 5 1600プロセッサ上で7分程度かかりましたマトリックス



将来的には、私は私が批判や提案に喜んでいるでしょう、このトピックを継続する予定。



All Articles