Я пытаюсь проанализировать твиты, используя классификатор 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])