Любой эффективный способ извлечь ключевую фразу из заданных предложений с TF-IDF?
Я пытаюсь извлечь ключевую фразу из данного предложения с помощью схемы TF-IDF. Чтобы сделать это, я попытался найти слово-кандидат или фразу-кандидат в предложении, а затем использовать слово "часто" в предложении. Тем не менее, когда я представил новый CFG
Правило для поиска возможных ключевых фраз в предложении, у меня ошибка.
Вот мой сценарий:
rm_punct=re.compile('[{}]'.format(re.escape(string.punctuation)))
stop_words=set(stopwords.words('english'))
def get_cand_words(sent, cand_type='word', remove_punct=False):
candidates=list()
sent=rm_punct.sub(' ', sent)
tokenized=word_tokenize(sent)
tagged_words=pos_tag(tokenized)
if cand_type=='word':
pos_tag_patt=tags = set(['JJ', 'JJR', 'JJS', 'NN', 'NNP', 'NNS', 'NNPS'])
tagged_words=chain.from_iterable(tagged_words)
for word, tag in enumerate(tagged_words):
if tag in pos_tag_patt and word not in stop_words:
candidates.append(word)
elif cand_type == 'phrase':
grammar = r'KT: {(<JJ>* <NN.*>+ <IN>)? <JJ>* <NN.*>+}'
chunker = RegexpParser(grammar)
all_tag = chain.from_iterable([chunker.parse(tag) for tag in tagged_words])
for key, group in groupby(all_tag, lambda tag: tag[2] != 'O'):
candidate = ' '.join([word for (word, pos, chunk) in group])
if key is True and candidate not in stop_words:
candidates.append(candidate)
else:
print("return word or phrase as target phrase")
return candidates
Вот ошибка, которая возникла в Python:
sentence_1="Hillary Clinton agrees with John McCain by voting to give George Bush the benefit of the doubt on Iran."
sentence_2="The United States has the highest corporate tax rate in the free world"
get_cand_words(sent=sentence_1, cand_type='phrase', remove_punct=False)
ValueError: chunk structures must contain tagged tokens or trees
Я вдохновил приведенный выше код, основываясь на извлечении ключевых фраз из длинного текстового абзаца, моя цель - найти уникальную ключевую фразу в данном предложении, но приведенная выше реализация не работает хорошо.
Как я могу исправить эту ошибку? Как сделать так, чтобы вышеуказанная реализация работала для извлечения ключевой фразы из данного предложения или списка предложений? Есть ли лучшая идея, чтобы это произошло? есть еще мысли? Спасибо
Цель:
Я хочу найти наиболее подходящую фразу из существительного-прилагательного или сложную фразу из существительного-прилагательного из данного предложения. Как я могу сделать это в Python? Кто-нибудь знает, как это сделать? заранее спасибо
1 ответ
Можете ли вы попробовать с этим кодом?
rm_punct=re.compile('[{}]'.format(re.escape(string.punctuation)))
stop_words=set(stopwords.words('english'))
def get_cand_words(sent, cand_type='word', remove_punct=False):
import nltk
candidates=list()
sent=rm_punct.sub(' ', sent)
tokenized=word_tokenize(sent)
tagged_words=pos_tag(tokenized)
if cand_type=='word':
pos_tag_patt=tags = set(['JJ', 'JJR', 'JJS', 'NN', 'NNP', 'NNS', 'NNPS'])
tagged_words=chain.from_iterable(tagged_words)
for word, tag in enumerate(tagged_words):
if tag in pos_tag_patt and word not in stop_words:
candidates.append(word)
elif cand_type == 'phrase':
grammar = r'KT: {(<JJ>* <NN.*>+ <IN>)? <JJ>* <NN.*>+}'
chunker = RegexpParser(grammar)
tagged_words=nltk.pos_tag_sents(nltk.word_tokenize(text) for text in nltk.sent_tokenize(sent))
all_tag = list(chain.from_iterable(nltk.chunk.tree2conlltags(chunker.parse(tagged_word)) for tagged_word in tagged_words))
for key, group in groupby(all_tag, lambda tag: tag[2] != 'O'):
candidate = ' '.join([word for (word, pos, chunk) in group])
if key is True and candidate not in stop_words:
candidates.append(candidate)
else:
print("return word or phrase as target phrase")
return candidates