Короче
Ваш проект немного чересчур амбициозен.
Кроме того, попробуйте задать более конкретные вопросы по Stackoverflow. Сосредоточьтесь на том, чтобы узнать, что не так, и объясните, какая помощь вам потребуется. Это поможет людям помочь вам лучше.
В длинном
Давайте попробуем разбить ваши требования:
Я пытаюсь создать программу на python, которая будет делать заметки в отрывке, который я ввожу.
Не уверен, что это действительно означает ...
Будет отсортировано первое и последнее предложение абзаца ...
Оригинальный код в оригинальном сообщении (OP) не имеет никаких проверок на даты / цифры.
Во-первых, вам нужно определить что такое предложение?
- Что считается границей предложения?
- Как вы собираетесь обнаруживать предложения из абзаца.
Возможно, nltk.sent_tokenize
поможет:
from nltk import sent_tokenize
text = """Gwaha-ju (과하주; 過夏酒; literally "summer-passing wine") is a traditional Korean fortified rice wine. The refined rice wine cheongju (also called yakju) is fortified by adding the distilled spirit soju to produce gwaha-ju. Gwaha-baekju was first mentioned in Sanga Yorok, a mid-15th century cookbook, but the rice wine was made without fortification. The earliest recorded recipe for fortified gangha-ju appears in Eumsik dimibang, a 1670 cookbook. Other Joseon books that mention the fortified rice wine include Jubangmun, Chisaeng yoram, Yeokjubangmun, Eumsikbo, Sallim gyeongje, Jeungbo sallim gyeongje, Gyuhap chongseo, and Imwon gyeongjeji."""
sent_tokenize(text)
... и предложения с датами и числами.
Хммм .. вот как насчет проверки цифр в строке каждого предложения:
from nltk import sent_tokenize
text = """Gwaha-ju (과하주; 過夏酒; literally "summer-passing wine") is a traditional Korean fortified rice wine. The refined rice wine cheongju (also called yakju) is fortified by adding the distilled spirit soju to produce gwaha-ju. Gwaha-baekju was first mentioned in Sanga Yorok, a mid-15th century cookbook, but the rice wine was made without fortification. The earliest recorded recipe for fortified gangha-ju appears in Eumsik dimibang, a 1670 cookbook. Other Joseon books that mention the fortified rice wine include Jubangmun, Chisaeng yoram, Yeokjubangmun, Eumsikbo, Sallim gyeongje, Jeungbo sallim gyeongje, Gyuhap chongseo, and Imwon gyeongjeji."""
for sent in sent_tokenize(text):
if any(ch for ch in sent if ch.isdigit()):
print(sent)
Затем он заменит некоторые слова ...
Тогда вам нужно определить что такое слово?
- Как вы определяете границу слова?
- Это не будет одинаковым для разных языков
Может быть с nltk.word_tokenize
, например,
from nltk import sent_tokenize, word_tokenize
text = """Gwaha-ju (과하주; 過夏酒; literally "summer-passing wine") is a traditional Korean fortified rice wine. The refined rice wine cheongju (also called yakju) is fortified by adding the distilled spirit soju to produce gwaha-ju. Gwaha-baekju was first mentioned in Sanga Yorok, a mid-15th century cookbook, but the rice wine was made without fortification. The earliest recorded recipe for fortified gangha-ju appears in Eumsik dimibang, a 1670 cookbook. Other Joseon books that mention the fortified rice wine include Jubangmun, Chisaeng yoram, Yeokjubangmun, Eumsikbo, Sallim gyeongje, Jeungbo sallim gyeongje, Gyuhap chongseo, and Imwon gyeongjeji."""
for sent in sent_tokenize(text):
if any(ch for ch in sent if ch.isdigit()):
print(word_tokenize(sent))
Затем некоторые слова заменяются синонимами,
Не уверен, какое слово вы хотите заменить синонимами, и какие синонимы вы выберете. Но обратите внимание, что WordNet не совсем хороший тезаурус.
Каждое слово имеет разные значения, и в WordNet связаны только значения, а не слова, см. https://stackoverflow.com/a/19383914/610569
например. дано слово "вино":
from nltk.corpus import wordnet as wn
for synset in wn.synsets('wine'): # each meaning for the word, aka. synset
print(synset)
print('Words with same meaning:', synset.lemma_names(), '\n')
Как узнать, какой набор / значение использовать?
Это открытый вопрос. Он также известен как Устранение неоднозначности слов (WSD) .
Если вы просто сгладите и будете использовать названия лемм всех синтаксисов, «синонимы» или замена, которую вы хотите сделать, не будут иметь смысла. Например.
from itertools import chain
from nltk.corpus import wordnet as wn
from nltk import sent_tokenize, word_tokenize
text = """Gwaha-ju (과하주; 過夏酒; literally "summer-passing wine") is a traditional Korean fortified rice wine. The refined rice wine cheongju (also called yakju) is fortified by adding the distilled spirit soju to produce gwaha-ju. Gwaha-baekju was first mentioned in Sanga Yorok, a mid-15th century cookbook, but the rice wine was made without fortification. The earliest recorded recipe for fortified gangha-ju appears in Eumsik dimibang, a 1670 cookbook. Other Joseon books that mention the fortified rice wine include Jubangmun, Chisaeng yoram, Yeokjubangmun, Eumsikbo, Sallim gyeongje, Jeungbo sallim gyeongje, Gyuhap chongseo, and Imwon gyeongjeji."""
for sent in sent_tokenize(text):
if any(ch for ch in sent if ch.isdigit()):
for word in word_tokenize(sent):
lemma_names = set(chain(*[synset.lemma_names() for synset in wn.synsets(word)]))
# If you just flatten and use the lemma names of all synset,
# the "synonyms" or replacement you want to make won't make sense.
print(word, '\t', lemma_names)
... и избавиться от бесполезных прилагательных.
Хммм, для этого потребуется еще один фрагмент POS-тегов вызова процесса NLP, и он не идеален.
Возможно, вы можете попробовать nltk.pos_tag
, но не ожидайте слишком многого от него (с точки зрения точности), например,
from itertools import chain
from nltk.corpus import wordnet as wn
from nltk import sent_tokenize, word_tokenize, pos_tag
text = """Gwaha-ju (과하주; 過夏酒; literally "summer-passing wine") is a traditional Korean fortified rice wine. The refined rice wine cheongju (also called yakju) is fortified by adding the distilled spirit soju to produce gwaha-ju. Gwaha-baekju was first mentioned in Sanga Yorok, a mid-15th century cookbook, but the rice wine was made without fortification. The earliest recorded recipe for fortified gangha-ju appears in Eumsik dimibang, a 1670 cookbook. Other Joseon books that mention the fortified rice wine include Jubangmun, Chisaeng yoram, Yeokjubangmun, Eumsikbo, Sallim gyeongje, Jeungbo sallim gyeongje, Gyuhap chongseo, and Imwon gyeongjeji."""
for sent in sent_tokenize(text):
if any(ch for ch in sent if ch.isdigit()):
for word, tag in pos_tag(word_tokenize(sent)):
if not tag.startswith('JJ'): # JJ* refers to adjective.
print(word)
print('-----')
Я знаю общие вещи с python, но я новичок в nltk и WordNet. Я запустил программу-прототип, которая заменит слова в предложении всеми случайными синонимами,
Так держать! Не отчаивайтесь, и я думаю, что начинать с цели создания приложения - не самое подходящее место для начала работы с NLP, попробуйте вместо этого:
однако я получаю сообщение об ошибке, в котором говорится, что с WordNet что-то не так. Я думаю, что установил это правильно, но я могу ошибаться.
Да, с установкой все в порядке.
Возможно, использование WordNet API в NLTK поможет вам понять, как и что может делать WordNet: http://www.nltk.org/howto/wordnet.html
Кроме того, улучшение базового Python и понимание, почему происходит AttributeError
, очень помогло бы =)