学習編:ニュース要約抽出アルゴリズム
1644 ワード
ニュースダイジェストコンテンツ抽出のアルゴリズムは次のとおりです.
1.アルゴリズムによるテキスト中の単語の計算の重要性に従い、しきい値に合致するものをキーワードとする
2.文の中の単語の重要性によって文に重要性を計算する
3.文の重要度に応じて並べ替える
4.top-k文を要約として取り出す
準備:
ここでpunctuationとnlargestについてお話しします.
punctuationは、英語の句読点と記号を含むリストです.
nlargest()関数は,スタックソート方式で1つの容器の中で最大のn個の数字を迅速に求めることができる.
ステップ1:
単語の重要度の計算:
ステップ2:
計算文の重要性:
手順3:
並べ替え:
1.アルゴリズムによるテキスト中の単語の計算の重要性に従い、しきい値に合致するものをキーワードとする
2.文の中の単語の重要性によって文に重要性を計算する
3.文の重要度に応じて並べ替える
4.top-k文を要約として取り出す
準備:
from nltk.tokenize import sent_tokenize,word_tokenize
from nltk.corpus import stopwords
from collections import defaultdict
from string import punctuation
from heapq import nlargest
stopwords = set(stopwords.words('english') + list(punctuation))
max_cut = 0.9
min_cut = 0.1
ここでpunctuationとnlargestについてお話しします.
punctuationは、英語の句読点と記号を含むリストです.
nlargest()関数は,スタックソート方式で1つの容器の中で最大のn個の数字を迅速に求めることができる.
ステップ1:
単語の重要度の計算:
def compute_frequencies(word_sent):
freq = defaultdict(int)
for s in word_sent:
for word in s:
if word not in stopwords:
freq[word] += 1
m = float(max(freq.values()))
for w in freq.keys():
freq[w] /= m
if freq[w] >= max_cut or freq[w] <= min_cut:
del freq[w]
return freq
ステップ2:
計算文の重要性:
def summarize(text,n):
sents = sent_tokenize(text)
assert n <= len(sents)
word_sent = [word_tokenize(s.lower()) for s in sents]
freq = compute_frequencies(word_sent)
ranking = defaultdict(int)
for i ,word in enumerate(word_sent):
for w in word:
if w in freq:
ranking[i] += freq[w]
sents_idx = rank(ranking,n)
return [sents[j] for j in sents_idx]
手順3:
並べ替え:
def rank(ranking,n):
return nlargest(n,ranking,key=ranking.get)