我举一个例子来轻松描述问题。
输入文字:
Wayne Rooney 是一名英格兰足球运动员,曾效力于曼联。 鲁尼成为英格兰最年轻的球员,因为他在与澳大利亚的友谊赛中获得了第一个上限。沃尔科特于2006年5月将鲁尼的出场记录打破了36天。
输入关键字:wayne rooney
预期输出(关键字数量):3(Wayne rooney,鲁尼,鲁尼)
所以,它不仅算“韦恩鲁尼”,还包括其他类似的词。
我搜索了SO,我得到了这个正则表达式:
$keyword_count = preg_match_all("/(\w*(?:wayne|rooney)\w*)/i", $source, $res);
但它给了我4作为输出。它将“wayne rooney”视为两个不同的关键词。
有人可以帮我构建正确的公式吗? Regex真的是最有效的解决方案吗?我有大量的文字要搜索。任何其他解决方案,例如PHP的文本挖掘库?
非常感谢。
答案 0 :(得分:1)
试试这个正则表达式:
(?i)(\b(?:wayne(?:'s)?\s*)?rooney(?:'s)?\b)
如果要解析字符串的常规规则数量有限,则正则表达式适合解决您的问题。在一般情况下,您应该使用其他方法(可能是几个正则表达式)。
答案 1 :(得分:0)
也许这可能对正则表达式有所帮助或替代:
答案 2 :(得分:0)
对于这种特殊情况,你可以做这样的事情
Wayne(?:\sRooney[\w']*)?|Rooney[\w']*
它说:搜索Wayne Rooney
或Rooney
(每个都可以跟[\w']*
),但对于第一部分,(?:\sRooney[\w']*)?
是可选的。
答案 3 :(得分:0)
您是在尝试匹配一段文字中的单个已知名称,还是实际上是在尝试识别与“已知人”或“名称”相匹配的内容?
如果是后者那么你可能会使用像OpenCalais那样约束已知类型'人'的东西(谁知道,也许有'足球运动员'分类法。)
以下是analysis of similar工具。