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

args = sys.argv

if(len(args)<6):
  print("Usage: python3 %s word_data/char_data celltype/antigen gram_n1(1 to 10) gram_n2(1 to 10) filter_n(1-10)" % args[0])

elif(len(args)>8):
  ipfile = args[7]
  opfile = args[8]

  ##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[4])), min_df = 1)
  cv_test = CountVectorizer(analyzer=analyze_type, ngram_range=(int(args[3]),int(args[4])), min_df = 1)
  ipfile_train = 'label_feature/'+args[6]+'/c'+args[5]+'_unclassified_training_'+args[2]+'_feature.txt'
  opfile_train = args[1]+'/'+args[6]+'/c'+args[5]+'_unclassified_training_'+args[2]+'_'+args[3]+'-'+args[4]+'gramfeature.txt'
  ipfile_test = 'label_feature/'+args[6]+'/c'+args[5]+'_unclassified_curated_'+args[2]+'_feature.txt'
  opfile_test = args[1]+'/'+args[6]+'/c'+args[5]+'_unclassified_curated_'+args[2]+'_'+args[3]+'-'+args[4]+'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')
