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

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

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Чего бы я хотел:

  • игнорируйте артикли, местоимения и т.д. ("a", "an", "the", "him", "them" и т.д.)
  • сохраняйте имена собственные
  • игнорируйте расстановку переносов, за исключением мягкого вида

Дотянувшись до звезд, они были бы восхитительны:

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

Я попробовал некоторые базовые вещи с помощью Wordnet, но я просто слепо подстраиваю их и надеюсь, что это сработает для моих конкретных данных.Было бы здорово придумать что-нибудь более общее.

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

Решение

Вам понадобится не один, а несколько хороших алгоритмов, примерно описанных ниже.

  • игнорирование местоимений осуществляется с помощью стоп - лист.
  • сохранение имен собственных?Вы имеете в виду обнаружение именованных объектов, таких как Гувер Плотина и говорить "это одно слово" или составные существительные, например программирование язык?Я дам тебе подсказку:это непросто, но существуют библиотеки и для того, и для другого.Ищите NER (распознавание именованных объектов) и лексическое разбиение на части. OpenNLP это Java-инструментарий, который делает и то, и другое.
  • игнорирование расстановки переносов?Ты имеешь в виду, как при разрывах строк?Используйте регулярные выражения и проверяйте полученное слово с помощью поиска по словарю.
  • обработка множественных чисел / формирование основы:вы можете заглянуть в Стебель снежка.Это прекрасно справляется с задачей.
  • "группировка" прилагательных с их существительными, как правило, является задачей неглубокий разбор.Но если вы ищете конкретно качественные прилагательные (хороший, плохой, дерьмовый, удивительный ...), вас может заинтересовать анализ настроений. ЛингПайп делает это и многое другое.

Прости, я знаю, ты сказал, что хочешь ПОЦЕЛОВАТЬСЯ, но, к сожалению, твои требования не так-то легко удовлетворить.Тем не менее, для всего этого существуют инструменты, и вы должны быть в состоянии просто связать их вместе и не выполнять никаких задач самостоятельно, если вы этого не хотите.Если вы хотите выполнить задачу самостоятельно, я предлагаю вам взглянуть на stemming, это самое простое из всех.

Если вы используете Java, объедините Ясный с помощью OpenNLP инструментарий.Вы получите очень хорошие результаты, так как в Lucene уже встроен stemmer и много обучающих программ.С другой стороны, инструментарий OpenNLP плохо документирован, но вам не понадобится от него слишком много.Вас также могут заинтересовать НЛТК, написанный на Python.

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

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

...Да, я знаю.После посещения семинара по ИК мое уважение к 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) от "algorithm", а "exists" - как спряжение (VBZ) от "exist". Он также определил "a" и "the" как "определители (DT)" - другое слово, обозначающее артикль.Как вы можете видеть, POS-теггер также обозначил знаки препинания.

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

Вот несколько популярных POS-тегов:

Цепляющийся за дерево (только двоичный файл:Linux, Solaris, OS-X)
ЖЕНЯ Таггер (C++:скомпилируйте свое "я")
POS-Маркировщик из Стэнфорда (Java)

Чтобы выполнить последнее задание в вашем списке, вам нужно нечто большее, чем просто информация на уровне слов.Самый простой способ начать - это посчитать последовательности из слова а не просто сами слова.Они называются 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 загружает копию "Словаря дьявола" Амброуза Бирса. Следующие строки составляют список всех слов в тексте без знаков препинания.Затем вы создаете хэш-таблицу, которая в данном случае похожа на список уникальных слов, связанных с числом.Цикл for проходит по каждому слову в книге Бирса, если в таблице уже есть запись этого слова, каждое новое вхождение добавляет единицу к значению, связанному с этим словом в таблице;если слово еще не появилось, оно добавляется в таблицу со значением 1 (что означает одно вхождение). В случаях, о которых вы говорите, вам следовало бы уделять гораздо больше внимания деталям, например, использовать заглавные буквы для определения имен собственных только в середине предложений и т.д., Это очень грубо, но выражает концепцию.

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

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

Вот код (asp.net/c#):http://naspinski.net/post/Поиск по ключевым словам вне текстового документа.aspx

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

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

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

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

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

Просто какой-то бред, я уверен, что есть идеи получше, но мне нравится думать об этом.

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

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

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

Все, что вы перечислили, хорошо обрабатывается пикантный.

  1. Игнорируйте некоторые слова - используйте стоп-слова
  2. Извлечь тему - используйте пометку части речи, чтобы идентифицировать ее (работает "из коробки").После того как предложение будет разобрано, найдите "КОРЕНЬ" - главный глагол предложения.Автор: навигация по дереву синтаксического анализа вы найдете существительное, которое относится к этому глаголу.Это будет предметом обсуждения.
  3. Игнорируйте расстановку переносов - их токенизатор в большинстве случаев обрабатывает дефисы.Он может быть легко расширен для работы с более особыми случаями.

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

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