Python:CountVectorizer忽略一个字母单词;我";

Python:CountVectorizer忽略一个字母单词;我";,python,scikit-learn,countvectorizer,Python,Scikit Learn,Countvectorizer,我有一个名为字典1的列表。我使用以下代码获得文本的稀疏计数矩阵: cv1 = sklearn.feature_extraction.text.CountVectorizer(stop_words=None) cv1.fit_transform(dictionary1) 然而,我注意到 list(set(dictionary1)-set(cv1.get_feature_names())) 结果是['i']。所以“i”在我的字典中,但是CountVectorizer忽略它(可能某些默认设置会

我有一个名为
字典1
的列表。我使用以下代码获得文本的稀疏计数矩阵:

cv1 = sklearn.feature_extraction.text.CountVectorizer(stop_words=None)  
cv1.fit_transform(dictionary1)
然而,我注意到

list(set(dictionary1)-set(cv1.get_feature_names()))

结果是
['i']
。所以“i”在我的字典中,但是
CountVectorizer
忽略它(可能某些默认设置会丢弃一个字符的单词)。事实上,我找不到这样的选择。有人能给我指出这个问题吗?事实上,我想在我的分析中保留“I”,因为它可能指的是更多的个人语言。

一个解决办法是将字典作为词汇直接传递(实际上我不知道为什么我一开始没有这样做)。即

list(set(dictionary1)-set(cv1.get_feature_names())
然后返回
[]

在我最初的帖子中,我应该提到
dictionary1
已经是一个唯一标记的列表

默认配置通过提取至少两个字母的单词来标记字符串

查看了解有关sklearn矢量器的更多详细信息

在您的情况下,应该使用不同的标记器,而不是分析器。例如,您可以使用
nltk
库中的TweetTokenizer:

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import TweetTokenizer

corpus = [...some_texts...]

tk = TweetTokenizer()
vectorizer = CountVectorizer(tokenizer=tk.tokenize)
x = vectorizer.fit_transform(corpus)
例如,如果
corpus
定义如下,您将得到:

corpus = ['I love ragdolls',
          'I received a cat',
          'I take it as my best friend']

vectorizer.get_feature_names()

> ['a', 'as', 'best', 'cat', 'friend', 'i', 'it', 'love', 'my', 'ragdolls', 'received', 'take']

你试过使用
stop\u words=[]
吗?那不是因为maxdf。下一次尝试是在确保通过
analyzer='word'
之后编写自己的标记化正则表达式。。你知道怎么做吗?不知道;我想您的意思是将token_模式选项与合适的正则表达式一起使用,因为默认情况下,单词token需要两个或更多字符?@SAFEX Yes。您可以更改默认的token_模式,使其包含1个字母的单词。@VivekKumar:的确!作为参考,适当的设置为“token\u pattern=r”(?u)\b\w+\b”,其中“r”(?u)\b\w+\b”是一个正则表达式,允许使用一个字符的单词。
corpus = ['I love ragdolls',
          'I received a cat',
          'I take it as my best friend']

vectorizer.get_feature_names()

> ['a', 'as', 'best', 'cat', 'friend', 'i', 'it', 'love', 'my', 'ragdolls', 'received', 'take']