sklearn tfidfvectorizer:如何在列上交叉tfidf框架?

时间:2017-12-10 14:17:32

标签: python-3.x scikit-learn tf-idf sklearn-pandas

在R中,我可以提取包含特定术语的行(文档),通过将文档术语矩阵(dtm)与所需的列名相交来说“丰田”,如下所示:

dtm <- DocumentTermMatrix(mycorpus, control = list(tokenize = TrigramTokenizer))
x.df<-as.matrix(dtm[1:ncorpus, intersect(colnames(dtm), "toyota"),drop=FALSE])

问题是我在Python sklearn包中找不到等效的方法。所以我以迂回的方式解决这个问题:

  1. 首先我得到行的索引值,其中tfidf框架中的相关列(“toyota”)不为空;列名称是要素名称。
  2. 然后我将主要的pandas数据帧切片到已识别的行索引上。
  3. 现在我有一个数据框,每行包含“toyota”。
  4. MVP:

    rows_to_keep=tfidf_df[tfidf_df.toyota.notnull()].index data=my_df.loc[rows_to_keep,:] print(data.shape)

    这很有效。问题是如何将迭代器传递给此语句?

    car_make=['toyota','ford','nissan','gmotor','honda','suzuki']
    

    然后for zentity in car_make:

    rows_to_keep=tfidf_df[tfidf_df.zentity.notnull()].index

    不起作用。

      

    AttributeError:'SparseDataFrame'对象没有属性'zentity'

    我故意选择zentity以避免与tfidf中的任何列名等效。

    是否有一种干净的方法来制作交集并仅提取列不为空(NaN)的行?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

而不是 rows_to_keep=tfidf_df[tfidf_df.zentity.notnull()].index

你应该使用类似的东西 rows_to_keep=tfidf_df[tfidf_df[zentity].notnull()].index

使用像zentity这样的变量,即使它存储了一个字符串,对于属性访问,tfidf_df的列似乎总是会失败。我现在不确定为什么(我认为它与DataFrame在创建列名时如何处理列名以及类对象属性访问通常如何工作有关),但我会查找它。