我目前正在实现Javascript函数,将给定的句子标记为更简单的标记,从而根据英语将句子逐字分割。
我已经用JavaScript编写了regular expression:/\\[^]|\.+|\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
和I'm
当作单个令牌而不是多个令牌。
我的问题是如何将1/2
(一个小数)和I'm
(一个简短的单词),U.S.A
(一个缩写)当作一个单独的令牌?
答案 0 :(得分:1)
您可以添加更具体的模式(例如\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大写字母,请替换{{1 }}和\w
)[A-Z]
-或|
-1个以上的字符字符,后跟\w+(?:'\w+)?
和1个以上的字符字符的可选序列'
-或|
-除单词和空格字符外的任何字符。答案 1 :(得分:1)
最适合您的示例的答案是用空格分隔结果:
(?<=^| )[^ ]*(?= |$)
这将返回“ Apply”,“ 1/2”,“ day”,“ leave”,“ as”,“ I'm”和“ away”。 但是,如果您有多个句子,这将不起作用。但是
以句子作为输入
应排除在外。
说明:
(?<=^| )
开头或空格后面的正向[^ ]*
除空格以外的任何字符,0到无限次(贪婪)(?= |$)
行尾或空格的正向超前