【问题标题】:How can I vectorize a series of tokens如何矢量化一系列标记
【发布时间】:2020-11-12 16:23:58
【问题描述】:

我有一系列要矢量化的标记。但是,我不断收到错误消息“TypeError:预期的字符串或类似字节的对象”。

我的文本标记:

tokens_raw
0 [kitchen, getting, children, ready, school, ru...
1 [shanghai, appointed, manager, taco, bell, chi...
2 [april, uber, announced, acquisition, otto, sa... etc.....

我的代码:

# list of tokens from text documents
tokens_raw = articles_df_60k['processed_content']

# create the transform
vectorizer = TfidfVectorizer(sublinear_tf=True, min_df=5, lowercase=False,
                             encoding='latin-1', ngram_range=(1, 2))

# tokenize and build vocab
vectorizer.fit(tokens_raw)
 
# summarize
print("vocabulary count:", vectorizer.vocabulary_, sep='\n')
print('\n')
print("inverse document frequency:", vectorizer.idf_, sep='\n')
print('\n')

# encode document
vector = vectorizer.transform(tokens_raw)

# summarize encoded vector
print("vector shape:", vector_raw.shape, sep='\n')
print('\n')
print("vector array:", vector_raw.toarray(), sep='\n')

同样,错误消息是“TypeError:预期的字符串或类似字节的对象”。如果我只输入它就可以了

tokens_raw[0]

但是,尝试将其应用于所有行会返回错误消息。任何指导、解释或解决方案将不胜感激。

【问题讨论】:

    标签: python python-3.x machine-learning nlp vectorization


    【解决方案1】:

    TFIDF Vectorizer 期望输入数据为字符串。但您给出的是单词列表。

    tokens_raw=[['kitchen', 'getting', 'children', 'ready', 'school'],['shanghai', 'appointed', 'manager', 'taco', 'bell']]
    tokens_raw=[" ".join(t) for t in tokens_raw]
    from sklearn.feature_extraction.text import TfidfVectorizer
    vectorizer = TfidfVectorizer()
    X =vectorizer.fit_transform(tokens_raw)
    print("Shape: ",X.shape)
    print(X.todense())
    

    输出:

    Shape:  (2, 10)
    [[0.        0.        0.4472136 0.4472136 0.4472136 0.        0.4472136
      0.4472136 0.        0.       ]
     [0.4472136 0.4472136 0.        0.        0.        0.4472136 0.
      0.        0.4472136 0.4472136]]
    

    希望这行得通。

    【讨论】:

      【解决方案2】:

      正如@Praveen 所说,sklearn 的矢量化器默认需要一个字符串列表。要了解问题的根本原因,您应该了解每个字符串会发生什么。 Sklearn 的文本模块(参见feature_exraction/text.py,尤其是build_analyzer_analyze)获取每个字符串并按顺序大致执行以下分析:

      • 解码任何“有趣”的字符
      • 预处理文本,例如通过将重音字符替换为对应的 ascii 字符
      • 标记文本。此时每个文档(字符串)都将是一个标记列表(字符串列表)
      • 提取 n-gram

      重要的是这些步骤中的每一个都是可配置的并且可以被覆盖。您的数据已经看起来很整洁,因此您不需要任何解码或字符规范化。您的文本已被标记化,因此您可以告诉 sklearn 不要做任何事情:

      from sklearn.feature_extraction.text import TfidfVectorizer
      
      tokens_raw = [
          ["kitchen", "getting", "children", "ready", "school"],
          ["shanghai", "appointed", "manager", "taco", "bell"],
      ]
      
      vectorizer = TfidfVectorizer(analyzer=lambda x: x)
      X = vectorizer.fit_transform(tokens_raw)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-06
        • 2013-12-30
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2019-01-04
        • 1970-01-01
        相关资源
        最近更新 更多