Дипломная работа: Речевые маркеры интолерантности и компьютерные инструменты их выявления

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Текст 5 (Газета. Ru):

В Комитете Госбезопасности Белоруссии официально сообщили, что задержали гражданина Украины Павла Шаройко, подозревавшегося в шпионаже, и в данный момент ведут с ним работу. Задержанный признался, что под прикрытием журналиста вел разведывательную деятельность, а сам носит звания полковника ВСУ. Минск уже покинул первый секретарь посольства Украины, которого Шаройко назвал своим куратором.

Первую информацию о том, что в Минске задержан собственный корреспондент «Украинского радио» в Белоруссии Павел Шаройко, обнародовал на своей странице в фейсбуке руководитель Национальной общественной телерадиокомпании Украины Зураб Аласания еще 17 ноября. Тогда же он заявил, что журналисту предъявлено обвинение в шпионаже. https://www.gazeta.ru/politics/2017/11/20_a_10995926.shtml

Текст 6 (Газета. Ru):

Всего год назад в России осторожно высказывали мнение, что в случае избрания Дональда Трампа на пост президента США, в российско-американских отношениях может наступить потепление. Однако система сдержек и противовесов в американской политике не позволила этому потеплению состояться -- судя по всему, гармонизация двустороннего диалога отложена на неопределенный срок. Показательно, что лидеры двух стран до сих пор не смогли определиться, состоится ли их вторая за год встреча или нет.

Еще 3 ноября американский президент Дональд Трамп в интервью телеканалу Fox News заявил, что может встретиться с Владимиром Путиным «на полях» саммита АТЭС во вьетнамском Дананге. «Это очень важная поездка. У нас может быть встреча с Путиным», -- сказал тогда Трамп. По словам главы Белого дома, американская сторона рассчитывает, что Москва согласится «помочь» Вашингтону в урегулировании ситуации в Сирии и на Корейском полуострове. Трамп также добавил, что ему и Путину «нужно поговорить об Украине».

Правда, официально встречу американского и российского лидеров так и не анонсировала ни одна из сторон.

По словам пресс-секретаря Путина Дмитрия Пескова, «соответствующие службы» пока продолжают согласование точного времени и формата встречи двух лидеров. Официальный представитель Кремля уточнил, что обсуждается вариант ее проведения 10 ноября.

«Это будет хорошая возможность обменяться мнениями по самым горячим вопросам -- и международным, и двусторонним. В любом случае, на полях саммита АТЭС оба президента будут иметь возможность переговорить неоднократно, в случае если посчитают это необходимым», -- добавил Песков. https://www.gazeta.ru/politics/2017/11/10_a_10978196.shtml

Текст 7 (РИА Новости):

Вооруженный конфликт в Сирии продолжается с марта 2011 года. Переговоры по урегулированию сирийского кризиса проходят в Астане и Женеве. Площадка "Астана" принимает переговоры по военному аспекту сирийского урегулирования с января, состоялись уже семь раундов встреч. На астанинской площадке было согласовано положение о совместной оперативной группе по мониторингу режима прекращения боевых действий в Сирии и подписание странами-гарантами (Россией, Турцией и Ираном) меморандума о создании зон деэскалации в Сирии. https://ria.ru/politics/20171114/1508771058.html

Текст 8 (РИА Новости):

Президент Института национальной стратегии Михаил Ремизов считает, что Путин сообщит о своем намерении выдвигаться на пост президента России в декабре, но исключил возможность предновогоднего заявления.

"Как раз ближе к тем срокам, которые определены законодательством для начала избирательной кампании. В любом случае очевидно стремление Кремля провести короткую кампанию и не начинать ее раньше времени… Вряд ли это будет "под елку" -- заявление. Логично ожидать того, что это заявление будет сделано в такой активный период для того, чтобы было время его обсудить, обеспечить какую-то качественную информационную волну", -- отметил Ремизов.

Президент Центра стратегических коммуникаций, политолог Дмитрий Абзалов выразил мнение, что президент России может заявить о своем желании переизбираться в ближайшие недели, но определенно до середины декабря.

