public void extractFeature(List<Article> artList, boolean isTraining) {

		HashMap<Article, SentencePOS[]> allPos = new HashMap<Article, MophoFeatureExtractor.SentencePOS[]>();

		// load all short article POS tags with article id
		for (int i = 0; i < artList.size(); i++) {
			System.out.println(i);
			Article art = artList.get(i);
			// if (art.getSentenceCount() > THRESH_HOLD
			// || art.getSentenceCount() == 0) {
			// // run only on short articles
			// continue;
			// }
			SentencePOS[] sentPos = new SentencePOS[art.getSentences().size()];
			allPos.put(art, sentPos);
			for (int j = 0; j < art.getSentences().size(); j++) {
				sentPos[j] = SentencePOS
						.calculatePos(art.getSentences().get(j));
			}
		}

		String outFileName = "morph-feature-" + new Date().getTime() + ".txt";
		String outPath = Pipeline.prop.getProperty("feature.folder");
		PrintWriter out = null;
		try {
			out = new PrintWriter(new FileWriter(outPath + "/" + outFileName));
			// extract POS features
			for (Entry<Article, SentencePOS[]> entry : allPos.entrySet()) {
				StringBuilder sb = new StringBuilder();
				for (MorphFeaturesCalculator calc : calcs) {
					sb.append(calc.calculateFeature(entry) + "\t");
				}
				if (isTraining) {
					sb.append(entry.getKey().getLabel());
				}
				out.println(sb.toString());
			}
		} catch (IOException ioe) {
			ioe.printStackTrace();
		} finally {
			if (out != null) {
				out.flush();
				out.close();
			}
			out = null;
		}
	}