TFIDF矢量化标记文档时出现问题吗?

时间:2018-07-27 01:38:06

标签: python regex machine-learning scikit-learn nlp

我正在使用具有以下样式的标记来矢量化文本斑点:

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']

1 个答案:

答案 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文档。