Php 从域中提取单词

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) {

我有一大堆领域,我想爆炸成文字。我从wordlist.sourceforge.net下载了wordlist,并开始编写蛮力类型的脚本,通过字典列表运行每个域

问题是我不能让它产生足够好的结果。我编写的简单脚本如下所示:

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”提供的内容(我把它大写是为了表明目的;这不一定是你的算法会产生的结果)这正是我要说的。你能建议更好的方法吗?不,英语对这类事情来说是一场噩梦。当我们不得不做类似的事情时,我们与第三方合作()但即使它们也不能产生很好的结果。在某个时候,你必须选择是贪婪(最长单词)还是非贪婪(最短单词)方法。这是不可能绕过这个决定的,因为像你提供的例子这样的歧义是存在的。这是除非你指定某种上下文无关的语法来配合它,但是祝你好运,尝试使英语上下文无关。