Pyspark 文本挖掘:使用Word2Vec对有毒评论的错误预测

Pyspark 文本挖掘:使用Word2Vec对有毒评论的错误预测,pyspark,text-mining,random-forest,word2vec,spacy,Pyspark,Text Mining,Random Forest,Word2vec,Spacy,我有一个包含句子和布尔列(0或1)的数据集来分类评论的类型(有毒|严重|有毒|淫秽|威胁|侮辱|身份|仇恨)。 您可以在此处下载数据集: 我用空格过滤单词,只保留有用的单词,我保留了:形容词、副词、动词和名词使用此功能: def filter_words(words) : vec = [] conditions = ('ADV','NOUN','ADJ','VERB') for token in nlp(words): if not token.is_stop and toke

我有一个包含句子和布尔列(0或1)的数据集来分类评论的类型(有毒|严重|有毒|淫秽|威胁|侮辱|身份|仇恨)。 您可以在此处下载数据集:

我用空格过滤单词,只保留有用的单词,我保留了:形容词、副词、动词和名词使用此功能:

def filter_words(words) : 
vec = []    
conditions = ('ADV','NOUN','ADJ','VERB')
for token in nlp(words):
    if not token.is_stop and token.pos_ in conditions:
        vec.append(token.lemma_)
return vec
然后我将数据帧转换为拼花文件以加快性能

我最终得到了一个数据帧,看起来像这样:

我在这个DF上使用了Word2Vec来创建一个features列,以便使用RandomForestClassifier来预测模型是否运行良好

代码如下:

    from pyspark.ml.feature import Word2Vec
    from pyspark.sql.functions import *

    word2vec = Word2Vec(inputCol="vector_words",outputCol="features")
    model = word2vec.fit(sentences)
    result = model.transform(sentences)
    result = result.withColumn("toxic", result["toxic"].cast(IntegerType()))

      rf =RandomForestClassifier(labelCol="toxic",featuresCol="features")

      result = result.dropna()
      (trainingSet, testSet) = result.randomSplit([0.7,0.3])

      model_toxic = rf.fit(trainingSet)
      predictions = model_toxic.transform(testSet)
但我在这里遇到的问题是,我只有16个被认为是有毒的预测,其中13个被确定为有毒,而在这组预测中,大约有4000个有毒的评论。 我不明白为什么。是因为我在单词上应用了过滤器,这可能限制太多(我不知道为什么),还是因为我的Word2Vec和RandomForestClassifier的参数不够精确?
我是pyspark的新手,我找不到任何关于坏型号的信息,基本上互联网上的人们对结果都很满意。任何帮助都将不胜感激。

我运行了您的代码,应用了一些修改,它显示了934个正确的积极预测。基本上,我放宽了注释标记化的条件(如果您感兴趣,我可以共享代码),除此之外,我看不出您没有获得满意结果的原因。它引起我注意的是你的列
vector_words
的格式,它是一个数组的数组,你是否尝试删除作为包装器的数组?我刚刚重新组合了它,结果是一样的。不过,当我像你一样放宽标记化的条件时,我得到了更好的结果。但是因为我使用spacy,它需要很多时间(每次大约一个小时),有没有办法做到这一点而不浪费很多时间?我不使用spacy,所以我真的不知道如何提高性能。但是,在我的方法中,包含标记化文本的数组的平均长度是61,您的方法中有类似的值吗?