Slow data-processing and inefficient memory usage in .NET containers
Edit in response to OP comment above:

CreateCategoryClasses may appear to be slow because of the WaitOne calls.  You're essentially waiting waiting on either ParseCategories or AddIDF to complete before moving on. It would help if you could also post the ParseCategories method as well.  Otherwise, you're just adding stuff to collections, which generally shouldn't perform too bad, except for some of my comments below.

Original answer:

Some of this is performance suggestions, some is just general advice...


If you have one, run this through a performance profiler. This can point you directly to the lines that are using the most CPU time very quickly. Personally, I use ANTS from Red Gate.  Another good one is DotTrace from JetBrains.
Why is categoryClasses a ConcurrentQueue?  As a general rule, a Queue is used for removing the items as you process them. If you just need to loop over a collection (possibly multiple times), a List&lt;T&gt; would be a better choice. This would also avoid the call to ToList() each time through your secondWord loop.  ToList() will iterate through the entire collection every time you call it (granted it's only 5 element, but still...). This may also apply to result as well, depending on where else it might be used.
You call ElementAt() every time through your foreach loop in AddIDF, even though i isn't changing.  If you must use a ConcurrentQueue for categoryClasses, then ElementAt() is \$O(i)\$.  If you can use a List, then it will be \$O(1)\$.  You could save the current ConcurrentDictionary before the loop to avoid the repetitive indexing.
String comparisons are slow compared to integers and enums (your Where() calls in AddIDF). If you changed Category to an enum or integer (or possibly add a second property for comparison purposes), that would improve the count performance.
You pass an int into your AddIDF method, not an int?, so you can just do a direct cast to an int.  This avoids the .Value property everywhere you access the index in AddIDF.
sum is already a double, so there's no need to call Convert.ToDouble. Because sum is a double, temp will be a double, even if the result of Count is an int.
What is this 5 I keep seeing?  Typically it's good to assign this to a const value for clarity.