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

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

Что мне нужно:

  • игнорировать статьи, местоимения и т.д. ('a', 'an', 'the', 'him', 'them' и т.д.)
  • сохранить собственные существительные
  • игнорировать перенос, кроме мягкого вида

Достигнув звезд, они будут персиковыми:

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

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

Ответ 1

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

  • игнорирование местоимений осуществляется через stoplist.
  • сохранение собственных существительных? Вы имеете в виду обнаружение названных объектов, таких как плотина Гувера и высказывание "это одно слово" или составные существительные, такие как язык программирования? Я дам вам намек: этот жесткий, но существуют библиотеки для обоих. Ищите NER (Именованное распознавание entitiy) и лексическое chunking. OpenNLP - это Java-Toolkit, который делает оба.
  • игнорирование переносов? Вы имеете в виду, как на разрыве линии? Используйте регулярные выражения и проверяйте полученное слово через поиск в словаре.
  • обработка множественных чисел/создание: вы можете заглянуть в Snowball stemmer. Это прекрасно делает трюк.
  • "группировка" прилагательных с их существительными обычно является задачей неглубокой разборки. Но если вы ищете специально для качественных прилагательных (хороший, плохой, дерьмовый, потрясающий...), вас может заинтересовать анализ настроений. LingPipe делает это и многое другое.

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

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

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

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

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

Ответ 2

Добро пожаловать в мир НЛП ^ _ ^

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

Уже есть инструменты, которые расскажут вам, является ли слово в предложении существительным, прилагательным или глаголом. Они называются тегами фрагментации речи. Как правило, они принимают открытый текст в качестве ввода и выводят слово, его базовую форму и часть речи. Вот выступление популярного тегатора частичной речи 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" и "the" как "определители (DT)" - другое слово для статьи. Как вы можете видеть, тег POS также обозначал пунктуацию.

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

Вот некоторые популярные тегеры POS:

TreeTagger (только для двоичных файлов: Linux, Solaris, OS-X)
GENIA Tagger (С++: скомпилируйте себя)
Stanford POS Tagger (Java)

Чтобы сделать последнее в своем списке, вам нужно больше, чем просто информация на уровне слов. Легкий способ начать - подсчет последовательностей слов, а не только самих слов. Они называются n-gram. Хорошее место для начала - UNIX для поэтов. Если вы хотите инвестировать в книгу по НЛП, я бы рекомендовал Основы статистической обработки естественного языка.

Ответ 4

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

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

Ответ 6

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

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

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

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

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

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

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

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