
أعتقد أن الكثيرين في المناقشات المتوترة على الإنترنت قد واجهوا اتهامات لأشخاص بأنهم روبوتات ومتصيدون ودفع لهم الكرملين أو كييف أو واشنطن. ولكن كيف تحدد حقًا هؤلاء أو الأشخاص الذين يحاولون نقل آرائهم بفعالية إلى البقية؟
خذ على سبيل المثال أربعة نصوص (تعليقات):
text_1 = ' , '
text_2 = ' , , '
text_3 = ' '
text_4 = ' , , , '
من وجهة نظر إنسانية ، هناك بالتأكيد تشابه في التعليقين الأول والثاني ، فهما مكتوبان عن شخص واحد ويميزان جوانبه الإيجابية. كما أنهم لا علاقة لهم بالنصين الثالث والرابع.
كيف تصل إلى نفس النتيجة رياضيا؟
من المفيد مقارنة عدد الكلمات المتطابقة في كلا النصين. ولكن المشكلة تنشأ فورا - كيفية مقارنة عبارة ذكية و ذكية ؟ لا يعد Lemmatization من النص مناسبًا دائمًا ، لأن المكتبات الجاهزة لا تدعم العديد من اللغات.
في مثل هذه اللحظات ، من المبرر استخدام خوارزمية Shingle التي تقسم نص أجزاء n ، والتي يتم تحديد حجمها تجريبياً لمهمة معينة.
مثال:
نص 1 لـ n = 3
['', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', '', '', '', '', '', '']
نص 1 لـ n = 5
['', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', ' ', ' ', '', '', '', '', '', '', '', '', '', ' ', ' ', ' ', ' ', ' ', '', '', '', '']
دعنا نحسب تشابه النصين الأول والثاني / الأول والرابع لـ 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 وظيفة ذات الكلمات الدلالية سياسة
- 267000 تعليق لهم
- منها أكثر من 100 حرف ~ 140 ألف
الانتقال إلى الكود:
مسح النص والتقسيم إلى القوباء المنطقية:
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 حرف فقط ، فسيكون عدد تكرارات المقارنة: ، وهو كثير جدًا وستستغرق المعالجة حتى في الوضع متعدد الخيوط وقتًا طويلاً.
لذلك ، لن نقارن في أزواج ، ولكن مع مصفوفات m * n ، باستخدام تشابه جيب التمام
حيث m هو عدد الصفوف ، والذي يتم اختياره اختياريًا اعتمادًا على مقدار ذاكرة الوصول العشوائي ، و 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 = 20000 وطول الألواح الخشبية = 8 ، نحصل على 7 مصفوفات بحجم 20000 * 8800000 وبالتالي 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
أهم المباريات:
- تم حذف التعليق. السبب: تم حذف هذا الحساب.
- تم حذف التعليق. السبب: إهانة المستخدمين.
- تم حذف التعليق. السبب: الشتائم والتواصل الفظ والاستفزاز.
- تم حذف التعليق. السبب: يمنع نشر التعليقات التي يكون غرضها الوحيد إثارة العداء أو التحريض على العداء ، كما يحظر التعليقات التي تتضمن دعوات للعنف أو التحرش.
الوضع القياسي للنقاش السياسي على الإنترنت.
تجاهل الروابط والرسائل من الإدارة والضوضاء الأخرى ، ننتقل مباشرة إلى تحليل الحمل الدلالي للتعليقات:
ثماني مباريات
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,
,
,
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,
. ( !) . , , . ( ) , .
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,
, . ?
, . ?
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»"
:"« , «-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/
, , … . . , 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 استغرقت معالجة المصفوفة 140،000 * 8800000 حوالي 7 دقائق على معالج rayzen 5 1600.
في المستقبل أخطط لمواصلة هذا الموضوع ، سأكون سعيدًا بالنقد والاقتراحات.