Meka - многолинейная классификация со словом N-граммы - PullRequest
0 голосов
/ 01 апреля 2019

Я делаю многолабильную классификацию с Мека.Некоторые из функций, которые я использую, извлекаются с помощью scikit-learn.Использование Tfidf и N-граммы символов работает, но если я использую N-граммы Word, классификаторы не дают ничего значащего (всегда указывайте последний ярлык как true, а остальные как false).Я не знаю, почему это не работает с Word N-Grams, потому что я делаю все ранее с scikit-learn и код на самом деле не отличается:

# BOW with TF-IDF
def bowTfIdf(data):

    # create Vectorizer
    vectorizer = TfidfVectorizer()

    # create Vocabulary
    vectorizer.fit(data)

    # create vector/matrix
    featureVector = vectorizer.transform(data)

    return featureVector

# N-Grams
def bowNGram(data, n):

    #create Vectorizer
    vectorizer = CountVectorizer(ngram_range=(n, n))

    # create Vocabulary
    vectorizer.fit(data)

    # create vector/matrix
    featureVector = vectorizer.transform(data)

    return featureVector


# Character N-Grams
def bowCharacterNGram(data, n):

    # create Vectorizer
    vectorizer = CountVectorizer(analyzer='char_wb', ngram_range=(n, n))

    # create Vocabulary
    vectorizer.fit(data)

    # create vector/matrix
    featureVector = vectorizer.transform(data)

    return featureVector

Я также проверил,словарь и все составлено правильно, и это, кажется, имеет место.
После того, как я извлекаю Функции, я создаю arff (также с метками) и затем вызываю MEKA.Код для этого следующий:

# X and Y both scipy.csr_matrix
def createArffandCallMEKA(X, Y, classifier, arff_path, classifier_path):
    save_to_arff(X, Y, save_sparse=True, filename=arff_path, label_location="end")
    j48 = "-W weka.classifiers.trees.J48 -- -C 0.25 -M 2"
    randomTree = "-W weka.classifiers.trees.RandomTree -- -K 0 -M 1.0 -V 0.001 -S 1"
    randomForest = "-W weka.classifiers.trees.RandomForest -- -I 100 -K 0 -S 1 -num-slots 1"
    naiveBayes = "-W weka.classifiers.bayes.NaiveBayes"
    # CHANGED TO 9.2
    meka_command =r'java -cp "C:/Users/****/scikit_ml_learn_data/meka/meka-release-1.9.2/lib/*" meka.classifiers.multilabel.meta.CM -verbosity 6 -t "' + arff_path + r'" -R -d "' + classifier_path + r'" -I 10 -W meka.classifiers.multilabel.CC -- -S 0  '
    if classifier == "J48":
        meka_command += j48
    elif classifier == "RandomTree":
        meka_command += randomTree
    elif classifier == "RandomForest":
        meka_command += randomForest
    elif classifier == "NaiveBayes":
        meka_command += naiveBayes
    pipes = subprocess.Popen(meka_command,
                             stdout=subprocess.PIPE,
                             stderr=subprocess.PIPE,
                             universal_newlines=True)
    output, error = pipes.communicate()
    if type(output) == bytes:
        output = output.decode(sys.stdout.encoding)
    if type(error) == bytes:
        error = error.decode(sys.stdout.encoding)
    if pipes.returncode != 0:
        print(output + error)
    else:
        print(output)

X = bowNGram(data,2)
Y = csr_matrix(labels)
createArffandCallMEKA(X, Y, "J48", arff_path, "C:/Users/****/Desktop/Classifier" )

Так что это хорошо работает с TFIDF, символьными N-граммами, но не с Word N-граммами.Может быть, это проблема с МЕКА?

...