Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的标记化_Javascript_Arrays_Regex_Split_Tokenize - Fatal编程技术网

JavaScript中的标记化

JavaScript中的标记化,javascript,arrays,regex,split,tokenize,Javascript,Arrays,Regex,Split,Tokenize,如果我有一个字符串,如何将其拆分为一个单词数组并过滤掉一些停止词?我只想要长度为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(to

如果我有一个字符串,如何将其拆分为一个单词数组并过滤掉一些停止词?我只想要长度为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);
}
但是我想我可以用regexp做得更聪明/更快

我还有一个数组
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);
函数过滤器阵列(a、num\u字、stop\u字){
b=[];
对于(var-ct=0;ct类似的东西

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);
函数过滤器阵列(a、num\u字、stop\u字){
b=[];

对于(var ct=0;ct我将执行您开始执行的操作:按
/W+/
拆分,然后使用验证数组中的每个标记(长度和停止字)


您可以轻松地调整正则表达式以查找单词
=2个
字符,但如果您已经需要进行后期处理以删除停止字(
token.length
将比您编写的任何高级正则表达式都要快)。

我会按照您开始的步骤执行:按
/W+//code>拆分,然后验证每个标记(长度和停止字)在数组中使用


您可以轻松地调整正则表达式以查找单词
=2个
字符,但如果您已经需要进行后期处理以删除停止字(
token.length
将比您编写的任何奇特正则表达式都要快)。

如果您想使用纯正则表达式方法,那么在这样的情况下拆分如何:

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

如果您想使用纯正则表达式方法,那么在类似这样的东西上拆分如何:

\W+|\b\w{1,2}\b
使用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."]
使用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."]
这应该会有帮助

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

a
文本
关于
堆栈溢出
.a..Z
abc
xyz

其中
是匹配的字符串。

这应该有帮助

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

a
文本
关于
堆栈溢出
.a..Z
abc
xyz


其中
是匹配字符串。

这可以使用数组和筛选方法轻松完成,您是否希望使用正则表达式来完成所有这一切?我认为
text.split(/\W+/).filter(validate)没有任何问题
。无需编写过于复杂的正则表达式。使用
text.split(/\W+|\b\W\b/)
。您可以摆脱非单词符号和长度小于1的所有单词。使用数组和筛选方法可以很容易地做到这一点,您是否希望用正则表达式来替代这些操作?我认为
text.split(/\W+/)没有任何问题.filter(validate)
。无需编写过于复杂的正则表达式。您可以使用
text.split(/\W+\b\W\b/)删除非单词符号和长度小于1的所有单词。