Подтвердить что ты не робот

Категоризация слов и категорий

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

В основном нам предоставили БД из 100 слов и 10 категорий. Между словами или категориями нет совпадений. Таким образом, в основном это список из 100 слов и 10 категорий.

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

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

Если мы это выясним, мы должны увеличить размер выборки, а человек с "лучшим" соответствием% победит.

Кто-нибудь знает, как начать что-то подобное? Или любые ресурсы? Предпочтительно в С#?

Даже ключевое слово DB или что-то может быть полезно? Кто-нибудь знает о каких-либо свободных?

4b9b3361

Ответ 1

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

Другим подходом была бы наивная классификация категорий байков. Требуется образец текста с назначенной категорией. На этапе обучения программа изучает разные категории и вероятность того, что слово будет иметь место в тексте, присвоенном категории, см. фильтрация спама в байтах. Я не знаю, насколько хорошо это работает с одиночными словами.

Ответ 2

Действительно плохой ответ (демонстрирует отсутствие "понимания" ) - но, как сумасшедший удар, вы можете ударить по Google (через код) для (например) "+ Fishing + Sport", "+ Fishing + Cooking" и т.д. (т.е. каждое слово и категория) - и пусть победит google! то есть выбирается комбинация с наиболее "хитами"...

Например (сначала результаты):

weather: fish
sport: ball
weather: hat
fashion: trousers
weather: snowball
weather: tornado

С кодом (TODO: добавить threading; -p):

static void Main() {
    string[] words = { "fish", "ball", "hat", "trousers", "snowball","tornado" };
    string[] categories = { "sport", "fashion", "weather" };

    using(WebClient client = new WebClient()){
        foreach(string word in words) {
            var bestCategory = categories.OrderByDescending(
                cat => Rank(client, word, cat)).First();
            Console.WriteLine("{0}: {1}", bestCategory, word);
        }
    }
}

static int Rank(WebClient client, string word, string category) {
    string s = client.DownloadString("http://www.google.com/search?q=%2B" +
        Uri.EscapeDataString(word) + "+%2B" +
        Uri.EscapeDataString(category));
    var match = Regex.Match(s, @"of about \<b\>([0-9,]+)\</b\>");
    int rank = match.Success ? int.Parse(match.Groups[1].Value, NumberStyles.Any) : 0;
    Debug.WriteLine(string.Format("\t{0} / {1} : {2}", word, category, rank));
    return rank;
}

Ответ 3

Может быть, вы все слишком сильно это делаете.

Очевидно, вам нужна внешняя ссылка какого-то рода, чтобы ранжировать вероятность того, что X находится в категории Y. Возможно ли, что он тестирует ваше "из коробки" и что вы можете быть внешней ссылкой? То есть, алгоритм - это простой вопрос прохождения каждой категории и каждого слова и запрос ВАС (или того, кто сидит на терминале), является ли слово X в отображаемой категории Y. Существует несколько простых вариантов этой темы, но все они вовлечь прохождение мимо гордиев узла, просто разрезав его.

Или не... зависит от учителя.

Ответ 4

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

Что касается поиска по словарю, вы можете просто пройти через базу данных, запросить ее и проанализировать результаты, чтобы увидеть, отображается ли одно из имен категорий на странице. Например, если вы ищете " red, вы найдете" цвет" на странице и аналогичным образом, ища " fishing "возвращает" спорт "на странице.

Другой, немного больше вне опции окна будет использовать источник толпы, рассмотрим следующее:

  • Начать более или менее случайное назначение пар имя-значение.
  • Вывести результаты.
  • Загрузите результаты на Amazon Mechanical Turk (AMT), чтобы получить обратную связь от людей о том, насколько хорошо работают пары.
  • Введите результаты оценки AMT обратно в систему вместе со случайными присваиваниями.
  • Если все было одобрено, мы закончили.
  • В противном случае сохраните правильные удары и обработайте их, чтобы увидеть, можно ли установить какой-либо шаблон, создать новый набор пар имя-значение.
  • Вернитесь к шагу 3.

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

