Изменить с re.findall (регулярное выражение, текст) на nltk.Text.findall (регулярное выражение) - PullRequest
2 голосов
/ 05 января 2012

Используя Python и NLTK, я написал регулярное выражение для поиска слов, начинающихся с заглавной буквы в тексте, но не в начале предложения.

Первоначально я использовал его следующим образом:

[w for w in text if re.findall(r'(?<!\.\s)\b[A-Z][a-z]\b',w)]

переменный текст создается с использованием набора древовидной структуры следующим образом:

 >>> def concat(lists):
    biglist = [ ]
    while len(lists)>0:
        biglist = biglist+lists[0]
        lists=lists[1:]
    return biglist
>>> tbsents = concat(treebank.sents()[200:250])
>>> text = nltk.Text(tbsents)

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

>>> text.findall("<[A-Z][a-z]{3,}>")

Проблема, с которой я столкнулся, заключается в том, что я не могу получить первый бит регулярного выражения в формате <..>, необходимый для второй функции, и, если я это сделаю, будет ли он вообще работать или я неправильно понял подходит?

Спасибо.

1 Ответ

2 голосов
/ 06 января 2012

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

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

import itertools
non_starting_words = list(itertools.chain(*[s[1:] for s in treebank.sents()]))
uppercase_words = [w for w in non_starting_words if w[0].isupper()]

Возможно, это то, что вы хотели сделать с функцией «concat», но это только что получилсписок всех слов - он не удаляет первое из каждого предложения.Если вы хотите объединить список списков, гораздо лучший способ - сделать список (itertools.chain (* lists)), который я делал выше.

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

punctuation_marks = ".!?"
first_word = True
uppercase_words = []

for w in text:
    if not first_word and re.match("[A-Z][a-z]*$", w):
        uppercase_words.append(w)
    first_word = w in punctuation_marks

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