"Понятно, что это будет до середины декабря. Потому что объявлять под Новый год будет достаточно сложно, потому что, во-первых, декабрь очень насыщен, я напоминаю. У первого лица будет и бюджетное послание, и традиционная итоговая пресс-конференция, и, вероятно, общественные мероприятия. Все это достаточно интенсивно. Какая дата снизу? Вопрос очень открытый… Может быть, даже раньше декабря, в ближайшие недели три-четыре он это сделает", -- предположил Абзалов. https://ria.ru/politics/20171111/1508629201.html

Текст 9 (Луркоморье):

При этом школота может не знать научного факта, что генетическая дистанция между восточноевропейскими ашкенази и сефардами настолько серьезная, что оные вряд ли когда-то могли быть одним народом, из чего следует наиболее правдоподобная, по мнению некоторых, версия, что ашкеназы -- большей частью выходцы из Иудейской Хазарии. На самом деле все объясняется вольным или невольным смешиванием с нееврейским окружением в местах компактного проживания евреев (в течение долгих, блджад, веков). Так, например, треть сефардов оказались потомками испанцев, в незапамятные времена принявших иудаизм, треть -- метисами, и только треть нормальными круглоголовыми арменоидами, какими полагается быть ЕРЖ по всем наукам. Версия же о славяно-хазарском происхождении ашкеназов была впервые озвучена ЕРЖ Полом Векслером, а официальная наука считает её маргинальной. При её упоминании некоторые ЕРЖ и фошысты начинают срать кирпичами, ибо иметь общих праотцов обоим западло, но остальным, как обычно, похуй. https://lurkmore.co/Антисемитизм#.D0.9D.D0.95.D0.9D.D0.90.D0.92.D0.98.D0.A1.D0.A2.D0.AC

Текст 10 (Луркоморье):

Праздник -- условный рефлекс, включающийся у основной части населения планеты при виде определенного набора цифр в графе «дата». Мыслительная цепочка содержит в себе всего три звена «ДД.ММ.ГГ» -- «праздник» -- «отмечать» и у среднестатистического человека не меняется в течение всей жизни.

От праздников все чего-то ждут. Алконавт -- водки, офисный планктон -- халявной жрачки на корпоративчике, поцреоты -- Путина по телевизору, ТП -- чуда. И даже мизантропы ждут. Ждут, когда же всё это закончится.

Стол. Любой праздник теряет своё очарование, если в помещении нет стола. Стол должен быть накрыт скатертью, а скатерть накрыта едой и бухлом. На празднике принято не просто есть и пить, а НАЖИРАТЬСЯ. Если у гостя начала трещать по швам рубашка, а челюсть, поскрипывая, выдает «ещё по одной» -- это хороший знак, праздник удался. В качестве еды сгодится всё, так что радушный хозяин может невзначай скормить завалявшие продукты уже талым гостям. Каждый стол должен содержать: салаты (не менее трёх видов), мясо, гарнир к мясу, закуску к водке, фруктовую тарелку, торт. В особых случаях, необходимо зохавать плоть Самого, подозрительно похожую на хлеб.

Праздничный стол -- это синоним фразеологизма «просрать деньги», используемого в самом буквальном значении: деньги не только просираются, но и выблевываются. А потому следующий атрибут любого праздника -- это… унитаз. https://lurkmore.co/Праздник

Приложение 2

Листинг кода программы на основе словарей

#! /usr/bin/env python

# -*- coding: utf-8 -*-

from tkinter.scrolledtext import ScrolledText

from tkinter.filedialog import *

from tkinter.messagebox import *

from pymorphy2 import MorphAnalyzer

neg=[]

neg1=[]

neutr=[]

neutr1=[]

def _open():

Analyzed_text.delete(0.0,END)

op = askopenfilename(filetypes=[("Текстовый документ",".txt")],defaultextension='.txt')

file = open(op, 'r', encoding='utf-8')

f = ' '.join(file.readlines())

file.close()

for l in f:

Analyzed_text.insert(END, l)

def _save():

global neg, neutr

sa = asksaveasfilename(filetypes=[("Текстовый документ",".txt")],defaultextension='.txt',

initialfile= 'negative_dict.txt',title='Сохранить интолерантный словарь' )

f = open(sa, "w", encoding='utf-8')

for k in sorted(neg):

f.write(k+' ')

f.close()

sa = asksaveasfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt',

initialfile='neutral_dict.txt', title='Сохранить нейтральный словарь')

f = open(sa, "w", encoding='utf-8')

for k in sorted(neutr):

