Self Assessment

Assess your answer to the programming question using the following critiques. Figure approximately 2 points for each serious class of failure. The question as a whole was worth 10 points. The sample answer is probably worth 20, since it's beyond what I could do in an hour.

Incorrect Singularity Assumptions

One of the main points of this question was dealing with several many-to-many relationships. Words and phrases can have multiple meanings, target concepts can have multiple index sets, the same concepts may appear in the input multiple times, and so on.

Subtract points if your code assumes only one

Extra credit if you noted that ambiguous inputs might better be done by separately scoring each parse, rather than simply lumping all word and phrase concepts together.

Egregious Inefficiencies

The question explicitly said not to trade clarity for efficiency, but some inefficiencies were unnecessary and no clearer than more efficient alternatives.

Subtract points if your code

No Hope for the Future

The other main point of the question was to see if you had some idea for seriously improving the efficiency of the method so that it would scale to large memories. Set operations like intersection are N-squared. Simply speeding up the operations, e.g., by using caching, isn't enough. You have to remove the N-squared factor, or drastically control N.

The example solution points to a common approach -- building a discrimination tree of index sets. There are also methods for reducing the code of set operations from N times M to N plus M.

Subtract points if you had no suggestions for improving the code beyond caching or replacing list building with counting.

Miscellaneous

Subtract points if your code