如何使TfidfVectorizer只学习字母字符作为词汇的一部分(不包括数字)

马特

我正在尝试使用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 15th 16th 180c 180d 18th 190 1900 1960s 197 1980 1b 20 200 200a 2d 3d 416 4th 50 7a 7b”之类的术语。

我尝试使用token_pattern带有以下正则表达式参数仅包含具有字母字符的单词

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)

但这返回: ValueError: empty vocabulary; perhaps the documents only contain stop words

我也尝试过仅删除数字,但仍然遇到相同的错误。

我的正则表达式不正确吗?还是我使用TfidfVectorizer不正确?(我也尝试过删除max_features参数)

谢谢!

Vivek Kumar

那是因为您的正则表达式是错误的。

1)您正在使用^$用于表示字符串的开始和结束。这意味着此模式将只匹配其中只有字母的完整字符串(没有数字,没有空格,没有其他特殊字符)。你不想要那个。所以删除它。

在此处查看有关特殊字符的详细信息:https : //docs.python.org/3/library/re.html#regular-expression-syntax

2)您使用的是原始正则表达式模式,而没有转义反斜杠,反斜杠本身将用于转义其后的字符。因此,当与python中的正则表达式结合使用时,这将是无效的。您可以使用双反斜杠(而不是单反斜杠)来正确格式化字符串,也可以使用r前缀。

3)u前缀用于unicode。除非您的正则表达式模式具有特殊的unicode字符,否则也不需要这样做。在此处查看有关此内容的更多信息:Python regex-r前缀

所以最后您正确的token_pattern应该是:

token_pattern=r'(?u)\b[A-Za-z]+\b'

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MS-Access - 不包括 * 作为聚合函数的一部分......但它是

grep字符串,包括正斜线作为单词的一部分

如何删除遵循某种模式的字符串的一部分,但是不包括使用R的另一种模式?

在Shell中,如何对作为字符串一部分的数字进行算术运算?

perforce,不包括子文件夹的一部分

不包括路线网址的第一部分

如何使python使用字符串字母的顺序作为字典的一部分,以及每个唯一字母出现的次数的值

如何提取子字符串作为dplyr :: mutate管道的一部分

如何在PHP中将“&”作为字符串的一部分传递?

我的 SQL 查询指出我的查询不包括指定的表达式作为聚合函数的一部分

在Perl中用逗号分隔的列表中的字符串的一部分中的字母替换数字

使用正则表达式获取字符串的文本,但不包括最后一部分?

UWP包括Mediaplayer传输栏作为命令栏的一部分吗?

包括CLI工具作为R软件包的一部分

休眠Lucene搜索包括“ the”和“ a”作为搜索的一部分

正则表达式:匹配项,但不包括匹配项的一部分

在 python 中将我的输出代码的一部分更改为字母数字

如何检查字符是否不是字符串中数字或 URL 的一部分?

用字母替换字符串的一部分?

SQL查找替换字符作为字符串的一部分

如何在字典列表中找到字符串作为键值的一部分?

如何在 Postgres 中合并作为 Concact 字符串一部分的空/空值?

如何指定空格作为通配符字符串的一部分以批量重命名文件

如何选择包含特定子字符串的单词列表作为 SQL 查询 (oracle) 的一部分?

如何打印作为JSON一部分的字符串数组包含其他属性

如何使用将条件作为字符串文字的一部分的 countif 函数?

如何更改变量中存在的路径字符串(作为循环的一部分)?

如何遍历对象数组并将键值作为字符串的一部分返回

如果不是菜单的一部分,如何在PowerPoint中插入特殊字符作为项目符号?