2015-05-02 3 views
0

Я пытаюсь проанализировать твиты, используя классификатор SVM. Я смог успешно выполнить классификацию с использованием униграмм в качестве функций. Я использую реализацию SciKit libSVM, которая может выполнять классификацию нескольких классов с использованием подхода One-Vs-All. Для генерации вектор-функции я использовал карту. Если слово существует в твите, оно было сопоставлено с 1 другим значением 0. В вектор-функции значение карты (слова) затем было добавлено с меткой 0, если это не было прекращено, твит еще до 1. Код здесь:Обучение SVM-классификатору с использованием bigrams в python

def getSVMFeatureVectorAndLabels(tweets, featureList): 
sortedFeatures = sorted(featureList) 
map = {} 
feature_vector = [] 
labels = [] 
for t in tweets: 
    label = 0 
    map = {} 
    # Initialize empty map 
    for w in sortedFeatures: 
     map[w] = 0 

    tweet_words = t[0] 
    tweet_opinion = t[1] 
    # Fill the map 
    for word in tweet_words: 
     # process the word (remove repetitions and punctuations) 
     word = replaceTwoOrMore(word) 
     word = word.strip('\'"?,.') 
     # set map[word] to 1 if word exists 
     if word in map: 
      map[word] = 1 
    # end for loop 
    values = map.values() 
    feature_vector.append(values) 
    if(tweet_opinion == '0'): 
     label = 0 
    elif(tweet_opinion == '1'): 
     label = 1 
    labels.append(label)    
# return the list of feature_vector and labels 
return {'feature_vector' : feature_vector, 'labels': labels} 
# end 

В этом коде, чириканье содержит список (Юниграмма, этикетки) и FeatureList список всех Уникальных слов, извлеченных из твитов. В тех же строках этого кода я хотел знать, могу ли я использовать функции bigrams как функцию, как мне это сделать, создавая лучшие биграммы и создавая вектор функций? Для создания биграмм для наивного Байеса, я использовал этот код:

#extract features using bigram 
def extract_bigrams(tweet, score_fn=BigramAssocMeasures.chi_sq, n=10): 
bigram_finder = BigramCollocationFinder.from_words(tweet) 
bigrams = bigram_finder.nbest(score_fn, n) 
d = dict([(ngram, True) for ngram in itertools.chain(tweet, bigrams)]) 
d.update(best_word_feats(tweet)) 
return d 

def best_word_feats(words): 
return dict([(word, True) for word in words if word in bestwords]) 

best = sorted(word_scores.iteritems(), key=lambda (w, s): s, reverse=True) [:10000] 
bestwords = set([w for w, s in best]) 

ответ

0

Вы можете использовать sklearn-х CountVectorizer, чтобы сделать это для вас. См. this guide, в частности, строка кода

>>> bigram_vectorizer = CountVectorizer(ngram_range=(1, 2), 
...          token_pattern=r'\b\w+\b', min_df=1) 
Смежные вопросы