Как найти слово — Первая буква будет заглавной, а другая будет ниже

#python #python-3.x #nlp

#python #python-3.x #nlp

Вопрос:

Постановка задачи: Отфильтруйте эти слова из полного набора text6, имея первую букву в верхнем регистре, а все остальные буквы в нижнем регистре. Сохраните результат в переменной title_words. выведите количество слов, присутствующих в title_words.

Я перепробовал все возможные способы найти ответ, но не знаю, где я отстаю.

 import nltk
from nltk.book import text6
title_words = 0
for item in set(text6):
    if item[0].isupper() and item[1:].islower():
        title_words  = 1
print(title_words)
  

Я тоже пробовал таким образом:

 title_words = 0
for item in text6:
    if item[0].isupper() and item[1:].islower():
        title_words  = 1
print(title_words)
  

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

Комментарии:

1. Вы пробовали распечатывать некоторые item буквы в set(text6) ? Как насчет печати некоторых из них и было ли ваше if условие true или false. Управляйте C и просмотрите его вручную, чтобы увидеть, ведет ли он себя так, как вы ожидаете. (Как насчет слов, которые являются просто пунктуацией?)

2. @khelwood, 🙁 Я пытался добавить эти элементы в список и проверил список вручную, но это не работает. Что-то не так в моем коде или я упускаю что-то важное?

Ответ №1:

Одно из приведенных выше предложений сработало для меня. Пример кода ниже.

 title_words = [word for word in text6 if (len(word)==1 and word[0].isupper()) or (word[0].isupper() and word[1:].islower()) ]
print(len(title_words))
  

Комментарии:

1. что вы имели в виду, говоря «приведенные выше предложения»? В вашем ответе нет ничего выше.

Ответ №2:

Я думаю, проблема в set(text6) . Я предлагаю вам повторить text6.tokens .

Обновление, объяснение

Приведенный вами код верен.

Проблема в том, что текст может содержать одни и те же слова несколько раз. Выполнение set(words) уменьшит общее количество доступных слов, поэтому вы начнете с неполного набора данных.

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

Комментарии:

1. @Lucifer Я обновил ответ объяснением. Надеюсь, это поможет вам! 🙂

Ответ №3:

В вопросе «Сохраните результат в переменной title_words. выведите количество слов, присутствующих в title_words.»

Результатом фильтрации списка элементов является список элементов того же типа. В вашем случае фильтрация списка text6 (при условии, что это список строк) приведет к (меньшему) списку строк. Вашей title_words переменной должен быть этот отфильтрованный список, а не количество строк; количество строк будет просто длиной списка.

Это также неоднозначно из вопроса, следует ли отфильтровывать слова с заглавной буквы (т. Е. удалено из меньшего списка) или отфильтровано (т.Е. сохранено в списке), поэтому попробуйте оба варианта, чтобы увидеть, неправильно ли вы их интерпретируете.

Ответ №4:

Попробуйте использовать регулярные выражения:

 >>> import re
>>> from nltk.book import text6
>>>
>>> text = ' '.join(set(text6))
>>> title_words = re.findall(r'([A-Z]{1}[a-z] )', text)
>>> len(title_words)
461
  

Комментарии:

1. Спасибо @constt за постоянные усилия и обновления. Ценю это. Но все равно это не решает проблему. Поверьте мне, я скопировал вставленную задачу без каких-либо изменений. В любом случае спасибо

Ответ №5:

В text6 есть 50 одноэлементных элементов (элементов длиной один), однако ваш код не передаст ни один из них как успешный, например, ‘I’ или ‘W’ и т.д. Это правильно, или вам нужны слова минимальной длины 2?

Комментарии:

1. 🙁 Пробовал и это len (item) > 1 или 2, но все равно безрезультатно. Иногда я думаю, что лучше сдаться. 🙂 Много дней я пытаюсь, и сегодня я пробовал со всеми присутствующими здесь людьми, но это не проходит. 🙂 Спасибо, брат. Сейчас я сдаюсь.

2. Вы пытались включить все слова длиной = 1, которые также пишутся с заглавной буквы? Не беспокойтесь, если вы двигаетесь дальше, однако, будьте осторожны.

Ответ №6:

Всего несколько изменений в соответствии с тем, что задает вопрос.

 from nltk.book import text6
title_words = []
for item in set(text6):
    if item[0].isupper() and item[1:].islower():
        title_words.append(item)
print(len(title_words))
  

Ответ №7:

Попробуйте это:

 title_words = [ word for word in text6 if word.istitle()]

print(len(title_words))