==
сравнивает ссылки на объекты в Java и не является исключением для объектов String
.
Для сравнения фактического содержимого объектов (в том числе String
) необходимо использовать equals
.
Если сравнение двух объектов String
с использованием ==
оказывается true
, это связано с тем, что объекты String
были интернированы, а виртуальная машина Java имеет несколько ссылки указывают на тот же экземпляр String
. Не следует ожидать сравнения одного объекта String
, содержащего то же содержимое, что и другой объект String
, используя ==
для оценки как true
.
Прежде всего, вам нужен образец текста для анализа, чтобы определить взаимосвязь слов. Категоризация с скрытым семантическим анализом описана в Подходы латентного семантического анализа к категоризации .
Другой подход - наивная категоризация байесовского текста. Необходим образец текста с присвоенной категорией. На этапе обучения программа изучает различные категории и вероятность того, что слово встречается в тексте, присвоенном категории, см. , фильтрация спама байеса . Я не знаю, насколько хорошо это работает с отдельными словами.
Поскольку вам не нужно заниматься этим вопросом, когда вы решаете эту «загадку», я думаю, что это не должно быть легко. Тем не менее, я бы сделал что-то вроде этого (сказано очень упрощенно)
Создайте нейронную сеть, в которую вы вносите некоторый вклад ((e) книга, некоторые (e) книги) => Google не нужен
эта сеть классифицирует слова (нейронные сети отлично подходят для «неуверенной» классификации). Я думаю, вы можете просто знать, какое слово к какой категории относится из-за того, что оно встречается в тексте. («рыбалка» скорее всего будет упомянута рядом со словом «спорт»). После некоторого обучения нейронной сети она должна «привязать» слова к категориям.
Мой наивный подход:
Я бы попытался использовать набор инструментов CRM114 , чтобы обеспечить способ анализа большого корпуса текста. Затем вы можете использовать сопоставления из него, чтобы сделать предположение.
Используйте существующий разбитый на категории большой набор данных, такой как RCV1 , для обучения выбранной системы. Тогда вы могли бы поступить еще хуже, начав читать существующие исследования и тесты .
Appart от Google, существуют и другие «энциклопедические» наборы данных, которые вы можете создать, некоторые из них размещены как общедоступные наборы данных на Amazon Веб-службы , такие как полный снимок англоязычной Википедии.
Будьте изобретательны. Помимо Google есть и другие данные.
Счистите delicious.com и найдите каждое слово, просматривая количество коллективных тегов и т. Д.
Я мало что могу сказать об этом, но вкусно - это старый, огромный, невероятно-тяжелый помечены и содержат множество актуальной семантической информации, из которой можно извлечь. Таким образом, было бы очень легко построить базу данных семантики, используя ваш список слов в качестве основы для парсинга.
Информация находится в тегах.
Используйте (онлайн или загрузите) WordNet и найдите количество взаимосвязей, которые вы должны соблюдать между словами и каждой категорией.
Это возможно динамически генерировать тег JavaScript и добавлять его в документ HTML из другого кода JavaScript. Это загрузит целевой файл JavaScript. Я бы сделал несколько проходов. Сначала запросите 100 слов в 2-3 поисковых системах, возьмите первые y результирующих статей (y - порог для экспериментов. 5 - хорошее начало, я думаю) и просканируйте текст. В частности, я буду искать 10 категорий. Если категория появляется более чем x раз (x снова является порогом, с которым вам нужно поэкспериментировать), это совпадение. Основываясь на этом пороговом значении x (то есть, сколько раз категория появляется в тексте) и сколько раз из y верхних страниц она появляется, вы можете назначить вес для пары слово-категория. для большей точности вы можете затем выполнить еще один проход с теми поисковыми системами, которые не относятся к Google, с парой слово-категория (с отношением И) и применить количество полученных страниц к весу этой пары. Они просто предполагают, что пара слово-категория с наивысшим весом является правильной (при условии, что у вас даже будет более одного варианта). Вы также можете назначить слово нескольким категориям, если веса достаточно близки (возможно, порог z). Исходя из этого, вы можете ввести любое количество слов и любое количество категорий. И ты выиграешь свой вызов. Я также считаю, что этот метод хорош для оценки веса потенциальных AdWords в рекламе. но это уже другая тема ....
Удачи
Харел
Моей первой мыслью было использование внешних данных. Напишите программу, которая выполняет поиск в Google по каждому слову и выбирает «категорию», которая отображается первой / высшей в результатах поиска :)
Это можно было бы считать мошенничеством.
Да, я бы выбрал подход Wordnet. Проверьте это руководство по Измерению семантического сходства на основе WordNet . Вы можете запросить Wordnet онлайн на princeton.edu (погуглить), так что будет относительно легко написать решение вашей проблемы. Надеюсь, это поможет,
X.
Google запрещен, но у них есть почти идеальное решение - Google Sets .
Поскольку вам нужно понять семантику слов, вам нужны внешние источники данных. Вы можете попробовать использовать WordNet . Или вы можете попробовать использовать Википедию - найти страницу для каждого слова (или, может быть, только для категорий) и искать другие слова, появляющиеся на странице или связанных страницах.
Уволить этого учителя.
Единственное решение этой проблемы - уже иметь решение проблемы. Т.е. вам нужна таблица ключевых слов и категорий для построения вашего кода, который разделяет ключевые слова на категории.
Если, как вы предлагаете, вы не добавите систему, которая "понимает" английский язык. Это человек, сидящий перед компьютером или экспертной системой.
Если вы создаете экспертную систему и даже не знаете об этом, учитель не умеет ставить задачи.
Я предполагаю, что проблема позволяет использовать внешние данные, потому что в противном случае я не смогу представить способ алгоритмического вывода значения слов.
Возможно, что-то можно было бы сделать с базой данных тезауруса и поиском минимальных расстояний между 'словами слова и слова категории?
Вы можете создать собственный алгоритм для работы именно с этими данными, например, слова, оканчивающиеся на 'ing', являются глаголами (причастие в настоящем времени) и могут относиться к спорту.
Создайте набор категоризации
РЕДАКТИРОВАТЬ:
Украдите базу данных Википедии (в любом случае это бесплатно) и получите список статей по каждой из ваших десяти категорий. Подсчитайте количество вхождений каждого из ваших 100 слов во все статьи в каждой категории, и категория с наибольшей «плотностью ключевых слов» этого слова (например, рыбалка) побеждает.
Кажется, у вас есть несколько вариантов, но по большей части я думаю, что если вам нужны точные данные, вам понадобится помощь извне. Два варианта, которые я могу придумать, - это использовать поиск по словарю или краудсорсинг.
Что касается поиска по словарю, вы можете просто пройтись по базе данных, запросить ее и проанализировать результаты, чтобы увидеть, есть ли один из названия категорий отображаются на странице. Например, если вы выполните поиск « красный », вы найдете «цвет» на странице, и аналогично поиск « рыбалка » вернет на странице «спорт».
Другой , немного более нестандартным вариантом было бы использование краудсорсинга, примите во внимание следующее:
Похоже, вы могли бы использовать какую-то байесовскую классификацию, как она используется в фильтрации спама . Но для этого по-прежнему требуются «внешние данные» в виде какой-то текстовой базы, обеспечивающей контекст.
Без этого проблему невозможно решить. Это не проблема алгоритма, это проблема ИИ. Но даже ИИ (а также естественный интеллект, если на то пошло) нуждается в каком-то вкладе, чтобы учиться.
Я подозреваю, что профессор дает вам невозможную задачу, чтобы вы поняли, на каких различных уровнях вы можете думать о проблеме.
Ключевой вопрос здесь: кто решает, что такое «правильная» классификация? На чем основано это решение? Как можно воспроизвести это решение программно и какие входные данные для этого потребуются?
Возможно вы все слишком усложняете задачу.
Очевидно, вам нужна какая-то внешняя ссылка для ранжирования вероятности того, что X находится в категории Y. Возможно ли, что он проверяет ваше "нестандартное" мышление и что ВЫ могли бы быть внешней ссылкой? То есть,
Действительно плохой ответ (демонстрирует отсутствие «понимания») - но в качестве безумного укола вы можете нажать google (через код) для (например) «+ Рыбалка + Спорт», «+ Рыбалка + Кулинария »и т. Д. (То есть перекрестное соединение каждого слова и категории) - и пусть Google побеждает! т.е. выбирается комбинация с наибольшим количеством "совпадений" ...
Например (сначала результаты):
weather: fish
sport: ball
weather: hat
fashion: trousers
weather: snowball
weather: tornado
С кодом (TODO: добавить потоки ;-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;
}
Вы могли бы использовать базу данных WordNet, создать некоторую метрику, чтобы определить, насколько тесно связаны два слова ( слово и категория ) являются, а затем выберите лучшую категорию , чтобы поместить слово в.
Интересная задача. Вы смотрите на классификацию слов. Хотя вы можете изучить и использовать традиционные методы поиска информации, такие как 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», я предполагаю, что он имеет в виду программно, а не как средство получения информации для чтения!)
Как для C # с wordnet - как насчет http://opensource.ebswift.com/WordNet.Net/