分析器在 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]
这是我的代码:
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]