This site is no longer updated.Go to new Conversational Cloud docs

Pattern weight modification


If you use patterns to implement NLU in your script, it is possible to forcibly change the weight of matches by patterns or their individual elements.

This can be a useful feature in a number of cases:

  • The request is matched by several different patterns. You need to specify explicitly which of these patterns should have priority and be assigned a higher confidence value.
  • Conversely, you may need to assign a negative priority to one of the pattern elements, so that matches against it lower the confidence score below the classifier threshold and don’t trigger any states.

We advise using this feature sparingly. If you modify the pattern weight too often, the behavior of the classifier will become less manageable and predictable.

$weight

Use the $weight element to modify pattern weight. This element can be used either after the q and q! tags or when declaring named patterns using the patterns tag.

$weight can take one of the following shapes:

  • $weight<a>
  • $weight<a+b>
  • $weight<a-b>
  • $weight<+b>
  • $weight<-b>

The pattern weight changes according to the equation:

S=Sa+bS = S \cdot a + b,

where S\small{S} is the final pattern weight, and a\small{a} and b\small{b} are the number values set in $weight.

a\small{a} and b\small{b} are arbitrary real numbers. The difference between a\small{a} and b\small{b} is that:

  • a\small{a} changes the weight linearly, multiplying it by a\small{a}.
  • b\small{b} changes the weight by a constant value, adding b\small{b} to it.

How to use

In the script below, there are similar-looking states differing only in $weight presence and values. A postProcess handler is configured so that the bot response contains the confidence score of pattern matches. This score will be different for each test [1..5] request.

theme: /

    init:
        bind("postProcess", function(ctx) {
            $reactions.answer("Weight: " + ctx.nBest[0].score);
        });

    state: Start
        q!: $regex</start>
        a: Let’s begin.

    state: Test1
        q!: test 1
        # Weight: 0.79

    state: Test2
        q!: test 2 $weight<1.001>
        # Weight: 0.7908

    state: Test3
        q!: test 3 $weight<0.9+0.05>
        # Weight: 0.75

    state: Test4
        q!: test 4 $weight<+0.3>
        # Weight: 1.03

    state: Test5
        q!: test 5 $weight<-0.2>
        # Weight: 0.63

$localWeight

If you use the $weight element in a pattern, it modifies the confidence of matching requests against this pattern as a whole. However, in some cases you may need a more flexible behavior to change the weight only for specific pattern components matched by named patterns. Use the $localWeight element to do so.

The $localWeight element takes the same shapes as $weight. It has to be followed by a named pattern reference. The number specified in $localWeight is only used for calculating the weight of request substrings matched by this named pattern.

How to use

The difference between $weight and $localWeight can be observed in the following script example. If the Test1 state is triggered, the confidence score is lower than that for Test2:

  • In Test1, the request is matched against the pattern, and then the whole score is decreased by 20 %.
  • In Test2, only the score of the test substring is decreased, while the score for 2 is calculated as before.
patterns:
    $test = test

theme: /

    init:
        bind("postProcess", function(ctx) {
            $reactions.answer("Weight: " + ctx.nBest[0].score);
        });

    state: Start
        q!: $regex</start>
        a: Let’s begin.

    state: Test1
        q!: $weight<0.8> $test 1
        # Weight: 0.8

    state: Test2
       q!: $localWeight<0.8> $test 2
       # Weight: 0.84