【问题标题】:Extracting words from domain从域中提取单词
【发布时间】:2011-09-26 18:34:56
【问题描述】:

我有一堆域,我想将它们分解成单词。我从 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' 了。它还应该理解选择“软件”而不是“软件”和“软件”。是的,我知道,语言计算的世界是纯粹的痛苦;)

【问题讨论】:

  • 为了展示这种方法的内在缺陷,看看它为“ThePenIsMightierThanTheSword.com”提供了什么(我已经将它大写以显示预期的内容;这不一定会出现你的算法)
  • 这正是我要说的。您能提出更好的方法吗?
  • 并非如此——英语是这类事情的噩梦。当我们不得不做类似的事情时,我们与第三方 (DomainsBot) 一起做,但即使他们也没有产生很好的结果。
  • 在某些时候,您必须选择是采用贪婪(即最长词)还是非贪婪(最短词)方法。由于存在诸如您提供的示例之类的歧义,因此无法绕过该决定。那是除非你指定某种上下文无关的语法来配合它,但祝你好运尝试使英语上下文无关。

标签: php tagging linguistics


【解决方案1】:

一个简单的解决方案可能是每次匹配时,在将单词添加到结果中之前,再进行一次stristr 查找,看看您尝试放入结果中的单词是否包含在任何话已经在里面了。如果是,请不要添加。

例如,如果域包含“heads”并且您的字典首先列出“head”,这将不起作用。您可能宁愿在结果中添加“heads”而不是“head”。

您可以通过查看哪个更长来绕过该限制。如果结果中包含的单词较长,则不要添加新单词。如果新单词较长,请删除结果中已有的单词并添加新单词。

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多