Я делаю многолабильную классификацию с Мека.Некоторые из функций, которые я использую, извлекаются с помощью 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-граммами.Может быть, это проблема с МЕКА?