Как заставить мою al go работать с классификацией текста KNN? - PullRequest
0 голосов
/ 30 января 2020

Попытка сделать мою классификацию, принимая текст (строку), а не просто число (цифра c). Работая с данными, неся множество вытащенных статей, я хочу, чтобы классификация al go показала, какие из них следует выполнять, а какие отбрасывать. Применяя число, все работает просто отлично, но это не очень интуитивно понятно, хотя я знаю, что число представляет отношение к одному из двух классов, с которыми я работаю.

Как изменить логи c в al go, чтобы он принимал текст в качестве критерия поиска, а не просто анонимный номер, выбранный из столбца "Unique_id"? Столбцы, между прочим ... 'Title', 'Abstract', 'Relevant', 'Label', 'Unique_id'. Причиной объединения df в конце al go является то, что я хочу сравнить результаты. В заключение. Следует отметить, что столбец «Метка» состоит из списка ключевых слов, поэтому в основном я хочу, чтобы al go читал из этого столбца.

Я пробовал, читая из источников данных, изменяя ' index_col = 'Unique_id ' до ' index_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")

Это полный код (см. Конец al go, чтобы увидеть приведенный выше пример, как он выполняется сегодня, с использованием номера для определения ближайшего соседа):

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)

1 Ответ

0 голосов
/ 01 февраля 2020

Если я вас правильно понял, вы пытаетесь сделать это:

  • Вы векторизовали все свои документы с помощью их поля "Аннотация". Поэтому документы с рефератами с похожим распределением слов должны находиться рядом в пространстве TFIDF.
  • Вы хотите найти ближайших соседей к документу, который имеет ключевое слово для поиска.
  • Поэтому вам необходимо выполнить поиск исходный корпус для первого или всех документов, имеющих это ключевое слово
  • , затем найдите индекс этого / этих документов и затем найдите их соседей.
  • , если имеется несколько документов с по этому ключевому слову вам нужно будет отсортировать список индексов и каким-то образом объединить общие результаты с некоторыми весами.

Если это так, то поиск / поиск по ключевым словам на самом деле не «внутри» модели Это просто предварительный выбор документа из корпуса. Когда у вас есть индекс документа, вы можете выполнить KNN (многократно).

Я не очень знаком с Pandas, но я делал такие вещи "вручную", например, сохраняя заголовки документов в отдельном массиве с сопоставлением с индексами.

Я полагаю, вам нужно заменить вызовы data2.index.get_lo c () итерацией по значениям столбца для "Label". "и выполните простой поиск по каждой строке. Или Pandas обеспечивает функции поиска в корпусе?

Например, https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.query.html#pandas .DataFrame.query

...