As some of you may know, foreign languages are a big hobby of mine. I currently can speak French, Spanish, German, Russian, and Italian and am slowly building up my Thai. I have already started learning some Arabic and Mandarin and hope to learn those better soon. My love of languages was one reason for moving to the then Speech.Net group.
In order to keep track of all these languages, I have created a rather elaborate system that has evolved through the years. Back in college, I bought blank note cards and organized them in shoe boxes. I had a rather involved organizing system so new words would move through levels until it reached a pile of "known words", after which I would review these words every certain number of days. The main problem with this method was the tremendous number of cards (it took me two days to reorganize after dropping them accidentally once) and it took a long time to go through the cards each day.
My next system was a spiral notebook where I wrote 25 words to a page. Each day I would review the most recent pages and a certain number of the previous pages. Using this method, I was able to review words must quicker and it was much easier to carry. I also was able to back up my data using a copier. What I found over time though, was that typically only one or two words on a page would pose problems. Therefore I did not really need to review the other words on the page. In addition, I tended to memorize the order of the words on a page and I felt I was not really learning the words, as often given an English word I could not come up with the translation.
The logical move was to create a foreign language software program. I did not like any of the flashcard programs on the Internet so I wrote my own. The program followed my categorization system from before. Each word had a level between 1 and 10. When it is first entered, it is given a 10. Each time I get the word right, I subtracted a level. Each time I got it wrong, I added two levels. Levels could exceed 10 if I got the word wrong often. To review words, I simply stated how many words I wanted to test on and I would receive the highest level words. To make sure I regularly reviewed all words, if a word did not appear on a test for a certain period of time (I used two weeks), it would increase by a level.
To speed up tests, I created a flashcard system similar to the paper. It would present the words as if on a single piece of paper, covering up the definition until I said OK. Of course, it was up to me to determine whether my answer was correct. I did not implement typing in the answer because this would have slowed the tests down too much. For typing in words, the application changed the input keyboard appropriately and displayed a mapping of the keyboard to make it easy to enter words in other character sets such as Russian and Thai.
This worked great but I soon discovered two new problems. The first problem was I was forgetting words after not testing on them for a long time. Words would move down to a level 1 and by the time they leveled up to a point where I received them on a test, I had forgotten them. Changing the interval in which they were promoted only led to much larger tests to keep the number of level 10 words down. The second problem was I still received a large number of words on each test that I did not need to receive - I knew them already by heart.
I then proceeded to modify the program to be more intelligent about promoting words. I removed the ten level system in favor of a scheduled system. Each word is "scheduled" to be on a test at a specific date. The more difficult the system judges to word to be, the sooner the word will be scheduled. A rather involved algorithm is used to attempt to determine the potential difficulty of a word based on how many times at the beginning of its "life" it is missed and how often words entered close to the same time are missed. When I get a word correct, the schedule is extended for the next time, so there will be a longer period of time until I see it again.
This is the system I use now, however I still have several problems with it.
1) Tests are still too large. This is less of a problem with the algorithm than with the fact that I need to see the word too many times before it moves to my permanent knowledge. I find when I take the tests that I think of the word in my head rather than repeating it out loud. I need to modify the system to force me to repeat it out loud, as that will improve memorization. Also, the current system will ask new words exactly 1 + number of times missed, so if I get a new word right the first time it is asked it is scheduled for a later date. I need to modify the application to have a more thorough review for new words.
2) I test only vocabulary, not grammar. I have obviously had this problem since the flash cards but have long struggled with a solution. I thought of several elaborate attempts to test in a generic way for any grammar, but the simplest and best solution I have found is to add sample sentences to the vocabulary. So if I have six conjugations for an irregular verb I add a vocabulary item for each conjugation. I found this to be very effective and I have had success using this with Thai. When learning the language, if I find the structure of a sentence to not be intuitive, I add the entire sentence as a vocabulary item.
3) Tests take too long. Using the paper approach, I found myself having to go back to mark a word I previously marked as right, wrong, due to my reflexes. This slowed down tests. The only answer for this is to have the application determine whether my answer was right or wrong - meaning I need to add speech recognition here (see next post).
4) No support for writing Chinese characters. While I can enter Chinese characters using the IME, I need to modify the application to test writing the characters. Previous attempts at learning characters involved writing Chinese exercises from the text book. While this was helpful, I found myself forgetting characters so a testing technique here would be helpful. In an earlier attempt of my flashcard program I created a binary behavior that did this decently, and so I just need to build that into the testing program.
I hope this is helpful for those with the same problems I have had. I'm sure the next iteration will not be the final version (or the one after that) but each iteration has allowed me to learn more in a smaller period of time.