# Skipgram — MindSpore Signal+ 使用手册 alpha 文档

# 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`

备注

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

共享存储版本:

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调用示例：

     1#include <stdio.h>
     2#include "skipgram.h" // 假设头文件名
     3
     4typedef struct StringPack {
     5  long long len;
     6  char *data;
     7} StringPack;
     8
     9int main(int argc, char* argv[]) {
    10    // 假设输入和工作空间已在DDR中分配
    11    StringPack* sentence = (StringPack*)0xA0000000;
    12    StringPack* words = (StringPack*)0xA0010000;
    13    StringPack** grams = (StringPack**)0xA0020000;
    14    int* grams_word_count = (int*)0xA0030000;
    15    int* stack = (int*)0xA0040000;
    16    char* output_tensor = (char*)0xB0000000;
    17    int* offset = (int*)0xB0010000;
    18    int* len = (int*)0xB0020000;
    19    int* shape = (int*)0xB0030000;
    20    char blank_char = ' ';
    21
    22    // 填充sentence内容
    23    sentence->data = "mindspore signal processing library";
    24    sentence->len = 33;
    25
    26    int ngram_size = 2;
    27    int max_skip_size = 1;
    28    int include_all_ngrams = 1;
    29    int core_mask = 0xff;
    30
    31    skipgram_s(sentence, words, ngram_size, max_skip_size, include_all_ngrams,
    32               grams, grams_word_count, stack, &blank_char,
    33               output_tensor, offset, len, shape, core_mask);
    34    return 0;
    35}

私有存储版本:

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调用示例：

     1#include <stdio.h>
     2#include "skipgram.h" // 假设头文件名
     3
     4typedef struct StringPack {
     5  long long len;
     6  char *data;
     7} StringPack;
     8
     9int main(int argc, char* argv[]) {
    10    // 假设输入和工作空间已在私有内存中分配
    11    StringPack* sentence = (StringPack*)0x10001000;
    12    StringPack* words = (StringPack*)0x10002000;
    13    StringPack** grams = (StringPack**)0x10003000;
    14    int* grams_word_count = (int*)0x10004000;
    15    int* stack = (int*)0x10005000;
    16    char* output_tensor = (char*)0x10006000;
    17    int* offset = (int*)0x10007000;
    18    int* len = (int*)0x10008000;
    19    int* shape = (int*)0x10009000;
    20    char blank_char = ' ';
    21
    22    // 填充sentence内容
    23    sentence->data = "mindspore signal processing library";
    24    sentence->len = 33;
    25
    26    int ngram_size = 2;
    27    int max_skip_size = 1;
    28    int include_all_ngrams = 1;
    29
    30    skipgram_p(sentence, words, ngram_size, max_skip_size, include_all_ngrams,
    31               grams, grams_word_count, stack, &blank_char,
    32               output_tensor, offset, len, shape);
    33    return 0;
    34}