is the amount of information contained in S **that have not been covered** with T . idf(S) measures the relevance of the terms in the string S**, and** cw(S, T **) is the set of terms in common between the concept string** S
and the text T . The function idf **is defined as follows:**

$$i d f(S)=-\sum_{w\in S}l o g(P(w|U M L S))$$

The relevance of word is measured by means of its estimated probability within the whole UMLS lexicon (i.e. P(w|UMLS**)). After applying**
the semantic annotator, each task is represented with a semantic **vector**
with the tf ∗ idf **values of each concept. For example, the task "Analyze domains in protein sequences" is represented with the semantic**
vector {'C1513868':8, 'D9000419':15} **where C1513868 is retrieved by**
"domains" and D9000419 is retrieved by "protein sequences".

2.2. Application specific annotations**. The next step is to determine the**
functionality the task is describing. For that purpose, we use the taxonomy of categories defined by BioCatalogue to classify the user-defined tasks. The matching between the tasks and the categories is made by using the ISub metric [5] that performs a string matching algorithm. For example, the task "Analyze domains in protein sequences" is annotated with the category "Protein Sequence Analysis" with a score of 0.5586.

3. Web services selection**. The discovery of the suitable web services for the**
user's requirements is based on the matching between the annotations of the tasks and the metadata of the web services. However, most web service registries suffer from the lack of metadata. To address this problem, we have automatically annotated the description (or the documentation in case there is no description available), the categories and the tags of the 1729 web services registered in BioCatalogue. The annotations of each service are stored as a vector that contains the tf ∗ idf **of each concept.**
The discovery process is made by two independent searches: (i) search the web services that are annotated with the same category as the task, and (ii) search the web services that have concepts in common with the user-defined task. The results of both searches are combined and scored based on the following linear combination:
score = C-score ∗ w1 + S-**score** ∗ w2 where w1 and w2 **are weights that depend on the relevance of each search and**
fulfill the condition w1 + w2 = 1, C-score **is the score calculated by the ISub**
metric, that is, the score of the string matching between the categories of the taxonomy and the user-defined task, and S-score **is the cosine similarity**
between the vector of the task and the vector of the service. Table 1 shows the highest ranked services for the task "Analyze domains in protein sequences".

At the end, the user obtains a set of ranked lists of web services that are supposed to provide the functionality required by the tasks. In case the results are not those expected by the user, she can refine the process at the three phases of the guide.