在 JavaScript 中标记

Tokenize in JavaScript

如果我有一个字符串,我如何将它拆分成一个单词数组并过滤掉一些停用词?我只想要长度为 2 或更大的单词。

如果我的字符串是

var text = "This is a short text about Whosebug.";

我可以把它拆分成

var words = text.split(/\W+/);

但使用 split(/\W+/),我得到了所有单词。我可以用

检查单词的长度是否至少为 2
function validate(token) {
  return /\w{2,}/.test(token);
}

但我想我可以 smarter/faster 使用正则表达式。

我还有一个数组 var stopwords = ['has', 'have', ...],数组中不应包含该数组。

实际上,如果我能找到一种方法来过滤停用词,我可以将所有字母 a、b、c、...、z 添加到停用词数组中,以仅接受至少包含 2 个字符的词。

是这样的吗?

function filterArray(a, num_words, stop_words) {
    b = [];
    for (var ct = 0; ct <= a.length - 1; ct++) {
        if (!(a[ct] <= num_words) && !ArrayContains[a[ct], stop_words) {
            b.push(a[ct]);
        }
    }
    return b
}
function ArrayContains(word, a) {
    for (var ct = 0; ct <= a.length - 1; ct++) {
        if (word == a[ct]) {
            return true
        }
        return false
    }
}

var words = "He walks the dog";
var stops = ["dog"]
var a = words.split(" ");
var f = filterArray(a, 2, stops);

我会做你开始的事情:按 /W+/ 拆分,然后使用 .filter().

验证数组中的每个标记(长度和停用词)
var text = "This is a short text about Whosebug.";
var stopwords = ['this'];

var words = text.split(/\W+/).filter(function(token) {
    token = token.toLowerCase();
    return token.length >= 2 && stopwords.indexOf(token) == -1;
});

console.log(words); // ["is", "short", "text", "about", "Whosebug"]

您可以轻松调整正则表达式来查找单词 >= 2 个字符,但如果您已经需要 post-process 来删除停用词(token.length 会比你写的任何花哨的正则表达式都快。

如果您想使用纯正则表达式方法,拆分这样的东西怎么样:

\W+|\b\w{1,2}\b

https://regex101.com/r/rB4cJ4/1

使用 Ramda 很容易:

var text       = "This is a short text about how Whosebug has gas.";
var stopWords  = ['have', 'has'];
var isLongWord = R.compose(R.gt(R.__, 2), R.length);
var isGoWord   = R.compose(R.not, R.contains(R.__, stopWords));
var tokenize   = R.compose(R.filter(isGoWord), R.filter(isLongWord), R.split(' '));

tokenize(text); // ["This", "short", "text", "about", "how", "Whosebug", "gas."]

http://bit.ly/1V5bVrP

这应该是帮助

(?:\b\W*\w\W*\b)+|\W+

输出:

这个</code>是<code>a</code>文本<code>关于 Whosebug. A..Zabc..xyz.

其中 是匹配的字符串。