Python 3.x 如何使我的算法与KNN文本分类一起工作?

Python 3.x 如何使我的算法与KNN文本分类一起工作?,python-3.x,nlp,knn,text-classification,Python 3.x,Nlp,Knn,Text Classification,试图使我的分类接受文本(字符串),而不仅仅是数字(数字)。处理数据,携带大量的拖拉物品,我希望分类算法能够显示哪些物品需要处理,哪些物品需要丢弃。应用一个数字,一切都很好,但这不是很直观,尽管我知道这个数字表示与我正在使用的两个类之一的关系 如何更改algo中的逻辑,使其接受文本作为搜索条件,而不仅仅是从“Unique_id”列中选择的匿名号码?列是,顺便说一句…“标题”,“摘要”,“相关”,“标签”,“唯一id”。在algo端连接df的原因是我想比较结果。最后应该注意的是,col‘Label’

试图使我的分类接受文本(字符串),而不仅仅是数字(数字)。处理数据,携带大量的拖拉物品,我希望分类算法能够显示哪些物品需要处理,哪些物品需要丢弃。应用一个数字,一切都很好,但这不是很直观,尽管我知道这个数字表示与我正在使用的两个类之一的关系

如何更改algo中的逻辑,使其接受文本作为搜索条件,而不仅仅是从“Unique_id”列中选择的匿名号码?列是,顺便说一句…“标题”,“摘要”,“相关”,“标签”,“唯一id”。在algo端连接df的原因是我想比较结果。最后应该注意的是,col‘Label’由一系列关键字组成,因此基本上我希望algo从该col读取

我确实尝试过,从数据源读取,将“index\u col='Unique\u id'更改为“index\u col='Label”,但也没有成功

我想要的一个例子:

print("\nPrint KNN1")
print(get_closest_neighs1('search word'), "\n")

print("\nPrint KNN2")
print(get_closest_neighs2('search word'), "\n")

print("\nPrint KNN3")
print(get_closest_neighs3('search word'), "\n")
这是完整的代码(查看algo的末尾以查看上面的示例,因为它今天正在运行,使用一个数字来标识最近的邻居):


如果我对你的理解是正确的,那么你正在尝试这样做:

  • 您已通过“摘要”字段将所有文档矢量化。因此,具有类似单词分布的摘要的文档应该在TFIDF空间的附近
  • 您希望找到具有搜索关键字的文档的最近邻居
  • 因此,您需要在原始语料库中搜索第一个或所有包含该关键字的文档
  • 然后找到该文档的索引,然后找到它们的邻居
  • 如果有多个文档具有该关键字,则需要对索引列表进行排序,并以某种方式使用某些权重合并整体结果
如果这是真的,那么关键字搜索/查找实际上不是“在”模型中,它只是从语料库中预选一个文档。一旦有了文档索引,就可以重复执行KNN

我对Pandas不太熟悉,但我以前“手动”做过这种事情,例如,将文档标题保存在单独的数组中,并带有索引映射

我想您可能需要将data2.index.get_loc()调用替换为对“Label”的列值进行迭代,并对每个列进行简单的字符串搜索。还是熊猫在语料库中提供搜索功能


e、 g.

Hi Sciplot,谢谢你回复我的问题,你对我问题的看法非常正确。。。;o) 你是说整个文本分析部分是没有必要的,我应该直接在原始语料库中搜索吗?我猜执行TF-IDF之类的预处理的真正原因是利用这样一种直觉,即如果一个单词在文档中多次出现,文档或我在语料库中选择的任何其他内容的相关性就会提高。我可能误解了你的意思,试图更改一些代码,例如:get_loc to.query你能举个例子说明我应该如何应用你的建议吗?-实际上,我尝试用“Label”列创建索引,然后指向“Abstract”列中的对应项。我确信我犯了一个愚蠢的错误,但我无法找出错误隐藏的地方。。。;o/。。。;o) 这取决于你想要达到的目标。如果您想在贴标签的文档附近找到未贴标签的文档(即,您不信任原始标签),那么最好使用TFIDF邻居。但是如果你认为标签一开始是正确的,那么你就可以通过标签列搜索原始语料库,甚至不用麻烦对它们进行矢量化。我认为2k+文本字符串(即不同的科学摘要)的列表是未标记的数据,这也是我执行TF的原因。您能否提供第一个CSV的简短摘录?
import pandas as pd

