import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import preprocessing
import sys

args = sys.argv

if(len(args)<4):
	print("Usage: python3 %s word_data/char_data celltype/antigen n(1 to 10)" % args[0])

elif(len(args)>4):
	ipfile = args[4]
	opfile = args[5]

	##transform non-numerical labels to integer
	le = preprocessing.LabelEncoder()
	input_label = ipfile
	output_label = opfile
	with open(input_label) as f:
		l = f.readlines()
		l = [x.strip('\n') for x in l]
		le.fit(l)
		label = le.transform(l)
		print('label:', label)
		np.savetxt(output_label, label, fmt='%d')

else:
	##Apply ngram to transforming text feature into integer array
	if(args[1]=='word_data'): 
		analyze_type = 'char_wb'
	if(args[1]=='char_data'): 
		analyze_type = 'char'
	cv_train = CountVectorizer(analyzer=analyze_type, ngram_range=(int(args[3]),int(args[3])), min_df = 1)
	cv_test = CountVectorizer(analyzer=analyze_type, ngram_range=(int(args[3]),int(args[3])), min_df = 1)
	for i in range(1,11):
		ipfile_train = args[1]+'/c10_train'+str(i)+'_human_'+args[2]+'_feature.txt'
		opfile_train = args[1]+'/c10_train'+str(i)+'_human_'+args[2]+'_'+args[3]+'gramfeature.txt'
		ipfile_test = args[1]+'/c10_test'+str(i)+'_human_'+args[2]+'_feature.txt'
		opfile_test = args[1]+'/c10_test'+str(i)+'_human_'+args[2]+'_'+args[3]+'gramfeature.txt'
	
		feature_name_test={} #list
		feature_test={} #matrix
		with open(ipfile_test) as f:
			corpus = f.readlines()
			feature_test = cv_test.fit_transform(corpus).toarray()
			feature_name_test = cv_test.get_feature_names()
	
		with open(ipfile_train) as f:
			corpus = f.readlines()
			feature_train = cv_train.fit_transform(corpus).toarray()
			np.savetxt(opfile_train, feature_train, fmt='%-5.1f')
			row,col = feature_test.shape[0], feature_train.shape[1]
			new_test_feature = np.array([[0 for x in range(col)] for y in range(row)])
			cnt=0
			for w in cv_train.get_feature_names():
				if w not in feature_name_test:
					new_test_feature[:,cnt]=[0 for x in range(row)]
				else:
					feature_index = cv_test.vocabulary_.get(w)
					#print(feature_index,type(feature_index))
					new_test_feature[:,cnt]=feature_test[:,feature_index]
				cnt+=1
			np.savetxt(opfile_test,new_test_feature,fmt='%-5.1f')
