Twitter趋势主题:结合不同的拼写

时间:2009-07-29 22:41:14

标签: twitter tags spelling

Twitter的热门话题通常不仅仅包含一个词。但对于组合术语,通常有不同的拼写方式,例如:

“半血王子”/“混血王子”

要查找提及趋势主题的所有更新,您需要所有拼写方式。 Twitter这样做:

Twitter's Trending Topics Admin

左侧有主题名称,右侧有不同的拼写方式。你认为这是手动还是自动完成的?是否可以自动执行此操作?如果是:如何?

我希望你能帮助我。提前谢谢!

7 个答案:

答案 0 :(得分:7)

您基本上想要的是找到similarity between two strings

我认为Soundex算法正是您所需要的。它可用于根据字符串的声音来比较字符串。或者像维基描述:

  

Soundex是一种通过声音索引名称的语音算法,如英语中所述。目标是将同音异义词编码为相同的表示形式,以便尽管拼写上存在细微差别,但它们可以匹配。

  

使用这种算法[编辑:即用字母和三位数“评级”单词],“Robert”和“Rupert”都返回相同的字符串“R163”,而“Rubin”产生“R150”。 “Ashcraft”收益率为“A261”。

还有the Levenshtein distance

祝你好运。

答案 1 :(得分:6)

我会尝试根据Broken Link的评论回答我自己的问题(谢谢你):


您从文档数据库中提取了包含1到3个单词的短语。在这些引用的短语中有以下短语:

  • 混血王子
  • 混血王子
  • Halfblood Prince

对于每个短语,您将删除所有特殊字符和空格,并将字符串设为小写:

$ phrase ='混血王子'; $ phrase = preg_replace('/ [^ a-z] / i','',$ phrase); $ phrase = strtolower($ phrase); //结果是“halfbloodprince”

当你这样做时,所有3个短语(见上文)都有一个共同的拼写:

  • 混血王子=> halfbloodprince
  • 混血王子=> halfbloodprince
  • Halfblood Prince => halfbloodprince

所以“halfbloodprince”是父母的短语。您将两者都插入数据库,普通短语和父短语。

要像Twitter一样显示“趋势主题管理员”,请执行以下操作:

// first select the top 10 parent phrases
$sql1 = "SELECT parentPhrase, COUNT(*) as cnt FROM phrases GROUP BY parentPhrase ORDER BY cnt DESC LIMIT 0, 10";
$sql2 = mysql_query($sql1);
while ($sql3 = mysql_fetch_assoc($sql2)) {
    $parentPhrase = $sql3['parentPhrase'];
    $childPhrases = array(); // set up an array for the child phrases
    $fifthPart = round($sql3['cnt']*0.2);
    // now select all child phrases which make 20% of the parent phrase or more
    $sql4 = "SELECT phrase FROM phrases WHERE parentPhrase = '".$sql3['parentPhrase']."' GROUP BY phrase HAVING COUNT(*) >= ".$fifthPart;
    $sql5 = mysql_query($sql4);
    while ($sql6 = mysql_fetch_assoc($sql5)) {
        $childPhrases[] = $sql3['phrase'];
    }
    // now you have the parent phrase which is on the left side of the arrow in $parentPhrase
    // and all child phrases which are on the right side of the arrow in $childPhrases
}

这是你想到的,Broken Link?这会有用吗?

答案 2 :(得分:3)

有很多方法可以做到这一点。一篇关于谷歌风格的直接文章“你的意思是”检查是一个很好的读取如何实现这一点的想法。由谷歌研究主任彼得诺维格撰写。

http://norvig.com/spell-correct.html

答案 3 :(得分:2)

出于这个原因,您可以考虑自定义像Levenshtein这样的简单指标。添加参数,可以自定义哪些差异很重要,哪些类型不重要。

特别是,Levenshtein计算将一个字符串转换为另一个字符串所需的“编辑”(即插入,删除和替换)的数量。实际上,它对每个编辑加权相同。您可以编写一个实现,对不同的编辑进行加权。例如,将“ - ”改为“”应该具有非常低的权重(表示不重要)。将数字“3”更改为“2”,当数字单独时,应该具有非常高的权重(表示高重要性)。

通过参数化计算,您可以创建一个不断改进算法的途径。构建初始配置并在某些测试数据上运行它。找到度量标准较弱的地方 - 例如,它合并了您认为应该分开的两个术语 - 并修改参数化直到您满意为止。

这样,您就可以使用特定领域的知识来训练算法。

答案 4 :(得分:1)

假设趋势主题是通过计算生成的,那么在Twitter上执行此操作的确切算法将难以猜测。它很可能是高度机密和专利的(对于专利算法可能听起来很可怕)。

我觉得有理由相信他们会使用某种自然语言算法。根据具体情况,它们通常很难以计算方式执行,并且只会在某种程度上执行您想要的操作。

关于这个主题的一个明显有用的读物​​来自wiki:

祝你好运。

答案 5 :(得分:1)

他们很可能有一些自动系统可能会提出合并的候选人,然后人类会最终选择合并它们。可能会有一些它们自动组合。

  • 你建议删除空格和其他标点是一个很好的建议。最有可能的是,它们只会自动组合仅在标点符号或空白区域不同的内容。
  • 多重与单数:寻找这些差异很容易实现自动化,并且可能会产生合并的候选人。
  • 常见拼写错误 - 有常见拼写错误的数据库。他们甚至可能依赖Google API来提供拼写建议(我认为他们会公开)。
  • Soundex(或类似的)是一个很好的查找拼写错误,但它需要首先通过上述两个过滤器(删除空格,标点符号和复数),然后很可能需要一个人来做如果他们是相同的电话。但是,如果您可以使用相同或类似的soundex呈现显示聚类的图形表示,那么您将真正使该部分变得容易。您可以在群集开始出现和趋势时自动发送通知(他们实际上只关心趋势主题,因此即使组合的群集不是趋势,他们也可以等待检查它。)

当你真正需要一个人进入的地方是有共同的绰号时。像迈克尔杰克逊,MJ,迈克尔等,或MacDonalds,McD,Micky-D等等。然后用技术你有Visual Studio,VS2008,VS等等或StackOverflow,SO等等。然后是C#,C-Sharp, C#.NET都是一样的,但C和C ++是不同的。

所以它需要是一个组合。它可能依赖于已知变体和基于先前分析或其他来源的组合的数据库,但该数据库将由编辑定期维护。

答案 6 :(得分:0)

我记得当MJ去世时,Twitter手动回去并修正主题以指向他的死亡推文。这些天要求计算机自动执行这样的操作会有很多,尽管可以松散地完成。