Подтвердить что ты не робот

Алгоритмы обнаружения фраз и ключевых слов из текста

У меня есть около 100 мегабайт текста без какой-либо разметки, разделенной примерно на 10 000 записей. Я хотел бы автоматически генерировать список тегов. Проблема в том, что существуют группы слов (т.е. Фразы), которые имеют смысл только тогда, когда они сгруппированы вместе.

Если я просто пересчитываю слова, я получаю большое количество действительно общих слов (есть, для, для, в, и т.д.). Я подсчитал слова и количество других слов, которые были до и после него, но теперь я действительно не могу понять, что делать дальше. Информация, относящаяся к 2 и 3 фразам, присутствует, но как я могу извлечь эти данные?

4b9b3361

Ответ 1

Прежде всего, попытайтесь сохранить информацию о "границах", которая входит во входной текст.
(если такая информация не будет легко потеряна, ваш вопрос подразумевает, что, возможно, токенизация была легко выполнена)
Во время процесса маркерного анализа (в этом случае) найдите шаблоны, которые могут определять границы выражений (такие как пунктуация, особенно периоды, а также множественное разделение LF/CR, используйте эти слова. "the", часто могут использоваться как границы. Такие границы выражений обычно "отрицательны", в некотором смысле, что они разделяют два экземпляра токена, которые обязательно не будут включены в одно и то же выражение. Несколько положительных границ - это цитаты, цитаты. Этот тип информации может быть полезен для отфильтровывания некоторых n-граммов (см. следующий параграф). Кроме того, в качестве выражения могут использоваться секвенсоры слов, такие как "например" или "вместо" или "необходимость" границы (но использование такой информации касается использования "priors", о котором я расскажу позже).

Без использования внешних данных (кроме входного текста) вы можете иметь относительный успех с этим, запустив статистику текстовых диграмм и триграмм (последовательность из 2 и 3 последовательных слов). Затем [большинство] последовательности со значительным числом (*) экземпляров, скорее всего, будут типом "выражения/фразы", ​​который вы ищете.
Этот несколько грубый метод даст несколько ложных срабатываний, но в целом может быть работоспособным. Отфильтрованные n-граммы, известные как пересекающие "границы", как намечено в первом абзаце, могут значительно помочь, потому что в естественных языках окончание предложения и начало предложений имеют тенденцию основываться на ограниченном подмножестве пространства сообщений и, следовательно, создавать комбинации токена, которые могут как представляется, статистически хорошо представлены, но которые, как правило, не связаны семантически.

Более эффективные методы (возможно, более дорогостоящие, обработанные и проектируемые/инвестиционные) будут использовать дополнительные "приоритеты", относящиеся к домену и/или национальным языкам ввода текст.

  • теги POS (Part-Of-Speech) весьма полезны несколькими способами (предоставляет дополнительные, более объектные границы выражения, а также классы "шума" слов, например, все статьи, даже если они используются в контексте сущностей, обычно имеют мало в облаках тегов, которые OP хочет создать.
  • Словари, лексиконы и тому подобное могут быть весьма полезными. В частности, те, которые идентифицируют "сущности" (например, экземпляры WordNet lingo) и их альтернативные формы. Сущности очень важны для облаков тегов (хотя они не являются единственным классом слов, найденных в них), и, идентифицируя их, также возможно их нормализовать (множество различных выражений, которые можно использовать, например, "Сенатор Т. Kennedy" ), следовательно, исключают дубликаты, но также увеличивают частоту базовых объектов.
  • Если корпус структурирован как сборник документов, может оказаться полезным использовать различные трюки, связанные с TF (Term Frequency) и IDF (Inverse Document Frequency).

[Извините, теперь вам нужно идти (плюс хотелось бы больше деталей из ваших конкретных целей и т.д.). Я попытаюсь представить более подробные сведения и пункты позже]

[BTW, я хочу подключить сюда ответы Джонатана Фейнберга и Дервина Тонка из этой публикации, поскольку они обеспечивают отличные указатели с точки зрения методов и инструментов для такого рода задач. В частности, NTLK и Python-at-large обеспечивают отличную основу для экспериментов]

Ответ 2

Я бы начал с замечательной главы Peter Norvig в книге O'Reilly Красивые данные. Он предоставляет нужные вам данные ngram вместе с красивым кодом Python (который может решить ваши проблемы как есть или с некоторыми изменениями)

Ответ 3

Похоже, вы ищете извлечение коллокации. Мэннинг и Schütze посвящают главе тему, объясняя и оценивая "предложенные формулы" , упомянутые в статье Википедии, с которой я связан.

Я не могу вместить всю главу в этот ответ; надеюсь, некоторые из их ссылки помогут. (NSP звучит особенно apposite.) nltk имеет модуль collocations тоже, не упомянутые Мэннинг и Шютце, так как их книга предшествует этому.

Другие ответы, опубликованные до сих пор, касаются обработки статистического языка и n-граммов в целом; коллокации - это определенная подтема.

Ответ 4

Сделайте матрицу для слов. Затем, если есть два последовательных слова, добавьте их в соответствующую ячейку.

For example you have this sentence.

mat['for']['example'] ++;
mat['example']['you'] ++;
mat['you']['have'] ++;
mat['have']['this'] ++;
mat['this']['sentence'] ++;

Это даст вам значения для двух последовательных слов. Вы можете сделать это слово и тремя словами. Помните, что для этого требуется память O (n ^ 3).

Вы также можете использовать кучу для хранения таких данных, как:

heap['for example']++;
heap['example you']++;

Ответ 5

Один из способов - создать себе автомат. скорее всего, недетерминированный конечный автомат (NFA). NFA

Еще один простой способ - создать файл, содержащий слова и/или группы слов, которые вы хотите игнорировать, находить, сравнивать и т.д. и хранить их в памяти при запуске программы, а затем вы можете сравнить файл, который вы разбираете с группами слов/слов, которые содержатся в файле.