5

我正在尝试使用 SkLearn 的 TfidfVectorizer 提取 unigrams、bigrams 和 trigrams 的词汇表。这是我当前的代码:

 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参数)

谢谢!

4

1 回答 1

6

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

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

在此处查看有关特殊字符的详细信息: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'
于 2018-08-02T08:08:52.443 回答