Итак, я работал над этим проектом чата, я использую SVM для его ML и очень хочу использовать косинусное сходство в качестве ядра.я пытался использовать pykernel (, как предлагается из этого поста ) или другой код из другого источника, но он все еще не работает, и я не знаю, почему ...
говорят, чтоу меня есть train.py
код, подобный этому
from sklearn.feature_extraction.text import TfidfVectorizer
import numpy as np
import pickle, csv, json, timeit, random, os, nltk
from nltk.stem.lancaster import LancasterStemmer
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split as tts
from sklearn.preprocessing import LabelEncoder as LE
from Sastrawi.Stemmer.StemmerFactory import StemmerFactory
from Sastrawi.StopWordRemover.StopWordRemoverFactory import StopWordRemoverFactory
import my_kernel
def preprocessing(text):
factory1 = StopWordRemoverFactory()
StopWord = factory1.create_stop_word_remover()
text = StopWord.remove(text)
factory2 = StemmerFactory()
stemmer = factory2.create_stemmer()
return (stemmer.stem(text))
le = LE()
tfv = TfidfVectorizer(min_df=1)
file = os.path.join(os.path.dirname(os.path.abspath(__file__)),"scraping","tes.json")
svm_pickle_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),"data","svm_model.pickle")
if os.path.exists(svm_pickle_path):
os.remove(svm_pickle_path)
tit = [] # Title
cat = [] # Category
post = [] # Post
with open(file, "r") as sentences_file:
reader = json.load(sentences_file)
for row in reader:
tit.append(preprocessing(row["Judul"]))
cat.append(preprocessing(row["Kategori"]))
post.append(preprocessing(row["Post"]))
tfv.fit(tit)
le.fit(cat)
features = tfv.transform(tit)
labels = le.transform(cat)
trainx, testx, trainy, testy = tts(features, labels, test_size=.30, random_state=42)
model = SVC(kernel=my_kernel, C=1.5)
f = open(svm_pickle_path, 'wb')
pickle.dump(model.fit(trainx, trainy), f)
f.close()
print("SVC training score:", model.score(testx, testy))
with open(svm_pickle_path, 'rb') as file:
pickle_model = pickle.load(file)
score = pickle_model.score(testx, testy)
print("Test score: {0:.2f} %".format(100 * score))
Ypredict = pickle_model.predict(testx)
print(Ypredict)
и для my_kernel.py
кода:
import numpy as np
import math
from numpy import linalg as LA
def my_kernel(X, Y):
norm = LA.norm(X) * LA.norm(Y)
return np.dot(X, Y.T)/norm
, и он показывает это каждый раз, когда я запускаю программу
Traceback (most recent call last):
File "F:\env\chatbot\chatbotProj\chatbotProj\train.py", line 84, in <module>
pickle.dump(model.fit(trainx, trainy), f)
File "F:\env\lib\site-packages\sklearn\svm\base.py", line 212, in fit
fit(X, y, sample_weight, solver_type, kernel, random_seed=seed)
File "F:\env\lib\site-packages\sklearn\svm\base.py", line 252, in _dense_fit
X = self._compute_kernel(X)
File "F:\env\lib\site-packages\sklearn\svm\base.py", line 380, in _compute_kernel
kernel = self.kernel(X, self.__Xfit)
File "F:\env\chatbot\chatbotProj\chatbotProj\ChatbotCode\svm.py", line 31, in my_kernel
norm = LA.norm(X) * LA.norm(Y)
File "F:\env\lib\site-packages\numpy\linalg\linalg.py", line 2359, in norm
sqnorm = dot(x, x)
File "F:\env\lib\site-packages\scipy\sparse\base.py", line 478, in __mul__
raise ValueError('dimension mismatch')
ValueError: dimension mismatch
Я новичок в Python и в этой области SVM, кто-нибудь знает, что не так, или может порекомендовать мне, как написать ядро схожести косинусов лучше и чище?
Да, и размерность для поезда X равна (193,634), поезд Y - (193,), тест X - (83, 634) и тест Y - (83,) из train_test_split
sklearn.