Php 从域中提取单词
我有一大堆领域,我想爆炸成文字。我从wordlist.sourceforge.net下载了wordlist,并开始编写蛮力类型的脚本,通过字典列表运行每个域 问题是我不能让它产生足够好的结果。我编写的简单脚本如下所示:Php 从域中提取单词,php,tagging,linguistics,Php,Tagging,Linguistics,我有一大堆领域,我想爆炸成文字。我从wordlist.sourceforge.net下载了wordlist,并开始编写蛮力类型的脚本,通过字典列表运行每个域 问题是我不能让它产生足够好的结果。我编写的简单脚本如下所示: foreach($domains as $dom) { $orig_dom = $dom; foreach($words as $w) { $pos = stristr($dom,$w); if($pos) {
foreach($domains as $dom) {
$orig_dom = $dom;
foreach($words as $w) {
$pos = stristr($dom,$w);
if($pos) {
$wd[$orig_dom][] = $w;
}
}
}
$words是字典数组,domains只是一个域名数组
结果如下所示:
[aheadsoftware] => Array
(
[0] => ahead
[1] => head
[2] => heads
[3] => soft
[4] => software
[5] => ware
从技术上讲,它是可行的,但我不知道如何编写代码,这是一个技巧,让脚本明白如果你匹配“ahead”,你就不再有“head”或“heads”。它还应该理解选择“软件”而不是“软件”和“软件”。是的,我知道,语言计算的世界纯粹是痛苦;) 一个简单的解决方案可能是,每次你有一个匹配项,在你将单词添加到结果中之前,进行另一次
stristr
查找,看看你试图添加到结果中的单词是否包含在已经存在的任何单词中。如果是,不要加进去
例如,如果域包含“heads”,而您的词典首先列出“head”,则这将不起作用。您可能更愿意在结果中添加“heads”,而不是“head”
你可以通过检查哪一个更长来绕过这个限制。如果结果中包含的单词较长,请不要在中添加新词。如果新单词较长,请删除结果中已有的单词,然后添加新单词。一个简单的解决方案可能是每次有匹配项时,在将单词添加到结果中之前,进行另一次
stristr
查找,查看您试图添加到结果中的单词是否包含在已存在的任何单词中。如果是,不要加进去
例如,如果域包含“heads”,而您的词典首先列出“head”,则这将不起作用。您可能更愿意在结果中添加“heads”,而不是“head”
你可以通过检查哪一个更长来绕过这个限制。如果结果中包含的单词较长,请不要在中添加新词。如果新单词较长,请删除结果中已有的单词,然后添加新单词。为了证明这种方法的固有缺陷,请查看它为“Theenismighter than thesword.com”提供了什么(我已将其大写,以显示其意图;这不一定是您的算法产生的结果),这正是我要说的。你能建议更好的方法吗?不,英语是这类事情的噩梦。当我们不得不做类似的事情时,我们找了第三方()来做,但即使他们也不能产生很好的结果。在某些时候,你必须选择是采用贪婪(即最长单词)还是非贪婪(最短单词)的方法。这是不可能绕过这个决定的,因为像您提供的例子这样的模棱两可之处是存在的。除非你指定了某种上下文无关的语法来配合它,但是祝你好运尝试使英语上下文无关。要证明这种方法的固有缺陷,请参阅它为“ThepenismitterThantheWord.com”提供的内容(我把它大写是为了表明目的;这不一定是你的算法会产生的结果)这正是我要说的。你能建议更好的方法吗?不,英语对这类事情来说是一场噩梦。当我们不得不做类似的事情时,我们与第三方合作()但即使它们也不能产生很好的结果。在某个时候,你必须选择是贪婪(最长单词)还是非贪婪(最短单词)方法。这是不可能绕过这个决定的,因为像你提供的例子这样的歧义是存在的。这是除非你指定某种上下文无关的语法来配合它,但是祝你好运,尝试使英语上下文无关。