我有一个已经发生的事件数组,这些事件是用自由文本编写的,因此除了一些关键字之外,没有遵循模式。“抢劫”、“杀人犯”、“破门而入”、“车祸”等。这些关键词可以出现在文本中的任何地方,我想找出这些关键词,并将它们添加到分类中,例如。“抢劫”
最后,当我检查了所有的事件时,我希望有一个分类列表,如::
Robberies: 14
Murder attempts: 2
Car accidents: 5
...
数组元素可以如下所示:
incidents[0] = "There was a robbery on Amest Ave last night...";
incidents[1] = "There has been a report of a murder attempt...";
incidents[2] = "Last night there was a housebreaking in...";
...
我想这里最好的方法是使用正则表达式来查找文本中的关键字,但我在regexp方面真的很糟糕,因此这里需要一些帮助。
下面的正则表达式是不正确的,但是我想这个结构会起作用吗?有更好的方法来避免干燥吗?
var trafficAccidents = 0,
robberies = 0,
...
function FindIncident(incident) {
if (incident.match(/car accident/g)) {
trafficAccidents += 1;
}
else if (incident.match(/robbery/g)) {
robberies += 1;
}
...
}
提前谢谢!
发布于 2013-01-09 23:56:25
下面的代码显示了您可以采取的方法。你可以测试它这里
var INCIDENT_MATCHES = {
trafficAccidents: /(traffic|car) accident(?:s){0,1}/ig,
robberies: /robbery|robberies/ig,
murder: /murder(?:s){0,1}/ig
};
function FindIncidents(incidentReports) {
var incidentCounts = {};
var incidentTypes = Object.keys(INCIDENT_MATCHES);
incidentReports.forEach(function(incident) {
incidentTypes.forEach(function(type) {
if(typeof incidentCounts[type] === 'undefined') {
incidentCounts[type] = 0;
}
var matchFound = incident.match(INCIDENT_MATCHES[type]);
if(matchFound){
incidentCounts[type] += matchFound.length;
};
});
});
return incidentCounts;
}
正则表达式是有意义的,因为您将有许多符合您的“匹配”标准的字符串,即使您只考虑了“抢劫”的复数形式和单数形式的差异。您还希望确保匹配是不区分大小写的。
您需要在正则表达式上使用“全局”修饰符,以便匹配“谋杀、谋杀、谋杀”等字符串,并将计数增加3,而不是仅增加1。
这使您可以将匹配条件和事件计数器之间的关系保持在一起。它还避免了对全局计数器的需求(假设INCIDENT_MATCHES
在这里是一个全局变量,但您可以将其放在其他地方,并将其从全局范围内删除)。
发布于 2013-01-09 23:50:20
实际上,我有点不同意你的看法。。。我认为像indexOf
这样的字符串函数将非常好地工作。
我将使用JavaScript的indexOf方法,它接受两个输入:
String.indexOf(值,startPos);
因此,您可以做的一件事是将一个简单的临时变量定义为游标本身。。。
function FindIncident(phrase, word) {
var cursor = 0;
var wordCount = 0;
while(phrase.indexOf(word,cursor) > -1){
cursor = incident.indexOf(word,cursor);
++wordCount;
}
return wordCount;
}
我还没有测试代码,但希望你能理解。。。
如果你使用它的话,要特别注意它的起始位置。
发布于 2013-01-09 23:49:03
使用对象来存储数据。
events = [
{ exp : /\brobbery|robberies\b/i,
// \b word boundary
// robbery singular
// | or
// robberies plural
// \b word boundary
// /i case insensitive
name : "robbery",
count: 0
},
// other objects here
]
var i = events.length;
while( i-- ) {
var j = incidents.length;
while( j-- ) {
// only checks a particular event exists in incident rather than no. of occurrences
if( events[i].exp.test( incidents[j] ) {
events[i].count++;
}
}
}
https://stackoverflow.com/questions/14248416
复制相似问题