2017-01-01 10 views
0

Я выполняю задачу классификации текста У меня возникла проблема. Я уже выбрал 1000 лучших коллекций объектов, используя подход «сумка слов». Теперь я хочу использовать другие функции на основе части речи, средней длины слова и т. Д. После того, как я хочу объединить эти функции вместе. Как я могу достичь этого Я использую пакеты Python, NLTK, Scikit. Это мой первый проект python, поэтому код может быть не очень хорошим.Объединить различные типы функций (Классификация текста)

Спасибо заранее,

import nltk 
    from nltk.corpus.reader import CategorizedPlaintextCorpusReader 
    from sklearn.feature_extraction.text import TfidfVectorizer 
    import os 
    import numpy as np 
    import random 
    import pickle 
    from time import time 
    from sklearn import metrics 

    from nltk.classify.scikitlearn import SklearnClassifier 
    from sklearn.naive_bayes import MultinomialNB,BernoulliNB 
    from sklearn.linear_model import LogisticRegression,SGDClassifier 
    from sklearn.svm import SVC, LinearSVC, NuSVC 

    import matplotlib.pyplot as plt 

    def intersect(a, b, c, d): 
     return list(set(a) & set(b)& set(c)& set(d)) 

    def find_features(document, feauture_list): 
     words = set(document) 
     features = {} 
     for w in feauture_list: 
      features[w] = (w in words) 
     return features 


    def benchmark(clf, name, training_set, testing_set): 

     print('_' * 80) 
     print("Training: ") 
     print(clf) 
     t0 = time() 
     clf.train(training_set) 
     train_time = time() - t0 
     print("train time: %0.3fs" % train_time) 

     t0 = time() 
     score = nltk.classify.accuracy(clf, testing_set)*100 
     #pred = clf.predict(testing_set) 
     test_time = time() - t0 

     print("test time: %0.3fs" % test_time) 

     print("accuracy: %0.3f" % score) 
     clf_descr = name 
     return clf_descr, score, train_time, test_time 

     #print((find_features(corpus.words('fantasy/1077-0_fantasy.txt'),feature_list))) 
    path = 'c:/data/books-Copy' 
    os.chdir(path) 
     #need this if you want to save tfidf_matrix 
    corpus = CategorizedPlaintextCorpusReader(path, r'.*\.txt', 
                cat_pattern=r'(\w+)/*') 
    save_featuresets = open(path +"/features_500.pickle","rb") 
    featuresets = [] 
    featuresets = pickle.load(save_featuresets) 
    save_featuresets.close() 

    documents = [(list(corpus.words(fileid)), category) 
       for category in corpus.categories() 
       for fileid in corpus.fileids(category)] 

    random.shuffle(documents) 

    tf = TfidfVectorizer(analyzer='word', min_df = 1, 
         stop_words = 'english', sublinear_tf=True) 
    #documents_tfidf = [] 
    top_features = [] 
    tf = TfidfVectorizer(input= 'filename', analyzer='word', 
         min_df = 1, stop_words = 'english', sublinear_tf=True) 

    for category in corpus.categories(): 
     files = corpus.fileids(category) 
     tf.fit_transform(files) 
     feature_names = tf.get_feature_names() 
     #documents_tfidf.append(feature_names) 
     indices = np.argsort(tf.idf_)[::-1] 
     top_features.append([feature_names[i] for i in indices[:10000]]) 
     #print(top_features_detective) 

    feature_list = list(set(top_features[0][:500]) | set(top_features[1][:500]) | 
         set(top_features[2][:500]) | set(top_features[3][:500]) | 
         set(intersect(top_features[0], top_features[1], top_features[2], top_features[3]))) 


    featuresets = [(find_features(rev, feature_list), category) for (rev, category) in documents] 
training_set = featuresets[:50] 
testing_set = featuresets[20:] 
results = [] 
for clf, name in (
          (SklearnClassifier(MultinomialNB()), "MultinomialNB"), 
          (SklearnClassifier(BernoulliNB()), "BernoulliNB"), 
          (SklearnClassifier(LogisticRegression()), "LogisticRegression"), 
          (SklearnClassifier(SVC()), "SVC"), 
          (SklearnClassifier(LinearSVC()), "Linear SVC "), 
          (SklearnClassifier(SGDClassifier()), "SGD ")): 
    print(name) 
    results.append(benchmark(clf, name, training_set, testing_set)) 

indices = np.arange(len(results)) 
results = [[x[i] for x in results] for i in range(4)] 

clf_names, score, training_time, test_time = results 
training_time = np.array(training_time)/np.max(training_time) 
test_time = np.array(test_time)/np.max(test_time) 



plt.figure(figsize=(12, 8)) 
plt.title("Score") 
plt.barh(indices, score, .2, label="score", color='navy') 
plt.barh(indices + .3, training_time, .2, label="training time", 
       color='c') 
plt.barh(indices + .6, test_time, .2, label="test time", color='darkorange') 
plt.yticks(()) 
plt.legend(loc='best') 
plt.subplots_adjust(left=.25) 
plt.subplots_adjust(top=.95) 
plt.subplots_adjust(bottom=.05) 

for i, c in zip(indices, clf_names): 
    plt.text(-15.6, i, c) 
    plt.show() 
+0

Что вы хотите сказать? Непонятно, что вы просите, и просто сбрасывать кучу кода не помогает. Большинство из вышеперечисленных, вероятно, не имеет отношения к вашему вопросу. –

+0

Я вижу слишком много вопросов за один раз. Выберите один и спросите его с помощью [mcve]. Затем переходите к новому вопросу (сначала попробуйте его). –

+0

Спасибо за ваши ответы. Я уже объединил два разных алгоритма с помощью FeatureUnion и Pipeline. pipe = Pipeline ([ ('text_features', FeatureUnion ([ ('vect', vect), # extract ngrams from roadnames # ('num_words', Apply (lambda s: len (s.split()))) , # длина строки ('ave_word_length', Apply (lambda s: np.mean ([len (w) для w в s.split()]))), # средняя длина слова ])), (' clf ', clf), # подавать выход через классификатор ]) –

ответ

0

Там нет ничего плохого в том, сочетающим свойства различных типов (на самом деле это вообще хорошая идея для задач классификации). API-интерфейс NLTK ожидает, что функции появятся в словаре, поэтому вам просто нужно объединить свои коллекции функций в один словарь.

Это ответ на заданный вами вопрос. Если у вас есть проблема с вашим кодом, с которым вам нужна помощь, но вы не спрашивали, вероятно, вы должны начать новый вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^