我目前正在实现一个 Javascript 函数,将给定的句子标记为更简单的标记,根据英语逐字拆分句子。
我写了一个regular expression在 Javascript 中:/\\[^]|\.+|\w+|[^\w\s]/g
在此基础上,我尝试编写一个函数,该函数将一个句子作为输入并通过单词对其进行标记化并返回一个 Javascript 数组。
function TokenizeSentence(Sentence)
{
let tokenizedSentence = new Array();
let tokenizingRegex = /\\[^]|\.+|\w+|[^\w\s]/g;
Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
word: word,
start: offset,
end: offset + word.length
}));
return tokenizedSentence;
}
let string = `Apply 1/2 day U.S.A leave as I'm away`;
console.log(TokenizeSentence(string));
我有一个例句:Apply 1/2 day leave as I'm away
,我无法弄清楚如何休1/2
和我是
作为单个 token 而不是多个 token 。
我的问题是如何处理1/2
(小数)和I'm
(单词的缩写形式),U.S.A
(缩写)作为单个标记?
最佳答案
您可以添加更具体的模式(如 \d+(?:\/\d+)+
以匹配 1+ 个数字,后跟 1+ 个 /
序列和 1 + 数字和 \b\w(?:\.\w)+\b
匹配单个单词 char 后跟 1+ 个 .
序列和单个单词 char作为一个完整的词)在更通用的之前,并通过在其后添加可选的 (?:'\w+)?
组来“扩展”\w+
:
function TokenizeSentence(Sentence)
{
let tokenizedSentence = new Array();
let tokenizingRegex = /\\[^]|\.+|\d+(?:\/\d+)+|\b\w(?:\.\w)+\b|\w+(?:'\w+)?|[^\w\s]/g;
Sentence.replace(tokenizingRegex, (word, offset) => tokenizedSentence.push({
word: word,
start: offset,
end: offset + word.length
}));
return tokenizedSentence;
}
let string = `Apply 1/2 day U.S.A leave as I'm away`;
console.log(TokenizeSentence(string));
详情
\\[^]
- 任何转义序列(\
和任何字符)|
- 或\.+
- 1 个或多个点|
- 或者\d+(?:\/\d+)+
- 1+ 个数字,然后是 1+ 个/
序列和 1+ 个数字|
- 或者\b\w(?:\.\w)+\b
- 一个单词边界,一个单词 char,然后是 1+ 个点序列,后跟 1 个单词 char,然后是单词边界(如果您打算只匹配 ASCII 大写字母,请将\w
替换为[A-Z]
)|
- 或者\w+(?:'\w+)?
- 1+ 个单词字符后跟可选的'
序列和 1+ 个单词字符|
- 或者[^\w\s]
- 除了单词和空白字符之外的任何字符。
关于javascript - 正则表达式:对句子中的小数、缩写和缩写词进行分词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51634329/