Как найти словосочетания в тексте, python - PullRequest
4 голосов
/ 09 ноября 2010

Как вы находите словосочетания в тексте?Коллокация - это последовательность слов, которая встречается вместе необычно часто.В Python есть встроенные функциональные биграммы, которые возвращают пары слов.

>>> bigrams(['more', 'is', 'said', 'than', 'done'])
[('more', 'is'), ('is', 'said'), ('said', 'than'), ('than', 'done')]
>>>

Осталось найти биграммы, которые встречаются чаще на основе частоты отдельных слов.Любые идеи, как положить это в коде?

Ответы [ 5 ]

8 голосов
/ 09 ноября 2010

Попробуйте NLTK . В основном вас заинтересует nltk.collocations.BigramCollocationFinder, но вот небольшая демонстрация, которая покажет вам, с чего начать:

>>> import nltk
>>> def tokenize(sentences):
...     for sent in nltk.sent_tokenize(sentences.lower()):
...         for word in nltk.word_tokenize(sent):
...             yield word
... 

>>> nltk.Text(tkn for tkn in tokenize('mary had a little lamb.'))
<Text: mary had a little lamb ....>
>>> text = nltk.Text(tkn for tkn in tokenize('mary had a little lamb.'))

В этом небольшом сегменте нет ни одного, но здесь идет речь:

>>> text.collocations(num=20)
Building collocations list
3 голосов
/ 09 ноября 2010
import itertools
from collections import Counter
words = ['more', 'is', 'said', 'than', 'done']
nextword = iter(words)
next(nextword)
freq=Counter(zip(words,nextword))
print(freq)
3 голосов
/ 09 ноября 2010

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

from itertools import izip
words = ["more", "is", "said", "than", "done", "is", "said"]
words_iter = iter(words)
next(words_iter, None)
count = {}
for bigram in izip(words, words_iter):
    count[bigram] = count.get(bigram, 0) + 1
print sorted(((c, b) for b, c in count.iteritems()), reverse=True)

(words_iter введен, чтобы избежать копирования всего списка слов, как вы это сделали бы в izip(words, words[1:])

2 голосов
/ 09 ноября 2010

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

Очки, которые вы, кажется, игнорируете:

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

(2) n может быть больше 2 ... например анализ текстов, написанных о китайской истории 20-го века, приведёт к появлению «значительных» биграмм, таких как «Мао Цзэ» и «Цзэ Тун».

Чего вы на самом деле пытаетесь достичь? Какой код вы написали до сих пор?

0 голосов
/ 18 декабря 2017

Согласитесь с Тимом Макнамара на использование nltk и проблемы с юникодом. Тем не менее, мне очень нравится текстовый класс - есть хак, который вы можете использовать, чтобы получить словосочетания в виде списка, я обнаружил его, глядя на исходный код . Очевидно, всякий раз, когда вы вызываете метод collocations, он сохраняет его как переменную класса!

    import nltk
    def tokenize(sentences):
        for sent in nltk.sent_tokenize(sentences.lower()):
            for word in nltk.word_tokenize(sent):                 
                yield word


    text = nltk.Text(tkn for tkn in tokenize('mary had a little lamb.'))
    text.collocations(num=20)
    collocations = [" ".join(el) for el in list(text._collocations)]

наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...