我想使用n-gram功能的sklearn
分类器。此外,我想进行交叉验证以找到n-gram的最佳顺序。但是,我对如何将所有部分组合在一起感到有些困惑。
目前,我有以下代码:
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import KFold
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
text = ... # This is the input text. A list of strings
labels = ... # These are the labels of each sentence
# Find the optimal order of the ngrams by cross-validation
scores = pd.Series(index=range(1,6), dtype=float)
folds = KFold(n_splits=3)
for n in range(1,6):
count_vect = CountVectorizer(ngram_range=(n,n), stop_words='english')
X = count_vect.fit_transform(text)
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.33, random_state=42)
clf = MultinomialNB()
score = cross_val_score(clf, X_train, y_train, cv=folds, n_jobs=-1)
scores.loc[n] = np.mean(score)
# Evaluate the classifier using the best order found
order = scores.idxmax()
count_vect = CountVectorizer(ngram_range=(order,order), stop_words='english')
X = count_vect.fit_transform(text)
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.33, random_state=42)
clf = MultinomialNB()
clf = clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print('Accuracy is {}'.format(acc))
但是,我觉得这样做是错误的,因为我在每个循环中创建了一个列车测试分割。
如果预先进行了一次火车测试,并将CountVectorizer
分别应用于这两个部分,那么这些部分会有shape
个不同,这会在使用clf.fit
和{{clf.score
时造成问题1}}。
我该如何解决这个问题?
编辑:如果我首先尝试建立一个词汇表,我仍然需要建立几个词汇表,因为unigrams的词汇与bigrams的词汇不同等。
举个例子:
# unigram vocab
vocab = set()
for sentence in text:
for word in sentence:
if word not in vocab:
vocab.add(word)
len(vocab) # 47291
# bigram vocab
vocab = set()
for sentence in text:
bigrams = nltk.ngrams(sentence, 2)
for bigram in bigrams:
if bigram not in vocab:
vocab.add(bigram)
len(vocab) # 326044
这再次引发了我需要为每个n-gram大小应用CountVectorizer
的相同问题。
答案 0 :(得分:1)
您需要先设置vocabulary
参数。在某种程度上,你必须提供整个词汇表,否则维度永远不会匹配(显然)。如果您先进行训练/测试分割,则可能会有一组中的单词不存在于另一组中,并且您的尺寸不匹配。
如果您没有提供先验词典而您没有使用进行某种特征选择的分析器,那么功能的数量将等于通过分析数据找到的词汇量。
再向下,您会找到vocabulary
的说明。
词汇:
映射或可迭代,可选 其中键是术语和值的映射(例如,字典)是特征矩阵中的索引,或者是可迭代的术语。如果没有给出,则从输入文档确定词汇表。映射中的索引不应重复,并且在0和最大索引之间不应有任何差距。