在 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
使用 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."]
这应该是帮助
(?:\b\W*\w\W*\b)+|\W+
输出:
这个</code>是<code>a
短</code>文本<code>
关于
Whosebug. A..Z
abc..
xyz.
其中
是匹配的字符串。
如果我有一个字符串,我如何将它拆分成一个单词数组并过滤掉一些停用词?我只想要长度为 2 或更大的单词。
如果我的字符串是
var text = "This is a short text about Whosebug.";
我可以把它拆分成
var words = text.split(/\W+/);
但使用 split(/\W+/)
,我得到了所有单词。我可以用
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
使用 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."]
这应该是帮助
(?:\b\W*\w\W*\b)+|\W+
输出:
这个</code>是<code>a
短</code>文本<code>
关于
Whosebug. A..Z
abc..
xyz.
其中 是匹配的字符串。