首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文本关键词的查找

文本关键词的查找
EN

Stack Overflow用户
提问于 2013-01-09 23:35:03
回答 7查看 2.9K关注 0票数 2

我有一个已经发生的事件数组,这些事件是用自由文本编写的,因此除了一些关键字之外,没有遵循模式。“抢劫”、“杀人犯”、“破门而入”、“车祸”等。这些关键词可以出现在文本中的任何地方,我想找出这些关键词,并将它们添加到分类中,例如。“抢劫”

最后,当我检查了所有的事件时,我希望有一个分类列表,如:

代码语言:javascript
运行
复制
Robberies: 14
Murder attempts: 2
Car accidents: 5
...

数组元素可以如下所示:

代码语言:javascript
运行
复制
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方面真的很糟糕,因此这里需要一些帮助。

下面的正则表达式是不正确的,但是我想这个结构会起作用吗?有更好的方法来避免干燥吗?

代码语言:javascript
运行
复制
var trafficAccidents = 0,
    robberies = 0,
    ...

function FindIncident(incident) {
    if (incident.match(/car accident/g)) {
        trafficAccidents += 1;
    }
    else if (incident.match(/robbery/g)) {
        robberies += 1;
    }
    ...
}

提前谢谢!

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-01-09 23:56:25

下面的代码显示了您可以采取的方法。你可以测试它这里

代码语言:javascript
运行
复制
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在这里是一个全局变量,但您可以将其放在其他地方,并将其从全局范围内删除)。

票数 2
EN

Stack Overflow用户

发布于 2013-01-09 23:50:20

实际上,我有点不同意你的看法。。。我认为像indexOf这样的字符串函数将非常好地工作。

我将使用JavaScript的indexOf方法,它接受两个输入:

String.indexOf(值,startPos);

因此,您可以做的一件事是将一个简单的临时变量定义为游标本身。。。

代码语言:javascript
运行
复制
function FindIncident(phrase, word) {
    var cursor = 0;
    var wordCount = 0;
    while(phrase.indexOf(word,cursor) > -1){
        cursor = incident.indexOf(word,cursor);
        ++wordCount;        
    }
    return wordCount;
}

我还没有测试代码,但希望你能理解。。。

如果你使用它的话,要特别注意它的起始位置。

票数 2
EN

Stack Overflow用户

发布于 2013-01-09 23:49:03

使用对象来存储数据。

代码语言:javascript
运行
复制
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++;
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14248416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档