【问题标题】:What is an efficient data structure for tokenized data in Python?Python中标记化数据的有效数据结构是什么?
【发布时间】:2015-04-24 09:14:53
【问题描述】:

我有一个 pandas 数据框,其中有一列包含一些文本。我想修改数据框,以便在所有行中出现的每个不同单词都有一个列,以及一个布尔值,指示该单词是否出现在我的文本列中该特定行的值中。

我有一些代码可以做到这一点:

from pandas import *

a = read_table('file.tsv', sep='\t', index_col=False)
b = DataFrame(a['text'].str.split().tolist()).stack().value_counts()

for i in b.index:
    a[i] = Series(numpy.zeros(len(a.index)))

for i in b.index:
    for j in a.index:
        if i in str.split(a['text'][j]:
            a[i][j] = 1

但是,我的数据集非常大(200,000 行和大约 70,000 个唯一词)。有没有更有效的方法来做到这一点,不会破坏我的电脑?

【问题讨论】:

    标签: python performance text pandas tokenize


    【解决方案1】:

    我建议使用sklearn,特别是CountVectorizer

    import pandas as pd
    from sklearn.feature_extraction.text import CountVectorizer
    vect= CountVectorizer(binary =True)
    
    
    
     df= pd.DataFrame({'text':['cat on the cat','angel eyes has','blue red angel','one two blue','blue whales eat','hot tin roof','angel eyes has','have a cat'],'labels':\
                      [1,0,1,1,0,0,1,1]})
    
    
    
    
    X = vect.fit_transform(df['text'].values)
    y = df['labels'].values
    X
    
    <8x16 sparse matrix of type '<type 'numpy.int64'>'
    with 23 stored elements in Compressed Sparse Row format>
    

    这会返回一个sparse matrix,其中m 是来自df 的行,n 是一组单词。在矩阵的大多数元素为 0 的情况下,稀疏格式更适合节省内存。保持稀疏格式似乎是可行的方法,许多“sklearn”算法采用稀疏输入。

    您可以从 X 创建一个数据框(如果确实需要,但它会很大):

    word_counts =pd.DataFrame(X.todense(),columns = vect.get_feature_names())
    

    【讨论】:

    • 谢谢,这听起来像是我想要的。不过,一个问题是我仍然关心数据框中包含“标签”的另一列(实际上我确实打算将其输入到各种回归中)。有没有办法拥有该稀疏矩阵,但仍将其加入标签,以便我可以轻松地将其输入 sklearn ML 算法?
    • 实际上,没关系 - 我认为这并不重要,因为您通常将 X 和 y 作为单独的对象传递,对吧?
    • 太好了,非常感谢。我有一个快速跟进的问题。我现在已经对标记化数据进行了逻辑回归训练(谢谢!),并且想检查通过训练该数据生成的系数。我可以用这段代码很好地做到这一点: logreg = linear_model.LogisticRegression(C=1) d = logreg.fit(X, c['label']) d.coef_ 但是,我如何确定哪个 coef_ 对应于哪个术语在我上面生成的稀疏矩阵 X 中?
    • 理想情况下,您应该在单独的问题中提出这个问题。
    猜你喜欢
    • 2010-09-05
    • 1970-01-01
    • 2012-11-04
    • 2011-05-14
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    相关资源
    最近更新 更多