【问题标题】:Javascript: Counting frequency of emojis in textJavascript:计算文本中表情符号的频率
【发布时间】:2017-12-03 14:52:29
【问题描述】:

我正在尝试计算表情符号在一段文本中出现的频率。例如:

"I love ???????????? so much ???? " -> [{????:3}, {????:1}]

为了统计一个文本块中字符的出现频率,我使用了

function getFrequency(string) {
    var freq = {};
    for (var i=0; i<string.length;i++) {
        var character = string.charAt(i);
        if (freq[character]) {
           freq[character]++;
        } else {
           freq[character] = 1;
        }
    }

    return freq;
};

来源:https://stackoverflow.com/a/18619975/4975358

^上面的代码效果很好,但是它不能识别表情符号:

{�: 1,  �: 3,  �: 2}

另外,我希望输出是长度为 1 的 json 对象列表,而不是一个长 json 对象。

【问题讨论】:

  • “长度为 1 的 json 对象列表” 你的意思是具有单个键值的对象吗?例如[{�: 1},{�: 3},{�: 2}] 为什么?这将需要不必要的循环来查找任何特定表情符号的计数。
  • 是的,我就是这个意思。这只是另一个函数需要的输入格式

标签: javascript json unicode emoji


【解决方案1】:

您可以使用 String.replace 函数的回调和 unicode 感知 RegExp 检测从 unicode 块 "Miscellaneous Symbols""Pictographs Transport and Map Symbols"(0x1F300 到 0x1F6FF):

let str = "I love ??? so much ? ";

let freq = {};
str.replace(/[\u{1F300}-\u{1F6FF}]/gu, char => freq[char] = (freq[char] || 0) + 1);

console.log(freq);

如果您希望避免使用RegExpString.replace,您可以将字符串解构为一个数组并将其减少到如下频率:

let str = "I love ??? so much ? ";

let freq = [...str].reduce((freq, char) => {
  if (char >= '\u{1F300}' && char < '\u{1F700}') freq[char] = (freq[char] || 0) + 1;
  return freq;
}, {});

console.log(freq);

【讨论】:

    【解决方案2】:

    charAt 在这里帮不了你。 for...of 会将字符串正确解析为 Unicode 代码点,包括星光层中的代码点。我们使用character.length 来确定这是否是补充平面字符。如果你真的想知道它是否是一个表情符号,你需要把它收紧。

    const input = "I love ??? so much ? ";
        
    function getFrequency(string) {
      var freq = {};
      for (character of string) {
        if (character.length === 1) continue;
        if (freq[character]) {
          freq[character]++;
        } else {
          freq[character] = 1;
        }
      }
      return freq;
     };
     
     console.log(getFrequency(input));

    要创建单值对象数组,请通过以下方式运行输出:

    function breakProperties(obj) {
      return Object.keys(obj).map(function(key) {
        var result = {};
        result[key] = obj[key];
        return result;
      });
    }
    

    【讨论】:

    • 非常感谢,这是完美的表情符号!如何修改输出以便只计算表情符号?
    • 它不会计算心脏表情符号。其中字符长度 = 1
    猜你喜欢
    • 2022-01-16
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多