Find top n terms with highest TF-IDF score per cla

2019-08-09 17:09发布

问题:

Let's suppose that I have a dataframe with two columns in pandas which resembles the following one:

    text                                label
0   This restaurant was amazing         Positive
1   The food was served cold            Negative
2   The waiter was a bit rude           Negative
3   I love the view from its balcony    Positive

and then I am using TfidfVectorizer from sklearn on this dataset.

What is the most efficient way to find the top n in terms of TF-IDF score vocabulary per class?

Apparently, my actual dataframe consists of many more rows of data than the 4 above.

The point of my post to find the code which works for any dataframe which resembles the one above; either 4-rows dataframe or 1M-rows dataframe.

I think that my post is related quite a lot to the following posts:

  • Scikit Learn TfidfVectorizer : How to get top n terms with highest tf-idf score
  • How to see top n entries of term-document matrix after tfidf in scikit-learn

回答1:

In the following, you can find a piece of code I wrote more than three years ago for a similar purpose. I'm not sure if this is the most efficient way of doing what you're going to do, but as far as I remember, it worked for me.

# X: data points
# y: targets (data points` label)
# vectorizer: TFIDF vectorizer created by sklearn
# n: number of features that we want to list for each class
# target_list: the list of all unique labels (for example, in my case I have two labels: 1 and -1 and target_list = [1, -1])
# --------------------------------------------
# splitting X vectors based on target classes
for label in target_list:
    # listing the most important words in each class
    indices = []
    current_dict = {}

    # finding indices the of rows (data points) for the current class
    for i in range(0, len(X.toarray())):
        if y[i] == label:
            indices.append(i)

    # get rows of the current class from tf-idf vectors matrix and calculating the mean of features values
    vectors = np.mean(X[indices, :], axis=0)

    # creating a dictionary of features with their corresponding values
    for i in range(0, X.shape[1]):
        current_dict[X.indices[i]] = vectors.item((0, i))

    # sorting the dictionary based on values
    sorted_dict = sorted(current_dict.items(), key=operator.itemgetter(1), reverse=True)

    # printing the features textual and numeric values
    index = 1
    for element in sorted_dict:
        for key_, value_ in vectorizer.vocabulary_.items():
            if element[0] == value_:
                print(str(index) + "\t" + str(key_) + "\t" + str(element[1]))
                index += 1
                if index == n:
                    break
        else:
            continue
        break