Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String URL分类的模式匹配_String_Algorithm_Pattern Matching - Fatal编程技术网

String URL分类的模式匹配

String URL分类的模式匹配,string,algorithm,pattern-matching,String,Algorithm,Pattern Matching,作为项目的一部分,我和其他一些人目前正在开发URL分类器。我们试图实现的实际上非常简单:我们只需查看URL,找到其中出现的相关关键字,并相应地对页面进行分类 如果url是:,我们会将其归类为“运动”类 为了实现这一点,我们有一个具有以下格式映射的数据库:关键字->类别 现在我们正在做的是,对于每个URL,我们不断读取数据库中的所有数据项,并使用String.find()方法查看关键字是否出现在URL中。一旦找到,我们就停止 但这种方法存在一些问题,主要是: (i) 我们的数据库非常大,重复查询的

作为项目的一部分,我和其他一些人目前正在开发URL分类器。我们试图实现的实际上非常简单:我们只需查看URL,找到其中出现的相关关键字,并相应地对页面进行分类

如果url是:,我们会将其归类为“运动”类

为了实现这一点,我们有一个具有以下格式映射的数据库:关键字->类别

现在我们正在做的是,对于每个URL,我们不断读取数据库中的所有数据项,并使用String.find()方法查看关键字是否出现在URL中。一旦找到,我们就停止

但这种方法存在一些问题,主要是:

(i) 我们的数据库非常大,重复查询的速度非常慢

(ii)一个页面可能属于多个类别,我们的方法不处理此类情况。当然,确保这一点的一个简单方法是,即使找到了类别匹配项,也要继续查询数据库,但这只会让事情变得更慢

我在考虑其他选择,想知道是否可以做相反的事情——解析url,找到其中出现的单词,然后只查询数据库中的单词

一个简单的算法将在O(n^2)中运行——查询数据库中出现在url中的所有子字符串


我想知道是否有更好的方法来实现这一点。有什么想法吗??提前感谢:)

如果你的类别比关键字少(很多),你可以为每个类别创建一个正则表达式,它将匹配该类别的任何关键字。然后针对每个类别的正则表达式运行URL。这还可以解决匹配多个类别的问题。

我认为你的建议是将URL分解以找到有用的部分,然后只查询这些项目,这听起来是一个不错的方法

我抛出了一些Java,这些Java可能有助于从代码角度说明我认为这需要什么。最有价值的部分可能是正则表达式,但我希望它的通用算法也能帮助一些人:

import java.io.UnsupportedEncodingException;
导入java.net.url解码器;
导入java.util.List;
公共类CategoryParser
{
/**应检查关键字的db字段*/
私有静态最终字符串DB_KEYWORD_FIELD_NAME=“KEYWORD”;
/**应从中提取类别的db字段*/
私有静态最终字符串DB\u CATEGORY\u FIELD\u NAME=“CATEGORY”;
/**要查询的表的名称*/
私有静态最终字符串DB_TABLE_NAME=“KeywordCategoryMap”;
/**
*此方法获取一个URL,并仅从该文本确定该URL所属的类别。
*@param url-要分类的字符串url
*@return categories-URL似乎所属类别的列表字符串&rt
*/
公共静态列表getCategoriesFromUrl(字符串url){
//清除URL以删除无用的位和编码工件
字符串normalizedUrl=normalizeURL(url);
//把url拆开,得到好东西
字符串[]关键字=tokenizeURL(normalizedUrl);
//构造我们可以用来查询数据库的查询
字符串查询=ConstructionKeywordCategoryQuery(关键字);
System.out.println(“生成的查询:+Query”);
//此时,您需要将此查询发送到数据库,
//你得到的结果应该是一个有效的类别
//对于您的URL。未提供此代码,因为它非常特定于实现,
//您已经知道如何处理数据库。
//返回null以进行编译,即使您显然希望返回
//实际字符串列表
返回null;
}
/**
*从前端和后端删除协议(如果存在)
*删除任何随机编码字符
*扩展此功能以执行其他url清理/预处理
*@param url-要规范化的字符串url
*@return normalizedUrl-没有垃圾或惊喜的字符串URL
*/
私有静态字符串url(字符串url)
{
//解码URL以删除任何%20类型的内容
字符串normalizedUrl=url;
试一试{
//我使用了一个URL解码器,它是Java的一部分,
//但这种功能存在于大多数现代语言中
//通常被称为url解码
normalizedUrl=urldecker.decode(url,“UTF-8”);
}
捕获(不支持的编码异常uee)
{
System.err.println(“无法解码URL。已跳过解码”);
uee.printStackTrace();
}
//从前面删除协议http://ftp://或类似协议
if(normalizedUrl.contains(“:/”)
{
normalizedUrl=normalizedUrl.split(“:\ \/\ \/”)[1];
}
//这里有空间做更多的预处理
返回标准化数据;
}
/**
*将url拆分为至少有一定意义的部分
*然而,这并不保证每个令牌都是一个潜在的有效关键字
*因为这实际上需要再次对它们进行迭代,这可能是
*被视为浪费。
*@param url-要标记化的url
*@return tokens-所有令牌的字符串数组
*/
私有静态字符串[]标记EURL(字符串url)
{
//我假设我们将使用整个URL在中查找令牌
//如果只想查看GET参数,或者想忽略域
//或者您想将域本身用作令牌,这必须是
//在下一行上方进行处理,并且仅分割剩余部分
String[]tokens=url.split(\\b |));
//也可以使用更复杂的正则表达式删除更多无效匹配
//但这取决于你的决定