如何让 TfidfVectorizer 只学习字母字符作为词汇的一部分(不包括数字)
How to make TfidfVectorizer only learn alphabetical characters as part of the vocabulary (exclude numbers)
我正在尝试使用 SkLearn 的 TfidfVectorizer 提取一元词、二元词和三元词的词汇表。这是我当前的代码:
max_df_param = .003
use_idf = True
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(1,1), max_features=2000, use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
unigrams = vectorizer.get_feature_names()
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(2,2), max_features=max(1, int(len(unigrams)/10)), use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
bigrams = vectorizer.get_feature_names()
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(3,3), max_features=max(1, int(len(unigrams)/10)), use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
trigrams = vectorizer.get_feature_names()
vocab = np.concatenate((unigrams, bigrams, trigrams))
但是,我想避免数字和包含数字的单词并且当前输出包含诸如“0
101
110
12
15日
16日
180度
180d
18号
190
1900
1960年代
197
1980
1b
20
200
200a
2d
3d
416
第四名
50
7a
7b"
我尝试使用 token_pattern
参数和以下 regex 仅包含字母字符的单词:
vectorizer = TfidfVectorizer(max_df = max_df_param,
token_pattern=u'(?u)\b\^[A-Za-z]+$\b',
stop_words='english', ngram_range=(1,1), max_features=2000, use_idf=use_idf)
但是这个returns:ValueError: empty vocabulary; perhaps the documents only contain stop words
我也试过 但我仍然遇到同样的错误。
我的正则表达式不正确吗?还是我使用 TfidfVectorizer
不正确? (我也尝试删除 max_features
参数)
谢谢!
那是因为你的正则表达式是错误的。
1) 您正在使用 ^
和 $
来表示字符串的开始和结束。这意味着这个模式将只匹配其中只有字母的完整字符串(没有数字,没有空格,没有其他特殊字符)。你不想要那个。所以删除它。
在此处查看有关特殊字符的详细信息:https://docs.python.org/3/library/re.html#regular-expression-syntax
2) 您正在使用原始正则表达式模式而没有转义反斜杠,反斜杠本身将用于转义其后的字符。因此,当与 python 中的正则表达式结合使用时,这将无效。您可以使用双反斜杠而不是单个反斜杠来正确格式化字符串,也可以使用 r
前缀。
3) u
前缀用于 unicode。除非您的正则表达式模式具有特殊的 unicode 字符,否则也不需要。
在此处查看更多相关信息:Python regex - r prefix
所以最后你的正确 token_pattern 应该是:
token_pattern=r'(?u)\b[A-Za-z]+\b'
我正在尝试使用 SkLearn 的 TfidfVectorizer 提取一元词、二元词和三元词的词汇表。这是我当前的代码:
max_df_param = .003
use_idf = True
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(1,1), max_features=2000, use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
unigrams = vectorizer.get_feature_names()
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(2,2), max_features=max(1, int(len(unigrams)/10)), use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
bigrams = vectorizer.get_feature_names()
vectorizer = TfidfVectorizer(max_df = max_df_param, stop_words='english', ngram_range=(3,3), max_features=max(1, int(len(unigrams)/10)), use_idf=use_idf)
X = vectorizer.fit_transform(dataframe[column])
trigrams = vectorizer.get_feature_names()
vocab = np.concatenate((unigrams, bigrams, trigrams))
但是,我想避免数字和包含数字的单词并且当前输出包含诸如“0 101 110 12 15日 16日 180度 180d 18号 190 1900 1960年代 197 1980 1b 20 200 200a 2d 3d 416 第四名 50 7a 7b"
我尝试使用 token_pattern
参数和以下 regex 仅包含字母字符的单词:
vectorizer = TfidfVectorizer(max_df = max_df_param,
token_pattern=u'(?u)\b\^[A-Za-z]+$\b',
stop_words='english', ngram_range=(1,1), max_features=2000, use_idf=use_idf)
但是这个returns:ValueError: empty vocabulary; perhaps the documents only contain stop words
我也试过
我的正则表达式不正确吗?还是我使用 TfidfVectorizer
不正确? (我也尝试删除 max_features
参数)
谢谢!
那是因为你的正则表达式是错误的。
1) 您正在使用 ^
和 $
来表示字符串的开始和结束。这意味着这个模式将只匹配其中只有字母的完整字符串(没有数字,没有空格,没有其他特殊字符)。你不想要那个。所以删除它。
在此处查看有关特殊字符的详细信息:https://docs.python.org/3/library/re.html#regular-expression-syntax
2) 您正在使用原始正则表达式模式而没有转义反斜杠,反斜杠本身将用于转义其后的字符。因此,当与 python 中的正则表达式结合使用时,这将无效。您可以使用双反斜杠而不是单个反斜杠来正确格式化字符串,也可以使用 r
前缀。
3) u
前缀用于 unicode。除非您的正则表达式模式具有特殊的 unicode 字符,否则也不需要。
在此处查看更多相关信息:Python regex - r prefix
所以最后你的正确 token_pattern 应该是:
token_pattern=r'(?u)\b[A-Za-z]+\b'