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

Необходимо быть осторожными с наследованием:

>>> class Foo:
    def __eq__(self, other):
        if isinstance(other, self.__class__):
            return self.__dict__ == other.__dict__
        else:
            return False

>>> class Bar(Foo):pass

>>> b = Bar()
>>> f = Foo()
>>> f == b
True
>>> b == f
False

Проверка вводит более строго, как это:

def __eq__(self, other):
    if type(other) is type(self):
        return self.__dict__ == other.__dict__
    return False

Помимо этого, Ваш подход будет хорошо работать, это - то, для чего специальные методы там.

43
задан mjv 29 October 2009 в 16:40
поделиться

5 ответов

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

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

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

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

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

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

34
ответ дан 26 November 2019 в 23:05
поделиться

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

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

0
ответ дан 26 November 2019 в 23:05
поделиться

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

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

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

8
ответ дан 26 November 2019 в 23:05
поделиться

Я бы начал с замечательной главы, написанной Питер Норвиг , в книге О'Рейли Beautiful Data . Он предоставляет необходимые вам данные ngram вместе с красивым кодом Python (который может решить ваши проблемы как есть или с некоторыми изменениями) на своем личном веб-сайте .

11
ответ дан 26 November 2019 в 23:05
поделиться

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

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']++;
0
ответ дан 26 November 2019 в 23:05
поделиться
Другие вопросы по тегам:

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