1

我正在阅读此处详细介绍的训练数据 RASA 格式

{
  "text": "show me chinese restaurants",
  "intent": "restaurant_search",
  "entities": [
    {
      "start": 8,
      "end": 15,
      "value": "chinese",
      "entity": "cuisine"
    }
  ]
}

子字符串Chinese被标记为话语的第 8 到第 15 个索引的实体。

我编写了一个小 C# 程序来验证话语中字符索引的正确性。

public class Program
    {
        public static void Main(string[] args)
        {
            string s = "show me chinese restaurants";
            int i = 0;

            foreach(var item in s.ToCharArray())
                Console.WriteLine("{0} - {1}", item, i++);
        }
    }

但是当我运行程序时,我得到以下输出:

s - 0
h - 1
o - 2
w - 3
  - 4
m - 5
e - 6
  - 7
c - 8
h - 9
i - 10
n - 11
e - 12
s - 13
e - 14
  - 15
r - 16
e - 17
s - 18
t - 19
a - 20
u - 21
r - 22
a - 23
n - 24
t - 25
s - 26

注意文本注释的奇怪行为,子字符串Chinese从索引 8 开始,到 15 结束,并带有一个空格。

但是子字符串Chinese应该从索引 8 开始,到位置 14 结束。

Chinese当我使用从位置 8 开始到 14 结束的索引来训练相同的文本时。我收到Misaligned Entity AnnotationRASA 的警告,详见此处

有人可以解释这种奇怪的行为。

谢谢

4

1 回答 1

4

阅读提供的链接,我可能想出了一个可能的解释:

它们共同构成了一个适用于字符串的 python 样式范围,例如在下面的示例中,使用 text="show me chinese Restaurants",然后 text[8:15] == 'chinese'

这使我走上了一条我正在思考的道路

嗯,这很奇怪,我想知道 python 是否会奇怪地索引

我启动了一个快速应用程序来证明这一点:

text = "show me chinese restaurants"
print(text[8:15])

现在这可能没有意义,因为这里数组的空格 15 中的字符实际上是一个空格。这导致我进入这篇文章:

https://www.pythoncentral.io/how-to-slice-listsarrays-and-tuples-in-python/

似乎他们在此处的示例中使用的运算符text[8:15]对数组进行了切片,他们使用了示例:

a = [1, 2, 3, 4, 5, 6, 7, 8]

a[1:4]输出:[2, 3, 4]

并这样解释

让我解释一下。1 表示从列表中的第二个元素开始(注意切片索引从 0 开始)。4 表示在列表中的第五个元素处结束,但不包括它。中间的冒号是 Python 的列表如何识别我们想要使用切片来获取列表中的对象。

所以看起来切片的第二个参数是排他的。

希望这可以帮助

ps必须学习和设置一些python的东西:D

于 2018-01-20T22:07:56.300 回答