TfidfVectorizer stop_words 参数不起作用?
TfidfVectorizer stop_words parameter does not work?
我有一段简单的代码,我试图将其用作训练模型的基础。我试图从矢量化器中删除停用词列表,但它似乎不起作用。
或者可能是我,我没有传递正确的东西。
下面是我的代码,如果你安装了sklearn,你可以直接复制粘贴运行它。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import GaussianNB
l_stop_words = ['is', 'me', 'i']
print type(l_stop_words)
tfvect = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]', stop_words=l_stop_words)
tfvect2 = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]')
corpus = [
'I know SQL and Java.',
'I like C# and NoSQL. SQL is fun also.',
'Teach me ASP.NET and Javascript.',
'C++ sounds cool and PL/SQL is amazing.']
X = tfvect.fit_transform(corpus)
Y = ['java developer', 'C# developer', 'web developer', 'C++ developer']
X2 = tfvect2.fit_transform(corpus)
print len(tfvect.get_feature_names()), tfvect.get_feature_names()
print len(tfvect2.get_feature_names()), tfvect2.get_feature_names()
你会看到当两个特征向量相同时(下面是我的输出)。
<type 'list'>
20 [u'also', u'amazing', u'and ', u'asp.net ', u'c# ', u'c++ ', u'cool ', u'fun ', u'i ', u'is ', u'java', u'javascript', u'know ', u'like ', u'me ', u'nosql. ', u'pl/sql ', u'sounds ', u'sql ', u'teach ']
20 [u'also', u'amazing', u'and ', u'asp.net ', u'c# ', u'c++ ', u'cool ', u'fun ', u'i ', u'is ', u'java', u'javascript', u'know ', u'like ', u'me ', u'nosql. ', u'pl/sql ', u'sounds ', u'sql ', u'teach ']
感谢任何帮助找到解决方案的人!
请注意,除了每个句子的最后一个词外,您的输出特征在每个词后都有一个空格。
可以通过将正则表达式更改为
来修复
'[a-zA-Z.0-9+#-/]*[^.\s]'
那么输出将是
17 ['also', 'amazing', 'and', 'asp.net', 'c#', 'c++', 'cool', 'fun', 'java', 'javascript', 'know', 'like', 'nosql', 'pl/sql', 'sounds', 'sql', 'teach']
20 ['also', 'amazing', 'and', 'asp.net', 'c#', 'c++', 'cool', 'fun', 'i', 'is', 'java', 'javascript', 'know', 'like', 'me', 'nosql', 'pl/sql', 'sounds', 'sql', 'teach']
编辑#1
上述正则表达式可能匹配不在字符集 [a-zA-Z.0-9+#-/]
中的单个字符,例如 !
.
'[a-zA-Z0-9#-/]*[a-zA-Z0-9#--/]'
可能更符合原始正则表达式的目的。
([a-zA-Z.0-9+#-/]
中的.
和+
在#-/
范围内可以省略)
编辑#2
感谢评论,我意识到我误解了你的目的。实际上,您只想匹配 .
、+
、#
、-
、/
,但 #-\
将是一个范围。所以你需要使用反斜杠来转义 -
.
'[a-zA-Z.0-9+#\-/]*[a-zA-Z0-9+#\-/]'
我有一段简单的代码,我试图将其用作训练模型的基础。我试图从矢量化器中删除停用词列表,但它似乎不起作用。
或者可能是我,我没有传递正确的东西。
下面是我的代码,如果你安装了sklearn,你可以直接复制粘贴运行它。
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import GaussianNB
l_stop_words = ['is', 'me', 'i']
print type(l_stop_words)
tfvect = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]', stop_words=l_stop_words)
tfvect2 = TfidfVectorizer(analyzer='word', token_pattern='[a-zA-Z.0-9+#-/]+[^.]')
corpus = [
'I know SQL and Java.',
'I like C# and NoSQL. SQL is fun also.',
'Teach me ASP.NET and Javascript.',
'C++ sounds cool and PL/SQL is amazing.']
X = tfvect.fit_transform(corpus)
Y = ['java developer', 'C# developer', 'web developer', 'C++ developer']
X2 = tfvect2.fit_transform(corpus)
print len(tfvect.get_feature_names()), tfvect.get_feature_names()
print len(tfvect2.get_feature_names()), tfvect2.get_feature_names()
你会看到当两个特征向量相同时(下面是我的输出)。
<type 'list'>
20 [u'also', u'amazing', u'and ', u'asp.net ', u'c# ', u'c++ ', u'cool ', u'fun ', u'i ', u'is ', u'java', u'javascript', u'know ', u'like ', u'me ', u'nosql. ', u'pl/sql ', u'sounds ', u'sql ', u'teach ']
20 [u'also', u'amazing', u'and ', u'asp.net ', u'c# ', u'c++ ', u'cool ', u'fun ', u'i ', u'is ', u'java', u'javascript', u'know ', u'like ', u'me ', u'nosql. ', u'pl/sql ', u'sounds ', u'sql ', u'teach ']
感谢任何帮助找到解决方案的人!
请注意,除了每个句子的最后一个词外,您的输出特征在每个词后都有一个空格。
可以通过将正则表达式更改为
来修复'[a-zA-Z.0-9+#-/]*[^.\s]'
那么输出将是
17 ['also', 'amazing', 'and', 'asp.net', 'c#', 'c++', 'cool', 'fun', 'java', 'javascript', 'know', 'like', 'nosql', 'pl/sql', 'sounds', 'sql', 'teach']
20 ['also', 'amazing', 'and', 'asp.net', 'c#', 'c++', 'cool', 'fun', 'i', 'is', 'java', 'javascript', 'know', 'like', 'me', 'nosql', 'pl/sql', 'sounds', 'sql', 'teach']
编辑#1
上述正则表达式可能匹配不在字符集 [a-zA-Z.0-9+#-/]
中的单个字符,例如 !
.
'[a-zA-Z0-9#-/]*[a-zA-Z0-9#--/]'
可能更符合原始正则表达式的目的。
([a-zA-Z.0-9+#-/]
中的.
和+
在#-/
范围内可以省略)
编辑#2
感谢评论,我意识到我误解了你的目的。实际上,您只想匹配 .
、+
、#
、-
、/
,但 #-\
将是一个范围。所以你需要使用反斜杠来转义 -
.
'[a-zA-Z.0-9+#\-/]*[a-zA-Z0-9+#\-/]'