【问题标题】:Problems while TFIDF vectorizing tokenized documents?TFIDF 矢量化标记化文档时出现问题?
【发布时间】:2019-01-04 02:06:17
【问题描述】:

我正在使用具有以下样式的标记对文本 blob 进行矢量化:

hi__(how are you), 908__(number code), the__(POS)

如你所见,token 中附有__(info) 的一些信息,我正在使用 tfidf 提取关键词,如下:

vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(doc)
indices = np.argsort(vectorizer.idf_)[::-1]
features = vectorizer.get_feature_names()

问题是,当我执行上述提取关键字的过程时,我怀疑矢量化器对象正在从我的 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']

【问题讨论】:

  • tokenizer=dummy_fun 产生一个字符列表,因为 tokenize 需要接受一个字符串并返回一个可迭代的令牌。因为dummy_fun 返回一个字符串,所以它被解释为一个可迭代的字符。请改用return doc.split()
  • 您能否使用正则表达式和虚拟方法更新您的答案,以供将来参考社区? @acattle
  • doc 是单个文档还是文档列表? TfidfVectorizer.fit_transform() 需要 a list of documents,而不是单个文档。也许试试vectorizer.fit_transform([doc])

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


【解决方案1】:

问题在于TfidfVectorizer 使用的默认标记明确地忽略了所有标点符号:

token_pattern : 字符串

表示什么构成“令牌”的正则表达式,仅在 Analyzer == 'word' 时使用。默认正则表达式选择 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 文档。

【讨论】:

  • 感谢您的帮助!...出于某种原因,我得到了:ValueError: empty vocabulary; perhaps the documents only contain stop words
  • 我更新了更多信息,再次感谢您的帮助!
  • 我更改了\S+__\([^()]+\) 的正则表达式,但仍然有问题!
  • 我修复了我的正则表达式的一个小问题。我已验证更新的版本正确标记了您的字符串,但是如果不了解更多关于 doc 包含的内容,我无法重现您的问题。
猜你喜欢
  • 2020-05-07
  • 2018-06-04
  • 2017-12-11
  • 2018-06-17
  • 2019-06-09
  • 2018-07-02
  • 2019-05-13
  • 2017-05-03
  • 2021-01-23
相关资源
最近更新 更多