使用 TF-IDF 分数进行文本分类的 KNN

Posted

技术标签:

【中文标题】使用 TF-IDF 分数进行文本分类的 KNN【英文标题】:KNN for Text Classification using TF-IDF scores 【发布时间】:2020-03-22 06:01:38 【问题描述】:

我在语料库中有一个 CSV 文件 (corpus.csv),其中包含以下格式的分级摘要(文本):

Institute,    Score,    Abstract


----------------------------------------------------------------------


UoM,    3.0,    Hello, this is abstract one

UoM,    3.2,    Hello, this is abstract two and yet counting.

UoE,    3.1,    Hello, yet another abstract but this is a unique one.

UoE,    2.2,    Hello, please no more abstract.

我正在尝试在 python 中创建一个 KNN 分类程序,该程序能够获取用户输入摘要,例如“这是一个新的独特摘要”,然后将此用户输入摘要分类为最接近语料库 (CSV) 和还返回预测摘要的分数/等级。我怎样才能做到这一点?

我有以下代码:

from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.corpus import stopwords
import numpy as np
import pandas as pd
from csv import reader,writer
import operator as op
import string

#Read data from corpus
r = reader(open('corpus.csv','r'))
abstract_list = []
score_list = []
institute_list = []
row_count = 0
for row in list(r)[1:]:
    institute,score,abstract = row
    if len(abstract.split()) > 0:
      institute_list.append(institute)
      score = float(score)
      score_list.append(score)
      abstract = abstract.translate(string.punctuation).lower()
      abstract_list.append(abstract)
      row_count = row_count + 1

print("Total processed data: ", row_count)

#Vectorize (TF-IDF, ngrams 1-4, no stop words) using sklearn -->
vectorizer = TfidfVectorizer(analyzer='word', ngram_range=(1,4),
                     min_df = 0, stop_words = 'english', sublinear_tf=True)
response = vectorizer.fit_transform(abstract_list)
feature_names = vectorizer.get_feature_names()

在上述代码中,如何使用 TF-IDF 计算中的特征进行上述 KNN 分类? (大概使用sklearn.neighborsKNeighborsClassifier框架)

附:这个应用案例的类别是摘要的各自分数/等级。

我有视觉深度学习方面的背景,但是我在文本分类方面缺乏很多知识,尤其是使用 KNN。任何帮助将非常感激。提前谢谢你。

【问题讨论】:

【参考方案1】:

KNN 是一种分类算法——这意味着你必须有一个类属性。 KNN 可以使用 TFIDF 的输出作为输入矩阵 - TrainX,但您仍然需要 TrainY - 数据中每一行的类。但是,您可以使用 KNN 回归器。 使用你的分数作为类变量:

from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.corpus import stopwords
import numpy as np
import pandas as pd
from csv import reader,writer
import operator as op
import string
from sklearn import neighbors

#Read data from corpus
r = reader(open('corpus.csv','r'))
abstract_list = []
score_list = []
institute_list = []
row_count = 0
for row in list(r)[1:]:
    institute,score,abstract = row[0], row[1], row[2]
    if len(abstract.split()) > 0:
      institute_list.append(institute)
      score = float(score)
      score_list.append(score)
      abstract = abstract.translate(string.punctuation).lower()
      abstract_list.append(abstract)
      row_count = row_count + 1

print("Total processed data: ", row_count)

#Vectorize (TF-IDF, ngrams 1-4, no stop words) using sklearn -->
vectorizer = TfidfVectorizer(analyzer='word', ngram_range=(1,4),
                     min_df = 0, stop_words = 'english', sublinear_tf=True)
response = vectorizer.fit_transform(abstract_list)
classes = score_list
feature_names = vectorizer.get_feature_names()

clf = neighbors.KNeighborsRegressor(n_neighbors=1)
clf.fit(response, classes)
clf.predict(response)

“预测”将预测每个实例的分数。

【讨论】:

感谢您的回答。这个应用案例的类别是摘要的各自分数/等级 所以,在这种情况下,我认为回归更合适。 OK - 所以你可以使用 KNN 回归器。请参阅上面的编辑答案。 感谢您提供更新的答案。我试图预测一个特定的抽象,这样:abstract_input = "This is a new unique abstract" predict = clf.predict([[abstract_input]])。我收到以下错误:ValueError:无法将字符串转换为浮点数:“这是一个新的唯一摘要”。

以上是关于使用 TF-IDF 分数进行文本分类的 KNN的主要内容,如果未能解决你的问题,请参考以下文章

python使用KNN文本分类

文本分类采用同义词的改进TF-IDF权重的文本分类

文本分类 + NLP + 数据挖掘 + 数据科学:我应该在应用 tf-idf 之前进行停止词删除和词干提取吗?

词袋模型(新闻文本分类)

文本分类基于改进TF-IDF特征的中文文本分类系统

python [NLTK实现TF-IDF]#TF-IDF#算法#数据挖掘#文本挖掘#文本分类