JavaScript中的标记化
如果我有一个字符串,如何将其拆分为一个单词数组并过滤掉一些停止词?我只想要长度为2或更大的单词 如果我的字符串是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
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的所有单词。
。