Skipgram
========

从输入语句中生成skip-gram。skip-gram是从句子中提取的词语序列，其中相邻词语之间的距离（跳过的词语数量）不超过指定的最大值。此算子主要用于自然语言处理（NLP）任务。

输入：
    - **sentence** - `StringPack*` 类型，指向输入语句的指针。
    - **words** - `StringPack*` 类型，用于存储从语句中解析出的词语的工作空间。
    - **ngram_size** - `int` 类型，指定每个n-gram中的词语数量。
    - **max_skip_size** - `int` 类型，指定在构成n-gram时可以跳过的最大词语数量。
    - **include_all_ngrams** - `int` 类型，布尔标志。如果为非零，则生成长度从1到 `ngram_size` 的所有n-gram；否则，仅生成长度为 `ngram_size` 的n-gram。
    - **grams** - `StringPack**` 类型，用于存储生成的gram的工作空间。
    - **grams_word_count** - `int*` 类型，用于存储每个gram中词语数量的工作空间。
    - **stack** - `int*` 类型，长度为 `ngram_size` 的临时工作空间。
    - **blank** - `char*` 类型，指向空格字符的指针，用于连接gram中的词语。
    - **output_tensor** - `char*` 类型，最终输出张量的数据地址。
    - **offset** - `int*` 类型，输出参数，用于存储 `output_tensor` 中每个gram的偏移量。
    - **len** - `int*` 类型，输出参数，用于存储 `output_tensor` 中每个gram的长度。
    - **shape** - `int*` 类型，输出参数，用于存储输出张量的维度信息。
    - **core_mask** - (仅限共享版本) 核掩码。

输出：
    - **output_tensor**、**offset**、**len** 和 **shape** - 这些指针指向的内存区域将被填充，以表示包含生成结果的最终张量。

支持平台：
    ``FT78NE``
    ``MT7004``

.. note::
    - 该算子不区分数据类型，直接操作字符数据。


**共享存储版本:**

.. c:function:: int skipgram_s(StringPack *sentence, StringPack *words, int ngram_size, int max_skip_size, int include_all_ngrams, StringPack **grams, int *grams_word_count, int *stack, char *blank, char *output_tensor, int *offset, int *len, int *shape, int core_mask)


**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 31-33

    #include <stdio.h>
    #include "skipgram.h" // 假设头文件名

    typedef struct StringPack {
      long long len;
      char *data;
    } StringPack;

    int main(int argc, char* argv[]) {
        // 假设输入和工作空间已在DDR中分配
        StringPack* sentence = (StringPack*)0xA0000000;
        StringPack* words = (StringPack*)0xA0010000;
        StringPack** grams = (StringPack**)0xA0020000;
        int* grams_word_count = (int*)0xA0030000;
        int* stack = (int*)0xA0040000;
        char* output_tensor = (char*)0xB0000000;
        int* offset = (int*)0xB0010000;
        int* len = (int*)0xB0020000;
        int* shape = (int*)0xB0030000;
        char blank_char = ' ';

        // 填充sentence内容
        sentence->data = "mindspore signal processing library";
        sentence->len = 33;
        
        int ngram_size = 2;
        int max_skip_size = 1;
        int include_all_ngrams = 1;
        int core_mask = 0xff;

        skipgram_s(sentence, words, ngram_size, max_skip_size, include_all_ngrams,
                   grams, grams_word_count, stack, &blank_char,
                   output_tensor, offset, len, shape, core_mask);
        return 0;
    }


**私有存储版本:**

.. c:function:: int skipgram_p(StringPack *sentence, StringPack *words, int ngram_size, int max_skip_size, int include_all_ngrams, StringPack **grams, int *grams_word_count, int *stack, char *blank, char *output_tensor, int *offset, int *len, int *shape)


**C调用示例：**

.. code-block:: c
    :linenos:
    :emphasize-lines: 30-32

    #include <stdio.h>
    #include "skipgram.h" // 假设头文件名

    typedef struct StringPack {
      long long len;
      char *data;
    } StringPack;

    int main(int argc, char* argv[]) {
        // 假设输入和工作空间已在私有内存中分配
        StringPack* sentence = (StringPack*)0x10001000;
        StringPack* words = (StringPack*)0x10002000;
        StringPack** grams = (StringPack**)0x10003000;
        int* grams_word_count = (int*)0x10004000;
        int* stack = (int*)0x10005000;
        char* output_tensor = (char*)0x10006000;
        int* offset = (int*)0x10007000;
        int* len = (int*)0x10008000;
        int* shape = (int*)0x10009000;
        char blank_char = ' ';

        // 填充sentence内容
        sentence->data = "mindspore signal processing library";
        sentence->len = 33;
        
        int ngram_size = 2;
        int max_skip_size = 1;
        int include_all_ngrams = 1;
        
        skipgram_p(sentence, words, ngram_size, max_skip_size, include_all_ngrams,
                   grams, grams_word_count, stack, &blank_char,
                   output_tensor, offset, len, shape);
        return 0;
    }
