我正在对具有以下样式的标记进行文本块向量化:
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()
问题是,当我执行上述提取关键词的程序时,我怀疑向量化对象正在从我的文本块中删除括号。那么,我可以使用tfidf向量化对象的哪个参数来保留括号中的此类信息呢?
更新
我也尝试了以下方法:
from sklearn.feature_extraction.text import TfidfVectorizerdef dummy_fun(doc): return doctfidf = TfidfVectorizer( analyzer='word', tokenizer=dummy_fun, preprocessor=dummy_fun, token_pattern=None)
和
from sklearn.feature_extraction.text import TfidfVectorizerdef dummy_fun(doc): return doctfidf = TfidfVectorizer( tokenizer=dummy_fun, preprocessor=dummy_fun, token_pattern=None)
然而,这返回给我的是一系列字符,而不是我已经分词的标记:
['e', 's', '_', 'a', 't', 'o', 'c', 'r', 'i', 'n']
回答:
问题在于TfidfVectorizer
使用的默认分词明确忽略了所有标点符号:
token_pattern : string
表示“标记”的正则表达式,仅在analyzer == ‘word’时使用。默认的正则表达式选择2个或更多字母数字字符的标记(标点符号被完全忽略,并且始终被视为标记分隔符)。
您的问题与这个之前的问题有关,但您不是希望将标点符号作为单独的标记处理,而是希望防止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
的信息,请查看Python关于正则表达式的文档。