Ответ 5

Вы можете сделать собственный алгоритм для работы над этими данными, например, слова, заканчивающиеся на 'ing', являются глаголами (настоящее причастие) и могут быть спортивными.

Создайте набор правил категоризации, подобных приведенным выше, и посмотрите, насколько высока ваша точность.

EDIT:

Украдите базу данных wikipedia (она в любом случае свободна) и получите список статей по каждой из ваших десяти категорий. Подсчитайте вхождения каждого из ваших 100 слов во всех статьях под каждой категорией, и побеждает категория с наивысшей "плотностью ключевых слов" этого слова (например, рыбалки).

Ответ 6

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

Без этого проблему решить невозможно. Это не проблема алгоритма, это проблема ИИ. Но даже ИИ (а также естественный интеллект, если на то пошло) нуждается в некотором роде для изучения.

Я подозреваю, что профессор дает вам невозможную проблему, чтобы вы поняли, на каких разных уровнях вы можете думать о проблеме.

Ключевой вопрос: кто решает, что такое "правильная" классификация? На чем основано это решение? Как можно воспроизвести это решение программно и какие входные данные ему понадобятся?

Ответ 7

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

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

Ответ 8

Пожар этого учителя.

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

Если, как вы полагаете, вы добавите систему, которая "понимает" английский. Это человек, сидящий перед компьютером или экспертная система.

Если вы строите экспертную систему и даже не знаете ее, учитель плохо справляется с проблемами.

Ответ 9

Google запрещен, но у них почти идеальное решение - Google Устанавливает.

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

Ответ 10

Да, я подойду для подхода к wordnet. Проверьте этот учебник на измерение семантического подобия на основе Word. Вы можете запросить Wordnet в Интернете по адресу princeton.edu(google it), поэтому относительно легко решить проблему для вашей проблемы. Надеюсь, это поможет,

Х.

Ответ 11

Интересная проблема. То, что вы ищете, - это классификация слов. Хотя вы можете изучать и использовать традиционные методы поиска информации, такие как LSA и категоризацию на основе таких - я не уверен, что это ваше намерение (если это так, то сделайте это всеми средствами!:)

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

# S: (n) **fishing**, sportfishing (the act of someone who fishes as a diversion)
* direct hypernym / inherited hypernym / sister term
      o S: (n) **outdoor sport, field sport** (a sport that is played outdoors)
      + direct hypernym / inherited hypernym / sister term
            # S: (n) **sport**, athletics 
            (an active diversion requiring physical exertion and competition) 

То, что мы видим здесь, - это список отношений между словами. Термин "промысел" относится к спорту на открытом воздухе, который относится к спорту.

Теперь, если вы получите дрейф - можно использовать это соотношение для вычисления вероятности классификации "рыбалки" для "спорта" - скажем, на основе линейного расстояния в цепочке слов или количества вхождений, и другие. (должно быть тривиально найти ресурсы о том, как создавать методы подобия с использованием wordnet. Когда профессор говорит "не использовать Google", я предполагаю, что он означает программно, а не как средство для получения информации для чтения!)

Что касается С# с wordnet - как насчет http://opensource.ebswift.com/WordNet.Net/

Ответ 12

Моя первая мысль заключалась в том, чтобы использовать внешние данные. Напишите программу, которая выполняет поиск по каждому слову google, и берет "категорию", которая выглядит первой или самой высокой в ​​результатах поиска:)

Это может считаться обманом.

Ответ 13

Используйте существующий классифицированный большой набор данных, такой как RCV1, чтобы обучить вашу систему выбора. Вы могли бы сделать хуже, чем начать читать существующие исследования и тесты.

