分析器在 Sklearn Tfidf 中使用时忽略某些单词

Analyzer ignoring certain word when used in Sklearn Tfidf

这是我的代码:

def ngrams(string, n=4):
    string = re.sub(r'[,-./]|\sBD',r'', string)
    ngrams = zip(*[string[i:] for i in range(n)])
    R = [''.join(ngram) for ngram in ngrams]
    if len(R) == 0:
        return string
    else:
        return R

L = ['a', 'aa', 'aaa', 'a', 'aa', 'aaa']

vectorizer = TfidfVectorizer(min_df = 0, token_pattern='(?u)\b\w+\b', analyzer=ngrams)
tf_idf_matrix = vectorizer.fit_transform(L)

print(vectorizer.vocabulary_)

词汇输出为{'a': 0}

我很困惑 "aa""aaa" 在哪里,当您检查我的 ngrams 函数时,如果它的长度小于参数(在上面的代码中为 4),我将返回字符串。

令牌正则表达式也以接受单个字符的方式制作。

这是理论。

我相信 TfidVectorizer 期望 analyzer 函数到 return 一个序列。注意 ngrams 函数的输入与输出:

'a'  -> 'a'
'aa' -> 'aa'
'aaa' -> 'aaa'
'aaaa' -> ['aaaa']
'aaaaa' -> ['aaaa','aaaa']

一个字符串是一个序列,所以在前 3 种情况下,您 return 是一个由重复单个字母 'a'.

组成的序列

如果我的理论正确,你需要更换

        return string

        return [string]