regex 如何在JavaScript中计算中文/日文内容中的“单词”数量

xnifntxz  于 2023-06-25  发布在  Java
关注(0)|答案(2)|浏览(109)

我正在尝试写一个方法,当内容是中文和日文时,可以计算单词的数量。这应该排除特殊字符/标点符号/空格。
我试着为每个地区创建一个正则表达式,并根据它找到单词。试图在互联网上寻找现有的正则表达式,但似乎没有一个是工作。我的方法-

function countWords(text, locale) {
  let wordCount = 0;
  
  // Set the word boundary based on the locale
  let wordBoundary = '\\b';
  
  if (locale === 'ja') {
    // Japanese word boundary
    wordBoundary = '[\\p{Script=Hiragana}\\p{Script=Katakana}\\p{Script=Han}ー]+';
  } else if (locale === 'zh') {
    // Chinese word boundary
    wordBoundary = '[\\p{Script=Han}]+';
  }
  
  const regex = new RegExp(wordBoundary, 'gu');
  const matches = text.matchAll(regex);
  
  for (const match of matches) {
    wordCount++;
  }
  
  return wordCount;
}

我认为这应该工作,但我比较的字数在微软的字和使用这种逻辑,他们来不同

voase2hg

voase2hg1#

我用Python做了类似的事情。
您可以使用现有的语言处理库,而不是完全依赖于正则表达式,这些库提供了专为中文和日语设计的更好的分词算法。这里有几个你可以考虑的流行库:

  1. For Chinese: Jieba (结巴分词) is a widely used Chinese text segmentation library for Python. It provides efficient word segmentation for Chinese text. You can integrate Jieba into your JavaScript code using tools like Emscripten or WebAssembly to leverage its word segmentation capabilities.
    1.日本人:MeCab()是一个流行的日语词法分析器和词性标注器。它可以有效地将日语文本分割成单词。与Jieba类似,您可以尝试使用Emscripten或WebAssembly等工具在JavaScript代码中使用MeCab。
    下面是一个示例,说明如何修改代码以使用Jieba库进行中文分词:
// Import Jieba library (assuming it's integrated using Emscripten or WebAssembly)
const Jieba = require('jieba');

function countWords(text, locale) {
  let wordCount = 0;
  
  if (locale === 'zh') {
    // Use Jieba for Chinese word segmentation
    const words = Jieba.cut(text);
    wordCount = words.length;
  } else {
    // For other languages, use a simplified word count method
    const words = text.split(/\s+/).filter(word => word.trim() !== '');
    wordCount = words.length;
  }
  
  return wordCount;
}

请注意,将Jieba或MeCab集成到JavaScript中可能需要额外的设置步骤,例如编译Web库或使用专门为JavaScript环境构建的预编译版本。

c8ib6hqw

c8ib6hqw2#

一种可能的单词计数方法可以基于文本分割数组,该数组是调用Intl.Segmenter示例的segment方法的结果。
每个分段的项目具有诸如以下的属性:...

{ segment: 'words', index: 9, input: 'How many words ...', isWordLike: true }

...因此,为了获得总字数,可以通过验证项目的isWordLike值来reduce文本段项目数组...

function countWords(text, locale) {
  return [
    ...new Intl.Segmenter(locale, { granularity: 'word' })
      .segment(text)
  ]
  .reduce((wordCount, { isWordLike }) =>
    wordCount + Number(isWordLike), 0
  );
}

console.log(
  "countWords('How many words does the text contain?', 'en') ?..",
  countWords('How many words does the text contain?', 'en'),
);
console.log(
  "countWords('Combien de mots contient ce texte ?', 'fr') ?..",
  countWords('Combien de mots contient ce texte ?', 'fr'),
);

console.log(
  "countWords('そのテキストには何語含まれていますか?', 'ja') ?..",
  countWords('そのテキストには何語含まれていますか?', 'ja'),
);
console.log(
  "countWords('该文本包含多少个单词?', 'zh') ?..",
  countWords('该文本包含多少个单词?', 'zh'),
);
.as-console-wrapper { min-height: 100%!important; top: 0; }

备注…到目前为止,Firefox仍然不支持/实现Intl.Segmenter

相关问题