print("\nPerforming Analysis using Text Classification")
data = pd.read_csv('File_1_coltest_demo.csv', sep=';',  encoding="ISO-8859-1").dropna()

data['Unique_id'] = data.groupby(['Title', 'Abstract', 'Relevant']).ngroup()

data.to_csv('File_2_coltest_demo_KNN.csv', sep=';', encoding="ISO-8859-1", index=False)

data1 = pd.read_csv('File_2_coltest_demo_KNN.csv', sep=';', encoding="ISO-8859-1", index_col='Unique_id')

data2 = pd.DataFrame(data1, columns=['Abstract', 'Relevant'])

data2.to_csv('File_3_coltest_demo_KNN_reduced.csv', sep=';', encoding="ISO-8859-1", index=False)

print("\nData top 25 items")
print(data2.head(25))

print("\nData info")
print(data2.info())

print("\nData columns")
print(data2.columns)

from sklearn.feature_extraction.text import CountVectorizer
from nltk.tokenize import RegexpTokenizer

token = RegexpTokenizer(r'[a-zA-Z0-9]+')
cv = CountVectorizer(lowercase=True, stop_words='english', ngram_range=(1, 1), tokenizer=token.tokenize)
text_counts = cv.fit_transform(data2['Abstract'])

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
text_counts, data2['Abstract'], test_size=0.5, random_state=1)

print("\nTF IDF")
from sklearn.feature_extraction.text import TfidfVectorizer
tf = TfidfVectorizer()
text_tf = tf.fit_transform(data2['Abstract'])
print(text_tf)

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(
text_tf, data2['Abstract'], test_size=0.3, random_state=123)

from sklearn.neighbors import NearestNeighbors
import pandas as pd

nbrs = NearestNeighbors(n_neighbors=20, metric='euclidean').fit(text_tf)

def get_closest_neighs1(Abstract):
    row = data2.index.get_loc(Abstract)
    distances, indices = nbrs.kneighbors(text_tf.getrow(row))
    names_similar = pd.Series(indices.flatten()).map(data2.reset_index()['Abstract'])
    result = pd.DataFrame({'distance1' : distances.flatten(), 'Abstract' : names_similar}) # 'Unique_id' : names_similar,
    return result

def get_closest_neighs2(Unique_id):
    row = data2.index.get_loc(Unique_id)
    distances, indices = nbrs.kneighbors(text_tf.getrow(row))
    names_similar = pd.Series(indices.flatten()).map(data2.reset_index()['Unique_id'])
    result1 = pd.DataFrame({'Distance' : distances.flatten() / 10, 'Unique_id' : names_similar}) # 'Unique_id' : names_similar,
    return result1

def get_closest_neighs3(Relevant):
    row = data2.index.get_loc(Relevant)
    distances, indices = nbrs.kneighbors(text_tf.getrow(row))
    names_similar = pd.Series(indices.flatten()).map(data2.reset_index()['Relevant'])
    result2 = pd.DataFrame({'distance2' : distances.flatten(), 'Relevant' : names_similar}) # 'Unique_id' : names_similar,
    return result2

print("\nPrint KNN1")
print(get_closest_neighs1(114), "\n")

print("\nPrint KNN2")
print(get_closest_neighs2(114), "\n")

print("\nPrint KNN3")
print(get_closest_neighs3(114), "\n")

data3 = pd.DataFrame(get_closest_neighs1(114))
data4 = pd.DataFrame(get_closest_neighs2(114))
data5 = pd.DataFrame(get_closest_neighs3(114))

del data5['distance2']

data6 = pd.concat([data3, data4, data5], axis=1).reindex(data3.index)

del data6['distance1']

data6.to_csv('File_4_coltest_demo_KNN_results.csv', sep=';', encoding="ISO-8859-1", index=False)