В Appart от Google существуют другие "энциклопедические" наборы данных, которые вы можете построить, некоторые из них размещены как общедоступные наборы данных на Amazon Web Services, например полный снимок Википедии на английском языке.

Будьте изобретательны. Существуют другие данные, помимо Google.

Ответ 14

Ну, вы не можете использовать Google, но вы можете использовать Yahoo, Ask, Bing, Ding, Dong, Kong... Я бы сделал несколько проходов. Сначала запросите 100 слов против 2-3 поисковых систем, возьмите первые y результирующие статьи (y - порог для экспериментов с. 5 - хорошее начало, я думаю) и сканирование текста. В частности, я буду искать 10 категорий. Если категория появляется больше, чем x времени (x снова является некоторым порогом, с которым вам нужно поэкспериментировать) его совпадение. Основываясь на этом пороге x (т.е. Сколько раз категория появляется в тексте), и как может отображаться верхняя страница страницы, вы можете назначить вес для пары слов. для лучшей точности вы можете сделать еще один проход с теми поисковыми системами, которые не принадлежат Google, с парой слов категории (с отношением AND) и применить количество результирующих страниц к весу этой пары. Они просто предполагают, что пара слов категории с наивысшим весом является правильной (при условии, что у вас даже будет более одного варианта). Вы также можете многократно назначить слово нескольким категориям, если весы достаточно близки (возможно, z-порог). Исходя из этого, вы можете ввести любое количество слов и любое количество категорий. И ты выиграешь свой вызов. Я также считаю, что этот метод хорош, чтобы оценить вес потенциальных adwords в рекламе. но это другая тема....

Удачи.

Harel

Ответ 15

Использовать (онлайн или скачать) WordNet и найти количество отношений, которые вы должны соблюдать между словами и каждой категорией.

Ответ 16

Мой наивный подход:

  • Создайте огромный текстовый файл, например this (прочитать статью для вдохновения)
  • Для каждого слова, сканируйте текст и всякий раз, когда вы соответствуете этому слову, подсчитайте "категории", которые отображаются в позициях N (максимум, aka радио) слева и справа от него.
  • Слово, вероятно, относится к категории с наибольшим счетчиком.

Ответ 17

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

Ответ 18

Скопируйте delicious.com и выполните поиск каждого слова, просмотрите количество коллективных меток и т.д.

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

Знание находится в тегах.

Ответ 19

Поскольку вам не нужно посещать тему, когда вы решаете эту "загадку", мне кажется, это нелегко. Тем не менее я бы сделал что-то вроде этого (очень упрощенно сказано)

Создайте сеть нейронов, в которой вы даете некоторый вклад (книга (e), некоторые (е) книги) = > не требуется Google

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

Ответ 20

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

Ответ 21

Вы можете реализовать алгоритм обучения для этого, используя метод monte carlo и обратную связь с человеком. Попросите систему случайным образом классифицировать слова, а затем попросите вас проголосовать за них как "совпадение" или "не совпадение". Если это соответствует, слово категоризируется и может быть устранено. Если нет, система исключает ее из этой категории в будущих итерациях, поскольку она знает, что она там не принадлежит. Это даст очень точные результаты.

Это будет работать для проблемы с 100 словами довольно легко. Для большей проблемы вы можете объединить это с образованным угадыванием, чтобы ускорить процесс. Здесь, как говорили многие люди, вам понадобятся внешние источники. Метод google, вероятно, будет работать наилучшим образом, поскольку Google уже выполнил тонну работы над ним, но запрет на то, что вы могли бы, например, извлечь данные из своей учетной записи facebook с помощью apis facebook и попытаться выяснить, какие слова статистически более вероятны появляться с ранее классифицированными словами.

В любом случае, это невозможно сделать без какого-либо внешнего ввода, который в какой-то момент произошел от человека. Если вы не хотите быть нахальным и, например, определить категории с помощью некоторого сериализованного значения, содержащегося в тексте ascii для имени: P