Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Вам будет нужно не один, но несколько хороших алгоритмов, вроде следующего.
я сожалею, я знаю, что Вы сказали, что хотели к KISS, но к сожалению, Вашим требованиям не настолько легко удовлетворить. Тем не менее, там существуйте инструменты для все это, и необходимо быть в состоянии просто связать их и не иметь для выполнения любой задачи сами, если Вы не хотите. Если Вы хотите выполнить задачу сами, я предлагаю, чтобы Вы посмотрели на стемминг, это является самым легким из всех.
, Если Вы идете с Java, объединение Lucene с инструментарий OpenNLP . Вы получите очень хорошие результаты, поскольку Lucene уже встроили стеммер и много учебного руководства. Инструментарий OpenNLP, с другой стороны, плохо документируется, но Вам не будет нужно слишком много из него. Вы могли бы также интересоваться NLTK, записанный в Python.
я сказал бы, что Вы отбрасываете свое последнее требование, поскольку оно включает поверхностный синтаксический анализ, и будет определенно не impove свои результаты.
А-ч, btw. точный термин того document-term-frequency-thing, который Вы искали, называют tf-idf. Это - в значительной степени лучший способ искать частоту документа для условий. Чтобы сделать это правильно, Вы не обойдете использование multidimenional векторные матрицы.
... Да, я знаю. После взятия семинара по IR мое уважение к Google было еще больше. После выполнения некоторого материала в IR мое уважение к ним упало столь же быстрое, все же.
Приветствуйте в мире обработки естественного языка ^_^
Все, в чем Вы нуждаетесь, немного элементарных знаний и некоторые инструменты.
уже существуют инструменты, которые скажут Вам, если слово в предложении будет существительным, прилагательным или глаголом. Их называют теггеры частей речи . Как правило, они берут английский язык простого текста в качестве входа и производят слово, его основную форму и часть речи. Вот вывод популярного теггера частей речи UNIX на первом предложении Вашего сообщения:
$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english
# Word POS surface form
Without IN without
getting VVG get
a DT a
degree NN degree
in IN in
information NN information
retrieval NN retrieval
, , ,
I PP I
'd MD will
like VV like
to TO to
know VV know
if IN if
there EX there
exists VVZ exist
any DT any
algorithms NNS algorithm
for IN for
counting VVG count
the DT the
frequency NN frequency
that IN/that that
words NNS word
occur VVP occur
in IN in
a DT a
given VVN give
body NN body
of IN of
text NN text
. SENT .
, Как Вы видите, это определило "алгоритмы", как являющиеся формой множественного числа (NNS) "алгоритма", и "существует" как являющийся спряжением (VBZ), "существуют". Это также определило "a" и как "детерминативы (DT)" - другое слово для статьи. Как Вы видите, теггер частей речи также маркировал пунктуацию.
, Чтобы сделать все кроме последней точки в Вашем списке, просто необходимо выполнить текст через теггер частей речи, отфильтровать категории, которые не интересуют Вас (детерминативы, местоимения, и т.д.) и считают частоты основных форм слов.
Вот некоторые популярные теггеры частей речи:
TreeTagger (двоичный файл только: Linux, Солярис, OS X)
Теггер GENIA (C++: скомпилируйте Ваш сам)
Стэнфордский теггер частей речи (Java)
, Чтобы сделать последнюю вещь в Вашем списке, Вам нужны больше, чем просто информация об уровне слова. Простой способ запуститься путем подсчета последовательности из [1 111] слова , а не просто сами слова. Их называют n-граммы . Хорошее место для запуска UNIX для Поэтов . Если бы Вы готовы вложить капитал в книгу по обработке естественного языка, я рекомендовал бы Основы статистической обработки естественного языка .
Вот пример того, как Вы могли бы сделать это в Python, понятия подобны на любом языке.
>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
if item not in skip:
try:
results[item] += 1
except KeyError:
results[item] = 1
>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...
первая строка просто получает библиотеки, которые помогают с частями проблемы, как во второй строке, где загрузки urllib2 копия Словаря "дьявола Ambrose Bierce" следующие строки входят в список всех слов в тексте без пунктуации. Тогда Вы создаете хэш-таблицу, которая в этом случае похожа на список уникальных слов, связанных с числом. Для цикла пробегается через каждое слово в книге Bierce, если уже существует запись того слова в таблице, каждое новое возникновение добавляет тот к значению, связанному с тем словом в таблице; если слово еще не появилось, оно добавляется к таблице со значением 1 (значение одного возникновения.) Для случаев Вы говорите о, Вы хотели бы уделить намного больше внимания деталям, например, с помощью капитализации, чтобы помочь определить имена собственные только посреди предложений, и т.д., это очень грубо, но выражает понятие.
Для вхождения в материал стемминга и плюрализации, эксперимент, затем изучают стороннюю работу, я наслаждался частями NLTK, который является академическим проектом с открытым исходным кодом, также в Python.
Я записал полную программу, чтобы сделать просто это некоторое время назад. Я могу загрузить демонстрацию позже, когда я возвращаюсь домой.
Вот код (asp.net/c#): http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx
Первая часть Вашего вопроса не звучит настолько плохой. Все, что в основном необходимо сделать, читается каждое слово из файла (или поток w/e), и поместите его в дерево префикса и каждый раз, когда Вы случайно встречаете слово, которое уже существует, Вы увеличиваете значение, связанное с ним. Конечно, у Вас был бы черный список всего, что Вы хотели бы упущенный из Ваших вычислений также.
при использовании дерева префикса Вы удостоверяетесь, что для нахождения любого слова идет в O (N), где N является максимальной длиной слова в наборе данных. Преимущество дерева префикса в этой ситуации состоит в том, что, если Вы хотите искать множественные числа и стемминг Вас, может зарегистрироваться в O (M+1), если это даже возможно для слова, где M является длиной слова без основы или множества (который является словом? hehe). Как только Вы создали свое дерево префикса, я повторно проанализировал бы его для основ и такой и уплотнил бы его вниз так, чтобы корневое слово было тем, что содержит результаты.
После поиска у Вас могли быть некоторые простые правила на месте для имения возврата соответствия, положительного в случае корня или основы или что имеет Вас.
вторая часть кажется чрезвычайно сложной. Мой наивный наклон состоял бы в том, чтобы содержать отдельные результаты для адъективно-подчиненных группировок. Используйте те же принципы как выше, но просто разделите его.
Другая опция для семантического анализа могла моделировать каждое предложение как дерево предмета, глагола, и т.д. отношения (Предложение имеет предмет и глагол, предмет имеет существительное и прилагательное, и т.д.). Как только Вы разбили весь свой текст таким образом, кажется, что могло бы быть довольно легко пробежать и получить быстрый подсчет различных соответствующих соединений, которые произошли.
Просто некоторые быстрые движения, я уверен, существуют лучшие идеи, но я люблю думать об этом материале.
Алгоритм Вы просто описали его. Программа, которая делает это из поля с большим высказыванием кнопки, "Делает это"... Я не знаю.
, Но позволяют мне быть конструктивным. Я рекомендую Вам эту книгу , Программируя Коллективный разум . Главы 3 и 4 содержат очень прагматические примеры (действительно, никакие сложные теории, просто примеры).
Вы можете использовать словарь всемирной сети, чтобы получить основную информацию о ключевом слове вопроса, например о его прошлом речи, извлечь синоним, вы также можете сделать то же самое для своего документа, чтобы создать индекс для Это. тогда вы можете легко сопоставить ключевое слово с индексным файлом и оценить документ. затем резюмируйте это.