Python 3.x 如何使我的算法与KNN文本分类一起工作?
试图使我的分类接受文本(字符串),而不仅仅是数字(数字)。处理数据,携带大量的拖拉物品,我希望分类算法能够显示哪些物品需要处理,哪些物品需要丢弃。应用一个数字,一切都很好,但这不是很直观,尽管我知道这个数字表示与我正在使用的两个类之一的关系 如何更改algo中的逻辑,使其接受文本作为搜索条件,而不仅仅是从“Unique_id”列中选择的匿名号码?列是,顺便说一句…“标题”,“摘要”,“相关”,“标签”,“唯一id”。在algo端连接df的原因是我想比较结果。最后应该注意的是,col‘Label’由一系列关键字组成,因此基本上我希望algo从该col读取 我确实尝试过,从数据源读取,将“index\u col='Unique\u id'更改为“index\u col='Label”,但也没有成功 我想要的一个例子: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’
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空间的附近
- 您希望找到具有搜索关键字的文档的最近邻居
- 因此,您需要在原始语料库中搜索第一个或所有包含该关键字的文档
- 然后找到该文档的索引,然后找到它们的邻居
- 如果有多个文档具有该关键字,则需要对索引列表进行排序,并以某种方式使用某些权重合并整体结果
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)