代码之家  ›  专栏  ›  技术社区  ›  Kunal Mukherjee

在句子中标记分数、缩写和单词的简短形式。

  •  1
  • Kunal Mukherjee  · 技术社区  · 6 年前

    我目前正在实现一个javascript函数,将一个给定的句子标记为简单的标记,它基于英语逐字分割句子。

    我写了一篇 regular expression 在JavaScript中: /\\[^]|\.+|\w+|[^\w\s]/g

    在此基础上,我尝试编写一个函数,它将一个句子作为输入,并用文字对其进行标记,然后返回一个javascript数组。

    function TokenizeSentence(Sentence)
    {
      let tokenizedSentence = new Array();
      let tokenizingRegex = /\\[^]|\.+|\w+|[^\w\s]/g;
      Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
        word: word,
        start: offset,
        end: offset + word.length
      }));
      return tokenizedSentence;
    
    }
    
    let string = `Apply 1/2 day U.S.A leave as I'm away`;
    
    console.log(TokenizeSentence(string));

    我有一个例子: Apply 1/2 day leave as I'm away ,我不知道怎么拿 1/2 I'm 作为单个令牌而不是多个令牌。

    我的问题是如何治疗 1/2 (分数)和 我是 (文字简写) U.S.A (缩写)作为一个标记?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Wiktor Stribiżew    6 年前

    \d+(?:\/\d+)+ / 和1+位数字和 \b\w(?:\.\w)+\b 它匹配一个单词char,后跟1+个 . 以及一个单词char作为一个整体单词)在更通用的单词和“expand”之前 \w+ 通过添加可选 (?:'\w+)? 小组之后:

    function TokenizeSentence(Sentence)
    {
      let tokenizedSentence = new Array();
      let tokenizingRegex = /\\[^]|\.+|\d+(?:\/\d+)+|\b\w(?:\.\w)+\b|\w+(?:'\w+)?|[^\w\s]/g;
      Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
        word: word,
        start: offset,
        end: offset + word.length
      }));
      return tokenizedSentence;
    
    }
    
    let string = `Apply 1/2 day U.S.A leave as I'm away`;
    
    console.log(TokenizeSentence(string));

    细节

    • \\[^] -任何转义序列(a \ 任何字符)
    • | -或
    • \.+ -1个或多个点
    • γ -或
    • D+(?):\/d+) -1+位,然后1+个 / 1位数字
    • γ -或
    • \\ W?\\w)+\b -一个单词边界,一个单词字符,然后是一个点的1+序列,后跟一个单词字符,然后是一个单词边界(如果您计划只匹配ASCII大写字母,请替换 \w 具有 [A-Z] )
    • γ -或
    • \w+(?:'\w+)? -1+个字字符,后跟可选的 ' 和1+字字符
    • γ -或
    • [^\w\s] -除单词和空白字符之外的任何字符。
        2
  •  1
  •   Chrᴉz remembers Monica    6 年前

    最简单的答案就是用空格分隔结果:

    (?<=^| )[^ ]*(?= |$)
    

    这将返回“Apply”、“1/2”、“Day”、“Leave”、“As”、“I'm”和“Away”。 但是,如果你有多个句子,这就行不通了。但是

    以一个句子作为输入

    应该排除这一点。

    描述:

    1. (?<=^| ) 正视开始或空格的后面
    2. [^ ]* 除空格外的任何字符,0到无限次(贪婪)
    3. (?= |$) 行尾或空格的正前方