f.write(k + ' ')

f.close()

def lemmatise(X1):

X=[]

m=MorphAnalyzer('C:\\Users\\user\Anaconda3\Lib\\pymorphy2\pymorphy2_dicts_ru\data')

for i in X1:

for k in i.split():

X.append(m.parse(k)[0].normal_form)

return X

def _open_neutr():

global neutr

op_neutr = askopenfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt', initialdir="./",

title="Выберите словарь нейтральных слов",initialfile="neutral.txt")

file = open(op_neutr, 'r', encoding='utf-8')

Tol_list.delete(0.0, END)

f = file.readline()

file.close()

neutr = lemmatise(f.split())

for i in neutr:

Tol_list.insert(END,i+'\n')

neutr1=sorted(set(list(neutr1)))

return neutr

def _open_neg():

global neg

op_neg = askopenfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt', initialdir="./",

title="Выберите словарь интолерантных слов",initialfile="intolerant.txt")

file = open(op_neg, 'r', encoding='utf-8')

Intol_list.delete(0.0, END)

f = file.read()

file.close()

neg = lemmatise(f.split())

for i in neg:

Intol_list.insert(END,i+'\n')

return neg

def _quit():

root.quit()

root.destroy()

exit()

def _about():

showinfo('О программе','Разработчик: Карина Шакирова, НИУ ВШЭ.\n e-mail: korin.sh.1523@gmail.com \n Использована библиотека tkinter. \n Пользуйтесь с удовольствием!')

def finder():

global neg,neutr,neutr1,neg1,op_neg,op_neutr

text=Analyzed_text.get('0.0', END).lower()

words=[]

p='.,?!*:;^%$#@/-()_"\'«»'

for s in p:

text=text.replace(s,'')

for i in text.split():

if re.match(r'[^абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+', i) == None:

words.append(i)

words=lemmatise(words)

found=[]

found_int=0

found_neutr=0

ask_count=0

if manual.get()==1:

for i in words:

if i in neg and i not in found:

found_int+=1

print(i)

found.append(i)

elif i not in neutr and i not in found:

if askyesno('Это же не опечатка?','\'%s\' - реальное слово, а не опечатка?' % i):

ask_count+=1

if askyesno('Добавить слово в интолерантный словарь?','Добавить в интолерантный словарь слово: %s'%i):

found_int+=1

print(i)

neg.append(i)

found.append(i)

else:

found_neutr += 1

neutr.append(i)

elif askyesno('Но всё-таки оно интолерантное?',

'Это слово относится к интолерантной лексике: %s' % i):

found_int += 1

found.append(i)

else:

found_neutr += 1

else:

found_neutr += 1

else:

for i in words:

if i in neg and i not in found:

found_int+=1

print(i)

found.append(i)

else:

found_neutr += 1

if len(words)!=0:

percent=found_int/len(words)*100

else:

percent=None

#print (found_neutr,found_int, len(words))

if askyesno('Обновить списки?', 'Обновить списки нейтральных и интолерантных слов?'):

op_neg = askopenfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt', initialdir="./",

title="Выберите словарь интолерантных слов", initialfile="intolerant.txt")

file = open(op_neg, 'w', encoding='utf-8')

Intol_list.delete(0.0, END)

for k in sorted(list(set(neg))):

file.write(k+' ')

Intol_list.insert(END, k + '\n')

file.close()

op_neutr = askopenfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt', initialdir="./",

title="Выберите словарь нейтральных слов", initialfile="neutral.txt")

file = open(op_neutr, 'w', encoding='utf-8')

for k in sorted(list(set(neutr))):

file.write(k+' ')

file.close()

showinfo('Обнаружено маркеров','Процент интолерантной лексики: {}'.format(percent))

if askyesno('Сохранить маркеры?','Обнаруженные маркеры: {}. \n Сохранить список?'.format(';'.join(found))):

sa = asksaveasfilename(filetypes=[("Текстовый документ", ".txt")], defaultextension='.txt',

initialfile='markers.txt', title='Сохранить обнаруженные маркеры')

f = open(sa, "w", encoding='utf-8')

for k in found:

f.write(k + ' ')

f.close()

print (ask_count)

return neg, neutr

root = Tk()

root.title('Tolerator')

menu_bar=Menu(root)

root.config(menu=menu_bar)

