diff --git a/java/src/com/android/inputmethod/latin/NgramContext.java b/java/src/com/android/inputmethod/latin/NgramContext.java
index 53bec6e..c935158 100644
--- a/java/src/com/android/inputmethod/latin/NgramContext.java
+++ b/java/src/com/android/inputmethod/latin/NgramContext.java
@@ -146,6 +146,32 @@
                 : TextUtils.join(CONTEXT_SEPARATOR, terms);
     }
 
+    /**
+     * Extracts the previous words context.
+     *
+     * @return a String array with the previous words.
+     */
+    public String[] extractPrevWordsContextArray() {
+        final ArrayList<String> prevTermList = new ArrayList<>();
+        for (int i = mPrevWordsInfo.length - 1; i >= 0; --i) {
+            if (mPrevWordsInfo[i] != null && mPrevWordsInfo[i].isValid()) {
+                final NgramContext.WordInfo wordInfo = mPrevWordsInfo[i];
+                if (wordInfo.mIsBeginningOfSentence) {
+                    prevTermList.add(BEGINNING_OF_SENTENCE_TAG);
+                } else {
+                    final String term = wordInfo.mWord.toString();
+                    if (!term.isEmpty()) {
+                        prevTermList.add(term);
+                    }
+                }
+            }
+        }
+        final String[] contextStringArray = prevTermList.size() == 0 ?
+                new String[] { BEGINNING_OF_SENTENCE_TAG }
+                : prevTermList.toArray(new String[prevTermList.size()]);
+        return contextStringArray;
+    }
+
     public boolean isValid() {
         return mPrevWordsCount > 0 && mPrevWordsInfo[0].isValid();
     }
diff --git a/tests/src/com/android/inputmethod/latin/NgramContextTests.java b/tests/src/com/android/inputmethod/latin/NgramContextTests.java
index ab1819d..97143a3 100644
--- a/tests/src/com/android/inputmethod/latin/NgramContextTests.java
+++ b/tests/src/com/android/inputmethod/latin/NgramContextTests.java
@@ -64,4 +64,43 @@
                 ngramContext_b_a.getNextNgramContext(new WordInfo("c"));
         assertEquals("c", ngramContext_c_bos.getNthPrevWord(1));
     }
+
+    public void testExtractPrevWordsContextTest() {
+        final NgramContext ngramContext_bos =
+                new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
+        assertEquals("<S>", ngramContext_bos.extractPrevWordsContext());
+        final NgramContext ngramContext_a = new NgramContext(new WordInfo("a"));
+        final NgramContext ngramContext_b_a =
+                ngramContext_a.getNextNgramContext(new WordInfo("b"));
+        assertEquals("b", ngramContext_b_a.getNthPrevWord(1));
+        assertEquals("a", ngramContext_b_a.getNthPrevWord(2));
+        assertEquals("a b", ngramContext_b_a.extractPrevWordsContext());
+
+        final NgramContext ngramContext_bos_b =
+                ngramContext_b_a.getNextNgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
+        assertTrue(ngramContext_bos_b.isBeginningOfSentenceContext());
+        assertEquals("b", ngramContext_bos_b.getNthPrevWord(2));
+        assertEquals("a b <S>", ngramContext_bos_b.extractPrevWordsContext());
+    }
+
+    public void testExtractPrevWordsContextArray() {
+        final NgramContext ngramContext_bos =
+                new NgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
+        assertEquals("<S>", ngramContext_bos.extractPrevWordsContext());
+        final NgramContext ngramContext_a = new NgramContext(new WordInfo("a"));
+        final NgramContext ngramContext_b_a =
+                ngramContext_a.getNextNgramContext(new WordInfo("b"));
+        assertEquals("b", ngramContext_b_a.getNthPrevWord(1));
+        assertEquals("a", ngramContext_b_a.getNthPrevWord(2));
+        assertEquals("a", ngramContext_b_a.extractPrevWordsContextArray()[0]);
+        assertEquals("b", ngramContext_b_a.extractPrevWordsContextArray()[1]);
+
+        final NgramContext ngramContext_bos_b =
+                ngramContext_b_a.getNextNgramContext(WordInfo.BEGINNING_OF_SENTENCE_WORD_INFO);
+        assertTrue(ngramContext_bos_b.isBeginningOfSentenceContext());
+        assertEquals("b", ngramContext_bos_b.getNthPrevWord(2));
+        assertEquals("a", ngramContext_bos_b.extractPrevWordsContextArray()[0]);
+        assertEquals("b", ngramContext_bos_b.extractPrevWordsContextArray()[1]);
+        assertEquals("<S>", ngramContext_bos_b.extractPrevWordsContextArray()[2]);
+    }
 }
