Алгоритм частотности слова для обработки естественного языка

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

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

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

33
задан Amit G 22 June 2015 в 13:56
поделиться

7 ответов

Вам будет нужно не один, но несколько хороших алгоритмов, вроде следующего.

  • местоимения игнорирования сделан через стоп-лист .
  • , сохраняющий имена собственные? Вы имеете в виду, обнаруживая именованные сущности, как [1 110] Hoover дам и говоря, что "это - одно слово" или составные существительные, как [1 112] язык программирования ? Я дам Вам подсказку: это - жесткое, но там существуйте библиотеки для обоих. Ищите выделение именованных сущностей (Названный entitiy распознаванием) и лексическое разделение на блоки. OpenNLP является Инструментарий Java, который делает обоих.
  • расстановка переносов игнорирования? Вы имеете в виду, как в разрывах строки? Используйте регулярные выражения и проверьте получающееся слово через поиск по словарю.
  • множественные числа/стемминг обработки: можно изучить стеммер Снежка . Это добивается цели приятно.
  • "группирующиеся" прилагательные с их существительными обычно задача поверхностный синтаксический анализ . Но если Вы смотрите специально для качественных прилагательных (хороший, плохой, поганый, удивительный...), можно интересоваться анализ мнений . LingPipe делает это, и многое другое.

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

, Если Вы идете с Java, объединение Lucene с инструментарий OpenNLP . Вы получите очень хорошие результаты, поскольку Lucene уже встроили стеммер и много учебного руководства. Инструментарий OpenNLP, с другой стороны, плохо документируется, но Вам не будет нужно слишком много из него. Вы могли бы также интересоваться NLTK, записанный в Python.

я сказал бы, что Вы отбрасываете свое последнее требование, поскольку оно включает поверхностный синтаксический анализ, и будет определенно не impove свои результаты.

А-ч, btw. точный термин того document-term-frequency-thing, который Вы искали, называют tf-idf. Это - в значительной степени лучший способ искать частоту документа для условий. Чтобы сделать это правильно, Вы не обойдете использование multidimenional векторные матрицы.

... Да, я знаю. После взятия семинара по IR мое уважение к Google было еще больше. После выполнения некоторого материала в IR мое уважение к ним упало столь же быстрое, все же.

70
ответ дан Aleksandar Dimitrov 27 November 2019 в 17:38
поделиться

Приветствуйте в мире обработки естественного языка ^_^

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

уже существуют инструменты, которые скажут Вам, если слово в предложении будет существительным, прилагательным или глаголом. Их называют теггеры частей речи . Как правило, они берут английский язык простого текста в качестве входа и производят слово, его основную форму и часть речи. Вот вывод популярного теггера частей речи 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 для Поэтов . Если бы Вы готовы вложить капитал в книгу по обработке естественного языка, я рекомендовал бы Основы статистической обработки естественного языка .

16
ответ дан underspecified 27 November 2019 в 17:38
поделиться

Вот пример того, как Вы могли бы сделать это в 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.

4
ответ дан unmounted 27 November 2019 в 17:38
поделиться

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

Вот код (asp.net/c#): http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

2
ответ дан naspinski 27 November 2019 в 17:38
поделиться

Первая часть Вашего вопроса не звучит настолько плохой. Все, что в основном необходимо сделать, читается каждое слово из файла (или поток w/e), и поместите его в дерево префикса и каждый раз, когда Вы случайно встречаете слово, которое уже существует, Вы увеличиваете значение, связанное с ним. Конечно, у Вас был бы черный список всего, что Вы хотели бы упущенный из Ваших вычислений также.

при использовании дерева префикса Вы удостоверяетесь, что для нахождения любого слова идет в O (N), где N является максимальной длиной слова в наборе данных. Преимущество дерева префикса в этой ситуации состоит в том, что, если Вы хотите искать множественные числа и стемминг Вас, может зарегистрироваться в O (M+1), если это даже возможно для слова, где M является длиной слова без основы или множества (который является словом? hehe). Как только Вы создали свое дерево префикса, я повторно проанализировал бы его для основ и такой и уплотнил бы его вниз так, чтобы корневое слово было тем, что содержит результаты.

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

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

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

Просто некоторые быстрые движения, я уверен, существуют лучшие идеи, но я люблю думать об этом материале.

2
ответ дан Justin Bozonier 27 November 2019 в 17:38
поделиться

Алгоритм Вы просто описали его. Программа, которая делает это из поля с большим высказыванием кнопки, "Делает это"... Я не знаю.

, Но позволяют мне быть конструктивным. Я рекомендую Вам эту книгу , Программируя Коллективный разум . Главы 3 и 4 содержат очень прагматические примеры (действительно, никакие сложные теории, просто примеры).

1
ответ дан graffic 27 November 2019 в 17:38
поделиться

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

0
ответ дан 27 November 2019 в 17:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: