6

Twitterのトレンドトピックは、多くの場合、複数の単語で構成されています。ただし、構成された用語の場合、多くの場合、さまざまなスペルの方法があります。たとえば、次のようになります。

「半血王子」/「半血王子」

トレンドトピックに言及しているすべての更新を見つけるには、すべてのスペル方法が必要です。Twitterはこれを行います:

Twitterのトレンドトピック管理者

左側にトピック名があり、右側にさまざまなスペルの方法があります。これは手動または自動で行われると思いますか?これを自動的に行うことは可能ですか?はいの場合:どのように?

あなたが私を助けてくれることを願っています。前もって感謝します!

4

7 に答える 7

7

基本的に必要なのは、2つの文字列間の類似性を見つけることです。

私はSoundexアルゴリズムがあなたが探しているものだと思います。音の響きに基づいて弦を比較するために使用できます。またはウィキが説明するように:

Soundexは、英語で発音されるように、音で名前にインデックスを付けるための音声アルゴリズムです。目標は、同音異義語を同じ表現にエンコードして、スペルにわずかな違いがあっても一致させることができるようにすることです。

と:

このアルゴリズム[編集:単語を文字と3桁で「評価」する]を使用すると、「Robert」と「Rupert」の両方が同じ文字列「R163」を返し、「Rubin」は「R150」を生成します。「Ashcraft」は「A261」を生成します。

レーベンシュタイン距離もあります。

幸運を。

于 2009-07-29T22:50:52.810 に答える
6

壊れたリンクのコメントに基づいて私自身の質問に答えようとします(これをありがとう):


ドキュメントのデータベースから1〜3語のフレーズを抽出しました。これらの余分なフレーズの中には、次のフレーズがあります。

  • ハーフブラッドプリンス
  • 混血の王子
  • 半血の王子

フレーズごとに、すべての特殊文字と空白スペースを取り除き、文字列を小文字にします。

$phrase='半血の王子様'; $ phrase = preg_replace('/ [^ az] / i'、''、$ phrase); $ phrase = strtolower($ phrase); //結果は「halfbloodprince」です

これを行うと、3つのフレーズすべて(上記を参照)に共通のスペルが1つあります。

  • ハーフブラッドプリンス=>ハーフブラッドプリンス
  • 半血の王子=>半血の王子
  • ハーフブラッドプリンス=>ハーフブラッドプリンス

したがって、「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
}

これはあなたが考えたものですか、壊れたリンクですか?これは機能しますか?

于 2009-08-06T23:09:43.837 に答える
3

これを行うには多くの方法があります。グーグルスタイルの「もしかして」チェックについての簡単な記事の1つは、これを達成する方法についてのアイデアを読むのに適しています。ピーター・ノーヴィグ、グーグルの研究ディレクターによって書かれました。

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

于 2009-08-06T02:36:16.453 に答える
1

トレンドトピックが計算によって生成されると仮定すると、Twitterでそれを実行する正確なアルゴリズムを推測するのは困難です。それはおそらく非常に機密性が高く、特許も取得しています(特許アルゴリズムに聞こえるかもしれませんが恐ろしいです)。

彼らはある種の自然言語アルゴリズムを使用すると信じるのは合理的だと思います。場合によっては、計算を実行するのに非常に重いことが多く、ある程度拡張したいことだけを実行します。

このテーマに関する明らかな役立つ読み物は、wikiからのものです。

幸運を。

于 2009-08-02T14:01:52.007 に答える
1

「anderstornvig」は、レーベンシュタイン/編集距離について言及しました。これは素晴らしいアイデアですが、特定の順列が他の順列よりも重要であるため、適切ではありません。問題は、どの違いが「重要」でどれが「重要でない」かを判断するときに、ドメイン固有の知識をたくさん使用していることだと思われます。たとえば、「Half-Blood Prince」のハイフンは非常に重要ですが、「Firefox3」の数字は非常に重要です。

このため、レーベンシュタインのような単純なメトリックをカスタマイズすることを検討してください。どの種類の違いが重要で、どの種類が重要でないかをカスタマイズできるパラメーターを追加します。

特に、Levenshteinは、ある文字列を別の文字列に変換するために必要な「編集」(つまり、挿入、削除、および置換)の数をカウントします。事実上、すべての編集に同じ重みを付けます。一部の編集に異なる重みを付ける実装を作成できます。たとえば、「-」を「」に変更すると、重みが非常に低くなります(重要性がないことを示します)。数字が単独の場合、「3」を「2」に変更すると、非常に高い重みが必要になります(重要度が高いことを示します)。

計算をパラメーター化することにより、アルゴリズムを継続的に改善するための手段を作成します。初期構成を構築し、いくつかのテストデータで実行します。メトリックが弱い場所(たとえば、分離する必要があると思われる2つの用語をマージする場所)を見つけ、満足するまでパラメーター化を変更します。

このようにして、ドメイン固有の知識を使用してアルゴリズムをトレーニングできます。

于 2009-08-06T23:00:58.050 に答える
1

ほとんどの場合、それらは組み合わせる可能性のある候補を示唆するいくつかの自動システムを持っており、次に人間がそれらを組み合わせるための最終的な選択をします。それらが自動的に結合するものがあるかもしれません。

  • スペースやその他の句読点を削除するというあなたの提案は良いものです。ほとんどの場合、句読点や空白だけが自動的に異なるものを組み合わせます。
  • 複数形と単数形:これらの違いを探すことは自動化が容易であり、組み合わせる可能性のある候補を生み出します。
  • 一般的なスペルミス-一般的なスペルミスのデータベースがあります。彼らはスペルの提案をGoogleAPIに頼ることさえあるかもしれません(私は彼らがそれを公開していると思います)。
  • Soundex(または同様のもの)はスペルミスを見つけるのに適していますが、最初に上記の2つのフィルター(スペース、句読点、複数形を削除)を通過する必要があり、同じ場合は人間が電話をかける必要があります。 。しかし、同じまたは類似のサウンデックスでクラスタリングを示すグラフィック表現を提示できれば、その部分は本当に簡単になります。クラスターが表示されてトレンドになったら、自動的に通知を送信できます(とにかく、実際にはトレンドトピックのみを気にするので、クラスターを組み合わせてもトレンドになっていない場合は、調査を待つことができます)。

あなたが本当に人間が介入する必要があるのは、一般的なニックネームがあるときです。Michael Jackson、MJ、Michaelなど。またはMacDonalds、McD、Micky-Dなど。次に、Technicalを使用すると、Visual Studio、VS2008、VSなど、またはStackOverflow、SOなどがあります。次にC#、C-Sharp、 C#.NETはすべて同じですが、CとC++は異なります。

したがって、それは組み合わせである必要があります。以前の分析または他のソースに基づく既知のバリエーションと組み合わせのデータベースに依存している可能性がありますが、そのデータベースは編集者によって定期的に維持されます。

于 2009-08-08T01:03:33.450 に答える
0

MJが亡くなったとき、Twitterは手動で戻って、彼の死のツイートを指すようにトピックを修正したことを覚えています。大まかに行うことはできますが、最近はこのようなことを自動的に行うようにコンピューターに依頼することが多くなります。

于 2009-07-29T22:49:14.827 に答える