在互联网上,许多人分享了他们遭受性骚扰的经历,但随着时间的推移,这些信息逐渐被遗忘。然而,这些信息可以用来有效地自动分类性骚扰事件,本文将帮助理解如何利用机器学习减少性骚扰事件的发生。通过分类,可以更好地分析数据,并为社会变革者提供支持。此外,数据的聚合也将成为可能,这对于加快当局的行动至关重要。
自动分类性骚扰类型将使希望改变社会的人能够更好地分析数据,这就是为什么使用机器学习识别性骚扰将是一个游戏规则改变者,并确保不再发生此类不可预见的事件。通过分类,数据的聚合也将成为可能,这可能是一个重要的用例,使当局能够更快地采取行动。
将利用自然语言处理(NLP)技术来正确分类性骚扰类型,因为手动对每个事件进行分类和采取行动需要大量的时间和精力。使用单标签和多标签分类来自动填写在线事件报告,并根据虐待类型对数据进行分类和总结。
数据收集自Safecity,这是一个收集公共场所犯罪匿名报告的平台。选择了三个最密集的类别:groping/touching、staring/ogling和commenting,作为数据集,总共有13个不同的类别,其他类别较为稀疏。每个描述可能属于无、一些或全部类别。提供给数据已经分为训练集、测试集和验证集,使用了相同的数据分割组合来训练模型。
将使用以下评估指标:对于二元分类,使用准确率;对于多标签分类,使用汉明损失。汉明损失可以定义为错误标签与总标签数的比例。
本案例研究参考了论文SafeCity: Understanding Diverse Forms of Sexual Harassment Personal Stories。目标是在使用不同的路线(使用传统的机器学习模型)的同时,匹配论文的结果(使用深度学习技术)。
首先查看目标类别的平衡情况。从下面的图表中可以看出,所有三个数据集(训练集、测试集和验证集)的数据都高度不平衡,有更多不是实际事件的描述,而不是性骚扰事件的描述。
作为预处理的一部分,采取了以下步骤。每个步骤的代码后面跟着一个简短的描述。(文章末尾提供了整个代码库的链接供参考)
# 去重
df_train_og.drop_duplicates(subset="Description", keep=False, inplace=True)
df_train_go.drop_duplicates(subset="Description", keep=False, inplace=True)
df_train_co.drop_duplicates(subset="Description", keep=False, inplace=True)
train_df.drop_duplicates(subset="Description", keep=False, inplace=True)
# 移除标点和停用词
puncts = [',', '.', '"', ':', ')', '(', '-', '!', '?', '|', ';', "'", '$', '&', '/', '[', ']', '>', '%', '=', '#', '*', '+', '\', '•', '~', '@', '£', ...]
def clean_text(data):
stop = stopwords.words('english')
res = []
data['Description'] = data['Description'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))
for x in data['Description']:
x = str(x)
for punct in puncts:
if punct in x:
x = x.replace(punct,' ')
res.append(x)
return res
嵌入描述字段的目的是使机器学习模型能够理解单词,需要一种方法将它们的含义嵌入到向量中,并提供给模型。尝试了两种嵌入策略:
1. 使用TF-IDF向量化器,结合三元组、二元组和单元素特征,最大特征数为50,min_df为15。这些值是通过实验确定的。
2. 使用通用句子编码来嵌入句子。它将可变长度的输入文本转换为512维向量。许多研究论文指出,使用句子级编码器比单词级编码器更有益,因为它保留了上下文信息。
使用了以下机器学习模型进行单标签分类:
1. 逻辑回归(作为基线模型)
2. XGBoost
3. LightGBM
对于多标签分类,使用了二元相关性与支持向量分类器和XGBoost作为基学习器。