Актуальные темы в Твиттере:Комбинируйте разные варианты написания

StackOverflow https://stackoverflow.com/questions/1203497

  •  05-07-2019
  •  | 
  •  

Вопрос

Актуальные темы Twitter часто состоят не только из одного слова.Но для составных терминов часто существуют разные способы написания, например:

"Принц-полукровка" / "Half-Blood Prince"

Чтобы найти все обновления, в которых упоминается Актуальная Тема, вам понадобятся все способы написания.Твиттер делает это:

Twitter's Trending Topics Admin

Слева у вас есть название темы, а справа - различные варианты написания.Как вы думаете, это делается вручную или автоматически?Возможно ли сделать это автоматически?Если да, то:Каким образом?

Я надеюсь, что вы сможете мне помочь.Заранее спасибо!

Это было полезно?

Решение 2

Я постараюсь ответить на свой собственный вопрос, основываясь на комментарии неработающей ссылки (спасибо вам за это):


Вы извлекли фразы, состоящие из 1-3 слов, из вашей базы данных документов.Среди этих извлеченных фраз есть следующие фразы:

  • Принц-полукровка
  • Принц-полукровка
  • Принц - Полукровка

Для каждой фразы вы удаляете все специальные символы и пробелы и переводите строку в нижний регистр:

$фраза = "Принц-полукровка";$phrase = preg_replace('/[^a-z]/i', ", $фраза);$phrase = strtolower($фраза);// результат - "принц-полукровка"

Когда вы это сделаете, все 3 фразы (см. Выше) будут иметь одно общее написание:

  • Принц-полукровка => принц-полукровка
  • Принц-полукровка => принц-полукровка
  • Принц - полукровка => принц -полукровка

Итак, "принц-полукровка" - это родительская фраза.Вы вставляете в свою базу данных как обычную фразу, так и родительскую.

Чтобы показать "Администратора актуальных тем", например, в 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
}

Это то, о чем ты подумал, Неработающая ссылка?Сработает ли это?

Другие советы

То, что вы в основном хотите, это найти сходство между двумя строками.

Я думаю, что Саундекс алгоритм - это то, что вы ищете.Его можно использовать для сравнения строк в зависимости от того, как они звучат.Или как описано в вики:

Soundex - это фонетический алгоритм для индексации имен по звуку, как они произносятся на английском языке.Цель состоит в том, чтобы омофоны были закодированы в одном и том же представлении, чтобы их можно было сопоставлять, несмотря на незначительные различия в написании.

И:

Используя этот алгоритм [ПРАВИТЬ / ПРАВИТЬ КОД:то есть, "оценивая" слова по букве и трем цифрам], и "Роберт", и "Руперт" возвращают одну и ту же строку "R163", в то время как "Рубин" выдает "R150"."Эшкрафт" дает "А261".

Есть также расстояние Левенштейна.

Удачи.

Есть много способов сделать это. Одна прямая статья о стиле Google " вы имели в виду " проверка хороша для идей о том, как этого добиться. Автор Питер Норвиг, директор по исследованиям в Google.

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

"андерсторнвиг" упомянул расстояние Левенштейна / редактирования, что является отличной идеей, но не совсем уместно, потому что определенные перестановки более значимы, чем другие.Проблема, по-видимому, заключается в том, что мы используем много знаний о предметной области, когда определяем, какие различия являются "значимыми", а какие "незначительными". Например, мы знаем, что дефис в "Принц-полукровка" очень важен, но число в "Firefox 3" очень важно.

По этой причине вы могли бы рассмотреть возможность настройки простой метрики, такой как Levenshtein.Добавьте параметры, которые позволят вам настроить, какие виды различий важны, а какие несущественны.

В частности, Левенштейн подсчитывает количество "правок" (то есть вставок, удалений и замен), необходимых для преобразования одной строки в другую.По сути, он взвешивает каждую правку одинаково.Вы могли бы написать реализацию, которая по-другому взвешивает некоторые изменения.Например, изменение "-" на " " должно иметь очень низкий вес (указывающий на неважность).Изменение "3" на "2", когда число одно, должно иметь очень большой вес (указывающий на высокую важность).

Настраивая вычисления, вы создаете возможности для постоянного совершенствования вашего алгоритма.Создайте начальную конфигурацию и запустите ее на некоторых тестовых данных.Найдите места, где метрика слабая - например, где она объединяет два термина, которые, по вашему мнению, должны быть разделены, - и изменяйте параметризацию до тех пор, пока не будете удовлетворены.

Таким образом, вы можете обучить свой алгоритм, используя свои знания о предметной области.

Скорее всего, у них есть какие-то автоматические системы, которые предлагают вероятных кандидатов для объединения, а затем человек делает окончательный выбор в пользу их объединения.Некоторые из них могут быть объединены автоматически.

  • Ваше предложение убрать пробелы и другие знаки препинания - хорошее.Скорее всего, они автоматически объединяют вещи, которые отличаются только пунктуацией или пробелами.
  • Множественное число противединственное число:поиск этих различий было бы легко автоматизировать, и это привело бы к появлению вероятных кандидатов для объединения.
  • Распространенные орфографические ошибки - существуют базы данных распространенных орфографических ошибок.Они могут даже полагаться на Google API для получения предложений по правописанию (я думаю, они раскрывают это).
  • Саундекс (или аналогичный) хорош для поиска орфографических ошибок, но для этого нужно было бы сначала пройти через два вышеупомянутых фильтра (удалить пробелы, знаки препинания и множественное число), а затем, скорее всего, потребуется, чтобы человек сделал вызов, если они совпадают.Но если бы вы могли представить графическое представление, показывающее кластеризацию, с тем же или похожим soundex, тогда вы действительно упростили бы эту часть.Вы могли бы автоматически отправлять уведомления, когда кластер начинает появляться и становиться трендовым (в любом случае, их действительно интересуют только трендовые темы, поэтому, если даже объединенный кластер не является трендовым, они могут подождать, чтобы изучить его).

Где вам действительно нужен человек, чтобы вмешаться, так это когда есть общие прозвища.Как Майкл Джексон, ЭМ Джей, Майкл и т.д.Или MacDonalds, McD, Micky-D's и т.д.И тогда с технической точки зрения у вас есть Visual Studio, VS2008, VS и т.д.или StackOverflow, SO и т.д.Тогда C #, C-Sharp, C#.NET - это все одно и то же, но C и C ++ разные.

Так что это должна быть комбинация.Он может опираться на базу данных известных вариаций и комбинаций, основанную на предыдущем анализе или других источниках, но эта база данных будет регулярно поддерживаться редактором.

Предполагая, что трендовые темы генерируются вычислительным путем, точный алгоритм, выполняющий это в Twitter, будет трудно угадать.Скорее всего, он строго конфиденциальен и к тому же запатентован (как бы страшно это ни звучало в отношении патентных алгоритмов).

Однако я нахожу разумным полагать, что они будут использовать какой-то алгоритм на естественном языке.В зависимости от конкретного случая они часто действительно сложны для выполнения вычислительно и будут делать только то, что вы хотите в некоторой степени.

Очевидно, что полезная информация по этому вопросу взята из wiki:

Удачи.

Я помню, когда MJ скончался, твиттер вернулся вручную и исправил темы, чтобы указать на твиты его смерти. В наши дни было бы очень сложно попросить компьютер сделать что-то подобное автоматически, хотя это можно сделать свободно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top