dict_menu=Menu(menu_bar, tearoff=0)

dict_menu.add_command(label='Загрузить нейтральный словарь',command=_open_neutr)

dict_menu.add_command(label='Загрузить интолерантный словарь',command=_open_neg)

dict_menu.add_command(label='Сохранить словари', command=_save)

menu_bar.add_command(label='Открыть файл',command=_open)

menu_bar.add_cascade(label='Словари', menu=dict_menu)

menu_bar.add_command(label='Проверить текст', command=finder)

menu_bar.add_command(label='О программе', command=_about)

menu_bar.add_command(label='Выход', command=_quit)

Frame0=Frame(root,relief=RAISED)

Frame0.pack(fill=X)

Frame1=Frame(root,relief=RAISED)

Frame1.pack(fill=BOTH)

text_label=Label(Frame0, text='Текст для анализа')

text_label.pack(side='left', padx=5, pady=5, anchor=N)

manual=IntVar()

check=Checkbutton(root,text='Ручная доводка',variable=manual)

check.pack(side='right', padx=5, pady=5, anchor=N)

list_label=Label(Frame0, text='Словарь толерантных маркеров')

list_label.pack(side='right', padx=20, pady=5, anchor=S)

list2_label=Label(Frame0, text='Словарь интолерантных маркеров')

list2_label.pack(side='right', padx=40, pady=5, anchor=S)

Analyzed_text=ScrolledText(Frame1,background='white',font=10, width=40, height=35)

Analyzed_text.pack(side='left', padx=5, pady=5, anchor=S)

Intol_list=ScrolledText(Frame1,background='white',font=10, width=25, height=35)

Intol_list.pack(side='left', padx=5, pady=5, anchor=S)

Tol_list=ScrolledText(Frame1,background='white',font=10, width=25, height=35)

Tol_list.pack(side='left', padx=5, pady=5, anchor=S)

root.mainloop()

Приложение 3

Листинг кода классификаторов на основе моделей машинного обучения

# coding: utf-8

from sklearn.model_selection import KFold

from sklearn.linear_model import LogisticRegression

from sklearn.neighbors import KNeighborsClassifier

from sklearn.naive_bayes import MultinomialNB

from sklearn.ensemble import RandomForestClassifier

from sklearn.feature_extraction.text import TfidfVectorizer

from sklearn.metrics import accuracy_score, precision_score, f1_score, recall_score

import numpy as np

import pandas as pd

import re

from nltk import word_tokenize, sent_tokenize

def lemmatise(X1):

from pymorphy2 import MorphAnalyzer

X=[]

m=MorphAnalyzer('C:\\Users\\user\Anaconda3\Lib\\pymorphy2\pymorphy2_dicts_ru\data')

for i in X1:

lemms=[]

for k in i.split():

lemms.append(m.parse(k)[0].normal_form)

X.append(' '.join(lemms))

return X

def proba_extraction(basic_sent, clf, vectorizer):

import operator

current_vectorizer=vectorizer

basic_list=[]

for i in word_tokenize(basic_sent):

if re.match(r'[^абвгдеёжзийклмнопрстуфхцчшщъыьэюя]+', i.lower())==None:

basic_list.append(i)

basic_set=set(basic_list)

new_sents={}

for i in basic_set:

new_list=basic_list

for k in range(basic_list.count(i)):

new_list.remove(i)

new_sents[i]=' '.join(new_list)

base_proba=clf.predict_proba(current_vectorizer.transform(np.array([basic_sent])))

proba_diff={}

for word in new_sents.keys():

new_proba=clf.predict_proba(current_vectorizer.transform(np.array([new_sents[word]])))

proba_diff[word]=base_proba[0][0]-new_proba[0][0]

threshold=0.01

sorted_proba = sorted(proba_diff.items(), key=operator.itemgetter(1), reverse=True)

markers={}

for i in range(len(sorted_proba)):

if sorted_proba[i][1]>threshold:

markers[sorted_proba[i][0]]=sorted_proba[i][1]

return markers

def test(sent_list,clf,vect):

for sent in sent_list:

print(sent)

print (proba_extraction(sent,clf,vect))

test_files=['C:\\Users\\user\\PycharmProjects\\untitled\Тест 1.txt',

Источник: https://otherreferats.allbest.ru/download/1021400/