JavaScript中的Tokenize

3
如果我有一个字符串,如何将其拆分为单词数组并过滤掉一些停用词?我只想要长度大于2的单词。
如果我的字符串是:
var text = "This is a short text about StackOverflow.";

我可以用以下方法拆分它:

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

但是使用 split(/\W+/),我可以得到所有单词。我可以通过以下方式检查这些单词的长度至少为 2:

function validate(token) {
  return /\w{2,}/.test(token);
}

但是我想我可以使用正则表达式更加智能/快速地完成这项任务。

我还有一个数组var stopwords = ['has', 'have', ...],这些词不应该出现在数组中。

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


这可以很容易地使用数组和筛选方法完成,您是否想要使用正则表达式来完成所有这些操作? - juvian
2
我认为 text.split(/\W+/).filter(validate) 没有任何问题。不需要编写过于复杂的正则表达式。 - Bergi
可以用 text.split(/\W+|\b\w\b/) 去除非单词符号和长度小于1的所有单词。 - Wiktor Stribiżew
5个回答

3

我会按照你开始的方式进行操作:通过/W+/分割,然后使用.filter()函数验证数组中的每个标记(长度和停用词)。

var text = "This is a short text about StackOverflow.";
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", "StackOverflow"]

你可以轻松调整正则表达式以查找长度大于等于2的单词,但如果你已经需要进行后处理来去除停用词(token.length比你编写的任何复杂正则表达式都要快),那就没有必要了。

2

Ramda 让事情变得简单:

var text       = "This is a short text about how StackOverflow 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", "StackOverflow", "gas."]

http://bit.ly/1V5bVrP


1
如果你想使用纯正则表达式方法,可以考虑像这样拆分内容:

如果您要使用纯正则表达式方法,可以考虑按照类似以下方式进行拆分:

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

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


0

像这样的东西?

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);

0

这应该有所帮助

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

输出:

这是一个关于StackOverflow的短文本。A..Zabc..xyz。

其中是匹配的字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接