我正在使用具有以下样式的标记来矢量化文本斑点:
hi__(how are you), 908__(number code), the__(POS)
如您所见,令牌已在__(info)
中附加了一些信息,我正在使用tfidf提取关键字,如下所示:
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(doc)
indices = np.argsort(vectorizer.idf_)[::-1]
features = vectorizer.get_feature_names()
问题是,当我执行上述提取关键字的过程时,我怀疑vectorizer对象正在从我的textblob中删除括号。因此,我可以使用tfidf矢量化器对象中的哪个参数将这些信息保留在括号中?
更新
我还试图:
from sklearn.feature_extraction.text import TfidfVectorizer
def dummy_fun(doc):
return doc
tfidf = TfidfVectorizer(
analyzer='word',
tokenizer=dummy_fun,
preprocessor=dummy_fun,
token_pattern=None)
和
from sklearn.feature_extraction.text import TfidfVectorizer
def dummy_fun(doc):
return doc
tfidf = TfidfVectorizer(
tokenizer=dummy_fun,
preprocessor=dummy_fun,
token_pattern=None)
但是,这会返回一个字符序列,而不是我已经标记化的标记:
['e', 's', '_', 'a', 't', 'o', 'c', 'r', 'i', 'n']
答案 0 :(得分:2)
问题是TfidfVectorizer
使用的默认标记化显式忽略了所有标点符号:
token_pattern:字符串
正则表达式表示什么构成“令牌”,仅在分析器=='word'时使用。默认的regexp选择2个或更多字母数字字符的标记(标点符号将被完全忽略,并始终被视为标记分隔符。)
您的问题与this previous question有关,但您希望防止token__(info)
拆分令牌而不是将标点符号视为单独的令牌。在这两种情况下,解决方案都是编写自定义token_pattern
,尽管确切的模式有所不同。
假设每个令牌已经附加了__(info)
:
vectorizer = TfidfVectorizer(token_pattern=r'(?u)\b\w\w+__\([\w\s]*\)')
X = vectorizer.fit_transform(doc)
我只是修改了默认的token_pattern
,所以现在它可以匹配任何2个或更多字母数字字符,后跟__(
,0个或更多字母数字或空格字符,并以)
结尾。如果您想了解有关如何编写自己的token_pattern
的更多信息,请参见regular expressions的Python文档。