假设我有一个要分析的域名列表。除非域名是连字符的,否则我看不到一种特别简单的方法来“提取”域中使用的关键字。然而,我看到它在 DomainTools.com、Estibot.com 等网站上完成。例如:
ilikecheese.com becomes "i like cheese"
sanfranciscohotels.com becomes "san francisco hotels"
...
有什么建议可以有效地完成这项工作吗?
编辑:我想用 PHP 写这个。
假设我有一个要分析的域名列表。除非域名是连字符的,否则我看不到一种特别简单的方法来“提取”域中使用的关键字。然而,我看到它在 DomainTools.com、Estibot.com 等网站上完成。例如:
ilikecheese.com becomes "i like cheese"
sanfranciscohotels.com becomes "san francisco hotels"
...
有什么建议可以有效地完成这项工作吗?
编辑:我想用 PHP 写这个。
好的,我运行了我为这个 SO question编写的脚本,并进行了一些小的更改——使用日志概率来避免下溢,并将其修改为读取多个文件作为语料库。
对于我的语料库,我从 Gutenberg 项目下载了一堆文件——没有真正的方法,只是从 etext00、etext01 和 etext02 中获取所有英语文件。
下面是结果,我保存了每个组合的前三个。
专家交流:97 种可能性 - 专家交流 -23.71 - 专家性别变化 -31.46 - 专家交流 -33.86 半岛:11 种可能性 - 笔岛 -20.54 - 阴茎土地 -22.64 - 笔是土地 -25.06 选择西班牙:28 种可能性 - 选择西班牙-21.17 - 选择痛苦-23.06 - 在 -29.41 选择水疗中心 kidsexpress:15种可能性 - 儿童快递 -23.56 - 孩子性新闻 -32.65 - 儿童快递 -34.98 童装:34种可能性 - 孩子们发誓-19.85 - 童装 -25.26 - 孩子们发誓 -32.70 dicksonweb:8 种可能性 - 迪克森网 -27.09 - 迪克儿子网 -30.51 - 网络上的迪克斯 -33.63
可能想看看这个 SO question。
您需要开发一种启发式方法,将可能的匹配项排除在域外。我会这样做的方法是首先找到一个大的文本语料库。例如,您可以下载 Wikipedia。
接下来获取您的语料库,并组合每两个相邻的单词。例如,如果您的句子是:
quick brown fox jumps over the lazy dog
您将创建一个列表:
quickbrown
brownfox
foxjumps
jumpsover
overthe
thelazy
lazydog
这些中的每一个都有一个计数。在解析语料库时,您将跟踪每两个单词的频率对。此外,对于每一对,您需要对原来的两个单词进行排序。
按频率对该列表进行排序,然后尝试根据这些词在您的域中查找匹配项。
最后,对未注册的前两个词组进行域检查!
我认为像 DomainTool 这样的网站会列出排名最高的单词。然后他们首先尝试解析这些单词。根据目的,您可能需要考虑使用 MTurk 来完成这项工作。不同的人会以不同的方式解析相同的单词,并且可能与单词的常见程度不成比例。
choosespain.com kidsexpress.com childrenswear.com dicksonweb.com
如果您要尝试使用字典解析 url,请玩得开心(和一位好律师)。
如果您可以在他们的网站上找到相同的字符但用空格分隔,您可能会做得更好。
其他可能性:从 ssl 证书中提取数据;查询顶级域名服务器;访问域名服务器(TLD);或使用“whois”工具或服务之一(只需谷歌“whois”)。
如果您有一个有效单词列表,您可以遍历您的域字符串,并尝试使用回溯算法每次截断一个有效单词。如果你设法用完所有单词,你就完了。请注意,这不是最佳的时间复杂度:)
function getwords( $string ) {
if( strpos($string,"xn--") !== false ) {
return false;
}
$string = trim( str_replace( '-', '', $string ) );
$pspell = pspell_new( 'en' );
$check = array();
$words = array();
for( $j = 0; $j < ( strlen( $string ) - 5 ); $j++ ) {
for( $i = 4; $i < strlen( $string ); $i++ ) {
if( pspell_check( $pspell, substr( $string, $j, $i ) ) ) {
$check[$j]++;
$words[] = substr( $string, $j, $i );
}
}
}
$words = array_unique( $words );
if( count( $check ) > 0 ) {
return $words;
}
return false;
}
print_r( getwords( 'ilikecheesehotels' ) );
Array
(
[0] => like
[1] => cheese
[2] => hotel
[3] => hotels
)
作为 pspell 的简单开始。你可能想比较结果,看看你是否得到了结尾没有“s”的词干并将它们合并。
您必须针对域条目使用字典引擎来查找有效单词,并针对结果运行该字典引擎以确保结果是有效单词。