import sys
import nltk
from sklearn.feature_extraction.text import TfidfVectorizer
# 获取文章摘要
# 一旦有了no_of_nouns和no_of_ners分数的列表,就可以利用这些分数,创建更复杂的规则。
# 例如,一个典型的新闻报道将从相关话题的重要细节开始,最后一句话是整个故事的总结
f = open('nyt.txt', 'r')
news_contents = f.read()
result = []
# 句子标记解析
for sent_no, sentence in enumerate(nltk.sent_tokenize(news_contents)):
no_tokens_of = len(nltk.word_tokenize(sentence)) # 单词标记解析
tagged = nltk.pos_tag(nltk.word_tokenize(sentence)) # 词性标注
no_of_nouns = len([word for word, pos in tagged if pos in ['NN', 'NNP']]) # 获取所有名词
ners = nltk.ne_chunk(nltk.pos_tag(nltk.word_tokenize(sentence)), binary=False) # 命名实体识别
no_of_ners = len([chunk for chunk in ners if hasattr(chunk, 'label')])
score = (no_of_ners + no_of_nouns)/float(no_tokens_of)
result.append((sent_no, no_tokens_of, no_of_ners, no_of_nouns, score, sentence))
for sent in sorted(result, key=lambda x: x[4], reverse=True):
print(sent[5])
print(result)
# 这种摘要的另一个理论是重要的句子通常包含重要的单词,在整个语料库中,大部分判别性的单词都非常重要。
# 包含了判别性强的单词的句子也非常重要。一个非常简单的测量方法是计算各个单词的TF-IDF(词频-逆文件频率)的分数,
# 然后寻找由重要单词归一化得到的平均分数。可以将此平均分数作为标准,选择摘要句子。
# tf/idf
# from sklearn.feature_extraction.text import TfidfVectorizer
results = []
sentences = nltk.sent_tokenize(news_contents)
vectize = TfidfVectorizer(norm='l2', min_df=0, use_idf=True, smooth_idf=False, sublinear_tf=True)
sklearn_binary = vectize.fit_transform(sentences)
# print(countvectorizer.get_feature_names())
print(sklearn_binary.toarray())
for i in sklearn_binary.toarray():
results.append(i.sum() / float(len(i.nonzero()[0])))
# 机器翻译