├── TextRank ├── __init__.py ├── const.py ├── textPro.py ├── textRank.py ├── utils.py └── statics │ └── stopwords.txt └── README.md /TextRank/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_coding:utf-8 _*_ 3 | # @Time    :2020/4/4 19:14 4 | # @Author  :Abner Wong 5 | # @Software: PyCharm -------------------------------------------------------------------------------- /TextRank/const.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_coding:utf-8 _*_ 3 | # @Time    :2020/4/2 18:55 4 | # @Author  :Abner Wong 5 | # @Software: PyCharm 6 | import os 7 | 8 | module_path = os.path.dirname(__file__) 9 | 10 | STOPWORDS = list() 11 | with open(module_path+'/statics/stopwords.txt', 'r', encoding='utf-8') as f: 12 | for w in f.readlines(): 13 | STOPWORDS.append(w.strip()) 14 | 15 | PROPERTY_FILTER = ['an', 'i', 'j', 'l', 'n', 'nr', 'nrfg', 'ns', 'nt', 'nz', 't', 'v', 'vd', 'vn', 'eng'] 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # textrank 2 | 基于TextRank算法实现中文文本的关键词提取和摘要任务,核心计算代码保持与论文一致。 3 | 4 | ## 原理 5 | 6 | TextRank的论文: 7 | 8 | > Mihalcea R, Tarau P. TextRank: Bringing order into texts[C]. Association for Computational Linguistics, 2004. 9 | ___ 10 | ## 依赖 11 | +jieba >= 0.35 12 | +numpy >= 1.7.1 13 | 14 | ___ 15 | ## 示例 16 | 17 | ```python 18 | from TextRank import textRank 19 | 20 | text = """欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,\ 21 | 并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展。格拉济耶夫说,中国依靠治理体系与全国人民协同努力,\ 22 | 在抗疫工作上取得极大成效。中国采取的措施符合全球利益。格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密,\ 23 | 应与中国加强合作,采取协调措施降低此次疫情带来的消极影响。格拉济耶夫建议,面对疫情,欧亚经济联盟与中国扩大信息技术应用,\ 24 | 推进商品清关程序自动化,更广泛地利用相关机制,为对外经济活动参与者建立绿色通道。谈及双方在医学卫生领域的合作时,\ 25 | 格拉济耶夫说:“我们应从当前考验中汲取经验,在生物安全领域制定共同规划并联合开展生物工程研究。”格拉济耶夫还表示,\ 26 | 俄罗斯与其他欧亚经济联盟国家金融市场更易受国际投机行为影响。欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接。\ 27 | 欧亚经济联盟成立于2015年,成员国包括俄罗斯、哈萨克斯坦、白俄罗斯、吉尔吉斯斯坦和亚美尼亚。欧亚经济委员会执委会是欧亚经济联盟最高权力机构。""" 28 | 29 | T = textRank.TextRank(text,pr_config={'alpha': 0.85, 'max_iter': 100}) 30 | 31 | # 提取前10个关键词 32 | T.get_n_keywords(10) 33 | 34 | # 提取前3个句子作为摘要 35 | 36 | ``` 37 | 38 | ## 输出 39 | 40 | ```plain 41 | # 关键词 42 | [('中国', 0.0409732016371885), 43 | ('欧亚', 0.020288574056379977), 44 | ('联盟', 0.020095514492593516), 45 | ('疫情', 0.01896670992106251), 46 | ('合作', 0.01762300199967477), 47 | ('经济', 0.017491198051334592), 48 | ('加强', 0.014129557788440673), 49 | ('金融市场', 0.013893142456055885), 50 | ('体系', 0.012966637917644607), 51 | ('俄罗斯', 0.012933808546504099)] 52 | 53 | # 句子 54 | 55 | [('欧亚经济委员会执委会一体化与宏观经济委员格拉济耶夫日前接受新华社记者采访时高度评价中国抗击新冠疫情工作,并表示期待欧亚经济联盟与中国加强抗疫合作,共同推动地区发展', 56 | 0.14281076822079067), 57 | ('格拉济耶夫认为,中国经济将会快速恢复,欧亚经济联盟许多企业与中国市场联系紧密,应与中国加强合作,采取协调措施降低此次疫情带来的消极影响', 58 | 0.12857514563980263), 59 | ('欧亚经济联盟应借鉴中国的人民币国际化经验,加强与中国银行体系和金融市场对接', 0.11960701215088403)] 60 | 61 | ``` 62 | -------------------------------------------------------------------------------- /TextRank/textPro.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_coding:utf-8 _*_ 3 | # @Time    :2020/4/2 18:13 4 | # @Author  :Abner Wong 5 | # @Software: PyCharm 6 | 7 | import jieba.posseg as pseg 8 | 9 | import re 10 | from .const import STOPWORDS, PROPERTY_FILTER 11 | 12 | SENTENCE_SP_PATTERN = re.compile(r"。|\.|!|\!|?|\?|;") 13 | 14 | 15 | class Text: 16 | def __init__(self, text, use_property, no_stopwords): 17 | """ 18 | 19 | :param text: 20 | :param use_property: 是否根据词性进行筛选 21 | :param no_stopwords: 是否去停用词 22 | """ 23 | 24 | if not isinstance(text, str): 25 | raise ValueError('text type must be str!') 26 | elif text is None: 27 | raise ValueError('text should not be none!') 28 | 29 | self.sents = self._sentence_split(text) 30 | self.words_pro = self._get_words(self.sents, use_property, no_stopwords) 31 | 32 | def _get_words(self, sents, use_property, no_stopwords): 33 | 34 | words = list() 35 | 36 | if len(sents) < 1: 37 | return None 38 | 39 | for s in sents: 40 | cut_s = pseg.cut(s) 41 | if use_property: 42 | cut_s = [w for w in cut_s if w.flag in PROPERTY_FILTER] 43 | else: 44 | cut_s = [w for w in cut_s] 45 | 46 | cut_s = self._clean_words(cut_s) 47 | if no_stopwords: 48 | cut_s = [w.strip() for w in cut_s if w.strip() not in STOPWORDS] 49 | words.append(cut_s) 50 | 51 | return words 52 | 53 | @staticmethod 54 | def _sentence_split(text): 55 | sents = [i.strip() for i in SENTENCE_SP_PATTERN.split(text) if i != '' ] 56 | return sents 57 | 58 | @staticmethod 59 | def _clean_words(sent): 60 | w_ls = [w.word.strip() for w in sent if w.flag != 'x'] 61 | w_ls = [word for word in w_ls if len(word) > 0] 62 | return w_ls 63 | 64 | -------------------------------------------------------------------------------- /TextRank/textRank.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_coding:utf-8 _*_ 3 | # @Time    :2020/4/2 19:36 4 | # @Author  :Abner Wong 5 | # @Software: PyCharm 6 | 7 | from .textPro import Text 8 | from . import utils 9 | 10 | from collections import Counter 11 | 12 | 13 | class TextRank(Text): 14 | 15 | def __init__(self, 16 | text=None, windows=2, 17 | use_property=True, no_stopwords=True, 18 | pr_config={'alpha': 0.85, 'max_iter': 100}): 19 | super(TextRank, self).__init__(text, use_property, no_stopwords) 20 | 21 | self.pr_config = pr_config 22 | self.windows = windows 23 | self.word_index, self.index_word, self.word_num = utils.words_info(self.words_pro) 24 | self.sorted_words = self._score_items(is_word=True) 25 | self.sorted_sents = self._score_items(is_word=False) 26 | 27 | def _build_adjacency_matrix(self, is_word=True): 28 | 29 | if is_word: 30 | adj_matrix = utils.word_adj_matrix(self.words_pro, 31 | self.windows, 32 | self.word_num, 33 | self.word_index) 34 | else: 35 | adj_matrix = utils.sent_adj_matrix(self.words_pro) 36 | 37 | return adj_matrix 38 | 39 | def _score_items(self, is_word=True): 40 | if is_word: 41 | adj_matrix = self._build_adjacency_matrix(is_word=is_word) 42 | scores = utils.cal_score(adj_matrix, **self.pr_config) 43 | sorted_items = utils.get_sorted_items(scores, self.index_word) 44 | else: 45 | adj_matrix = self._build_adjacency_matrix(is_word=is_word) 46 | scores = utils.cal_score(adj_matrix, **self.pr_config) 47 | index_sent = dict(zip(range(len(self.sents)), self.sents)) 48 | sorted_items = utils.get_sorted_items(scores, index_sent) 49 | 50 | return sorted_items 51 | 52 | def get_n_keywords(self, N): 53 | return self.sorted_words[:N] 54 | 55 | def get_n_sentences(self, N): 56 | return self.sorted_sents[:N] 57 | -------------------------------------------------------------------------------- /TextRank/utils.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # _*_coding:utf-8 _*_ 3 | # @Time    :2020/4/2 19:39 4 | # @Author  :Abner Wong 5 | # @Software: PyCharm 6 | 7 | import numpy as np 8 | import math 9 | 10 | 11 | def words_info(words_list): 12 | """ 13 | :param words_list: 14 | :return: 15 | """ 16 | word_index = dict() 17 | index_word = dict() 18 | word_num = 0 19 | 20 | for index_s, words in enumerate(words_list): 21 | for index_w, word in enumerate(words): 22 | word_index[word] = word_num 23 | index_word[word_num] = word 24 | word_num += 1 25 | 26 | return word_index, index_word, word_num 27 | 28 | 29 | def sents_info(sents_list): 30 | 31 | return dict(zip(range(len(sents_list)), sents_list)) 32 | 33 | 34 | def word_adj_matrix(words_pro, windows, word_num, word_index): 35 | """ 36 | Adjacency Matrix 37 | :param windows: 38 | :return: 39 | """ 40 | def _word_combine(words, window): 41 | """ 42 | Keyword arguments: 43 | :param window: 44 | """ 45 | if window < 2: window = 2 46 | 47 | for x in range(1, window): 48 | if x >= len(words): 49 | break 50 | words2 = words[x:] 51 | res = zip(words, words2) 52 | for r in res: 53 | yield r 54 | 55 | matrix = np.zeros((word_num, word_num)) 56 | 57 | for words in words_pro: 58 | for w1, w2 in _word_combine(words, windows): 59 | if w1 in word_index and w2 in word_index: 60 | index1 = word_index.get(w1) 61 | index2 = word_index.get(w2) 62 | matrix[index1][index2] = 1.0 63 | matrix[index2][index1] = 1.0 64 | 65 | return matrix 66 | 67 | 68 | def sent_adj_matrix(words_pro): 69 | 70 | def _get_similarity(word_ls1, word_ls2): 71 | co_occur_num = len(set(word_ls1) & set(word_ls2)) 72 | if abs(co_occur_num) <= 1e-12: 73 | return 0. 74 | 75 | if len(word_ls1) == 0 or len(word_ls2) == 0: 76 | return 0. 77 | 78 | denominator = math.log(float(len(word_ls1))) + math.log(float(len(word_ls2))) 79 | 80 | if abs(denominator) < 1e-12: 81 | return 0. 82 | 83 | return co_occur_num / denominator 84 | 85 | sentences_num = len(words_pro) 86 | matrix = np.zeros((sentences_num, sentences_num)) 87 | 88 | for x in range(sentences_num): 89 | for y in range(x, sentences_num): 90 | s = _get_similarity(words_pro[x], words_pro[y]) 91 | matrix[x, y] = s 92 | matrix[y, x] = s 93 | return matrix 94 | 95 | 96 | def cal_score(ad_matrix, alpha=0.85, max_iter=100): 97 | 98 | N = len(ad_matrix) 99 | ad_sum = ad_matrix.sum(axis=0).astype(float) 100 | ad_sum[ad_sum == 0.0] = 0.001 101 | ad_matrix = ad_matrix / ad_sum 102 | pr = np.full([N, 1], 1 / N) 103 | 104 | for _ in range(max_iter): 105 | pr = np.dot(ad_matrix, pr) * alpha + (1 - alpha) 106 | pr = pr / pr.sum() 107 | 108 | scores = dict(zip(range(len(pr)), [i[0] for i in pr])) 109 | 110 | return scores 111 | 112 | 113 | def get_sorted_items(scores, index_items): 114 | """ 115 | :param scores: 116 | :param index_items: 117 | :return: list[tuple] 118 | """ 119 | items_scores = dict() 120 | for index, score in scores.items(): 121 | items_scores[index_items.get(index)] = score 122 | sorted_items = sorted(items_scores.items(), key=lambda item: item[1], reverse=True) 123 | return sorted_items 124 | 125 | 126 | 127 | -------------------------------------------------------------------------------- /TextRank/statics/stopwords.txt: -------------------------------------------------------------------------------- 1 | ? 2 | 、 3 | 。 4 | “ 5 | ” 6 | 《 7 | 》 8 | ! 9 | , 10 | : 11 | ; 12 | ? 13 | 啊 14 | 阿 15 | 哎 16 | 哎呀 17 | 哎哟 18 | 唉 19 | 俺 20 | 俺们 21 | 按 22 | 按照 23 | 吧 24 | 吧哒 25 | 把 26 | 罢了 27 | 被 28 | 本 29 | 本着 30 | 比 31 | 比方 32 | 比如 33 | 鄙人 34 | 彼 35 | 彼此 36 | 边 37 | 别 38 | 别的 39 | 别说 40 | 并 41 | 并且 42 | 不比 43 | 不成 44 | 不单 45 | 不但 46 | 不独 47 | 不管 48 | 不光 49 | 不过 50 | 不仅 51 | 不拘 52 | 不论 53 | 不怕 54 | 不然 55 | 不如 56 | 不特 57 | 不惟 58 | 不问 59 | 不只 60 | 朝 61 | 朝着 62 | 趁 63 | 趁着 64 | 乘 65 | 冲 66 | 除 67 | 除此之外 68 | 除非 69 | 除了 70 | 此 71 | 此间 72 | 此外 73 | 从 74 | 从而 75 | 打 76 | 待 77 | 但 78 | 但是 79 | 当 80 | 当着 81 | 到 82 | 得 83 | 的 84 | 的话 85 | 等 86 | 等等 87 | 地 88 | 第 89 | 叮咚 90 | 对 91 | 对于 92 | 多 93 | 多少 94 | 而 95 | 而况 96 | 而且 97 | 而是 98 | 而外 99 | 而言 100 | 而已 101 | 尔后 102 | 反过来 103 | 反过来说 104 | 反之 105 | 非但 106 | 非徒 107 | 否则 108 | 嘎 109 | 嘎登 110 | 该 111 | 赶 112 | 个 113 | 各 114 | 各个 115 | 各位 116 | 各种 117 | 各自 118 | 给 119 | 根据 120 | 跟 121 | 故 122 | 故此 123 | 固然 124 | 关于 125 | 管 126 | 归 127 | 果然 128 | 果真 129 | 过 130 | 哈 131 | 哈哈 132 | 呵 133 | 和 134 | 何 135 | 何处 136 | 何况 137 | 何时 138 | 嘿 139 | 哼 140 | 哼唷 141 | 呼哧 142 | 乎 143 | 哗 144 | 还是 145 | 还有 146 | 换句话说 147 | 换言之 148 | 或 149 | 或是 150 | 或者 151 | 极了 152 | 及 153 | 及其 154 | 及至 155 | 即 156 | 即便 157 | 即或 158 | 即令 159 | 即若 160 | 即使 161 | 几 162 | 几时 163 | 己 164 | 既 165 | 既然 166 | 既是 167 | 继而 168 | 加之 169 | 假如 170 | 假若 171 | 假使 172 | 鉴于 173 | 将 174 | 较 175 | 较之 176 | 叫 177 | 接着 178 | 结果 179 | 借 180 | 紧接着 181 | 进而 182 | 尽 183 | 尽管 184 | 经 185 | 经过 186 | 就 187 | 就是 188 | 就是说 189 | 据 190 | 具体地说 191 | 具体说来 192 | 开始 193 | 开外 194 | 靠 195 | 咳 196 | 可 197 | 可见 198 | 可是 199 | 可以 200 | 况且 201 | 啦 202 | 来 203 | 来着 204 | 离 205 | 例如 206 | 哩 207 | 连 208 | 连同 209 | 两者 210 | 了 211 | 临 212 | 另 213 | 另外 214 | 另一方面 215 | 论 216 | 嘛 217 | 吗 218 | 慢说 219 | 漫说 220 | 冒 221 | 么 222 | 每 223 | 每当 224 | 们 225 | 莫若 226 | 某 227 | 某个 228 | 某些 229 | 拿 230 | 哪 231 | 哪边 232 | 哪儿 233 | 哪个 234 | 哪里 235 | 哪年 236 | 哪怕 237 | 哪天 238 | 哪些 239 | 哪样 240 | 那 241 | 那边 242 | 那儿 243 | 那个 244 | 那会儿 245 | 那里 246 | 那么 247 | 那么些 248 | 那么样 249 | 那时 250 | 那些 251 | 那样 252 | 乃 253 | 乃至 254 | 呢 255 | 能 256 | 你 257 | 你们 258 | 您 259 | 宁 260 | 宁可 261 | 宁肯 262 | 宁愿 263 | 哦 264 | 呕 265 | 啪达 266 | 旁人 267 | 呸 268 | 凭 269 | 凭借 270 | 其 271 | 其次 272 | 其二 273 | 其他 274 | 其它 275 | 其一 276 | 其余 277 | 其中 278 | 起 279 | 起见 280 | 起见 281 | 岂但 282 | 恰恰相反 283 | 前后 284 | 前者 285 | 且 286 | 然而 287 | 然后 288 | 然则 289 | 让 290 | 人家 291 | 任 292 | 任何 293 | 任凭 294 | 如 295 | 如此 296 | 如果 297 | 如何 298 | 如其 299 | 如若 300 | 如上所述 301 | 若 302 | 若非 303 | 若是 304 | 啥 305 | 上下 306 | 尚且 307 | 设若 308 | 设使 309 | 甚而 310 | 甚么 311 | 甚至 312 | 省得 313 | 时候 314 | 什么 315 | 什么样 316 | 使得 317 | 是 318 | 是的 319 | 首先 320 | 谁 321 | 谁知 322 | 顺 323 | 顺着 324 | 似的 325 | 虽 326 | 虽然 327 | 虽说 328 | 虽则 329 | 随 330 | 随着 331 | 所 332 | 所以 333 | 他 334 | 他们 335 | 他人 336 | 它 337 | 它们 338 | 她 339 | 她们 340 | 倘 341 | 倘或 342 | 倘然 343 | 倘若 344 | 倘使 345 | 腾 346 | 替 347 | 通过 348 | 同 349 | 同时 350 | 哇 351 | 万一 352 | 往 353 | 望 354 | 为 355 | 为何 356 | 为了 357 | 为什么 358 | 为着 359 | 喂 360 | 嗡嗡 361 | 我 362 | 我们 363 | 呜 364 | 呜呼 365 | 乌乎 366 | 无论 367 | 无宁 368 | 毋宁 369 | 嘻 370 | 吓 371 | 相对而言 372 | 像 373 | 向 374 | 向着 375 | 嘘 376 | 呀 377 | 焉 378 | 沿 379 | 沿着 380 | 要 381 | 要不 382 | 要不然 383 | 要不是 384 | 要么 385 | 要是 386 | 也 387 | 也罢 388 | 也好 389 | 一 390 | 一般 391 | 一旦 392 | 一方面 393 | 一来 394 | 一切 395 | 一样 396 | 一则 397 | 依 398 | 依照 399 | 矣 400 | 以 401 | 以便 402 | 以及 403 | 以免 404 | 以至 405 | 以至于 406 | 以致 407 | 抑或 408 | 因 409 | 因此 410 | 因而 411 | 因为 412 | 哟 413 | 用 414 | 由 415 | 由此可见 416 | 由于 417 | 有 418 | 有的 419 | 有关 420 | 有些 421 | 又 422 | 于 423 | 于是 424 | 于是乎 425 | 与 426 | 与此同时 427 | 与否 428 | 与其 429 | 越是 430 | 云云 431 | 哉 432 | 再说 433 | 再者 434 | 在 435 | 在下 436 | 咱 437 | 咱们 438 | 则 439 | 怎 440 | 怎么 441 | 怎么办 442 | 怎么样 443 | 怎样 444 | 咋 445 | 照 446 | 照着 447 | 者 448 | 这 449 | 这边 450 | 这儿 451 | 这个 452 | 这会儿 453 | 这就是说 454 | 这里 455 | 这么 456 | 这么点儿 457 | 这么些 458 | 这么样 459 | 这时 460 | 这些 461 | 这样 462 | 正如 463 | 吱 464 | 之 465 | 之类 466 | 之所以 467 | 之一 468 | 只是 469 | 只限 470 | 只要 471 | 只有 472 | 至 473 | 至于 474 | 诸位 475 | 着 476 | 着呢 477 | 自 478 | 自从 479 | 自个儿 480 | 自各儿 481 | 自己 482 | 自家 483 | 自身 484 | 综上所述 485 | 总的来看 486 | 总的来说 487 | 总的说来 488 | 总而言之 489 | 总之 490 | 纵 491 | 纵令 492 | 纵然 493 | 纵使 494 | 遵照 495 | 作为 496 | 兮 497 | 呃 498 | 呗 499 | 咚 500 | 咦 501 | 喏 502 | 啐 503 | 喔唷 504 | 嗬 505 | 嗯 506 | 嗳 507 | a 508 | able 509 | about 510 | above 511 | abroad 512 | according 513 | accordingly 514 | across 515 | actually 516 | adj 517 | after 518 | afterwards 519 | again 520 | against 521 | ago 522 | ahead 523 | ain't 524 | all 525 | allow 526 | allows 527 | almost 528 | alone 529 | along 530 | alongside 531 | already 532 | also 533 | although 534 | always 535 | am 536 | amid 537 | amidst 538 | among 539 | amongst 540 | an 541 | and 542 | another 543 | any 544 | anybody 545 | anyhow 546 | anyone 547 | anything 548 | anyway 549 | anyways 550 | anywhere 551 | apart 552 | appear 553 | appreciate 554 | appropriate 555 | are 556 | aren't 557 | around 558 | as 559 | a's 560 | aside 561 | ask 562 | asking 563 | associated 564 | at 565 | available 566 | away 567 | awfully 568 | b 569 | back 570 | backward 571 | backwards 572 | be 573 | became 574 | because 575 | become 576 | becomes 577 | becoming 578 | been 579 | before 580 | beforehand 581 | begin 582 | behind 583 | being 584 | believe 585 | below 586 | beside 587 | besides 588 | best 589 | better 590 | between 591 | beyond 592 | both 593 | brief 594 | but 595 | by 596 | c 597 | came 598 | can 599 | cannot 600 | cant 601 | can't 602 | caption 603 | cause 604 | causes 605 | certain 606 | certainly 607 | changes 608 | clearly 609 | c'mon 610 | co 611 | co. 612 | com 613 | come 614 | comes 615 | concerning 616 | consequently 617 | consider 618 | considering 619 | contain 620 | containing 621 | contains 622 | corresponding 623 | could 624 | couldn't 625 | course 626 | c's 627 | currently 628 | d 629 | dare 630 | daren't 631 | definitely 632 | described 633 | despite 634 | did 635 | didn't 636 | different 637 | directly 638 | do 639 | does 640 | doesn't 641 | doing 642 | done 643 | don't 644 | down 645 | downwards 646 | during 647 | e 648 | each 649 | edu 650 | eg 651 | eight 652 | eighty 653 | either 654 | else 655 | elsewhere 656 | end 657 | ending 658 | enough 659 | entirely 660 | especially 661 | et 662 | etc 663 | even 664 | ever 665 | evermore 666 | every 667 | everybody 668 | everyone 669 | everything 670 | everywhere 671 | ex 672 | exactly 673 | example 674 | except 675 | f 676 | fairly 677 | far 678 | farther 679 | few 680 | fewer 681 | fifth 682 | first 683 | five 684 | followed 685 | following 686 | follows 687 | for 688 | forever 689 | former 690 | formerly 691 | forth 692 | forward 693 | found 694 | four 695 | from 696 | further 697 | furthermore 698 | g 699 | get 700 | gets 701 | getting 702 | given 703 | gives 704 | go 705 | goes 706 | going 707 | gone 708 | got 709 | gotten 710 | greetings 711 | h 712 | had 713 | hadn't 714 | half 715 | happens 716 | hardly 717 | has 718 | hasn't 719 | have 720 | haven't 721 | having 722 | he 723 | he'd 724 | he'll 725 | hello 726 | help 727 | hence 728 | her 729 | here 730 | hereafter 731 | hereby 732 | herein 733 | here's 734 | hereupon 735 | hers 736 | herself 737 | he's 738 | hi 739 | him 740 | himself 741 | his 742 | hither 743 | hopefully 744 | how 745 | howbeit 746 | however 747 | hundred 748 | i 749 | i'd 750 | ie 751 | if 752 | ignored 753 | i'll 754 | i'm 755 | immediate 756 | in 757 | inasmuch 758 | inc 759 | inc. 760 | indeed 761 | indicate 762 | indicated 763 | indicates 764 | inner 765 | inside 766 | insofar 767 | instead 768 | into 769 | inward 770 | is 771 | isn't 772 | it 773 | it'd 774 | it'll 775 | its 776 | it's 777 | itself 778 | i've 779 | j 780 | just 781 | k 782 | keep 783 | keeps 784 | kept 785 | know 786 | known 787 | knows 788 | l 789 | last 790 | lately 791 | later 792 | latter 793 | latterly 794 | least 795 | less 796 | lest 797 | let 798 | let's 799 | like 800 | liked 801 | likely 802 | likewise 803 | little 804 | look 805 | looking 806 | looks 807 | low 808 | lower 809 | ltd 810 | m 811 | made 812 | mainly 813 | make 814 | makes 815 | many 816 | may 817 | maybe 818 | mayn't 819 | me 820 | mean 821 | meantime 822 | meanwhile 823 | merely 824 | might 825 | mightn't 826 | mine 827 | minus 828 | miss 829 | more 830 | moreover 831 | most 832 | mostly 833 | mr 834 | mrs 835 | much 836 | must 837 | mustn't 838 | my 839 | myself 840 | n 841 | name 842 | namely 843 | nd 844 | near 845 | nearly 846 | necessary 847 | need 848 | needn't 849 | needs 850 | neither 851 | never 852 | neverf 853 | neverless 854 | nevertheless 855 | new 856 | next 857 | nine 858 | ninety 859 | no 860 | nobody 861 | non 862 | none 863 | nonetheless 864 | noone 865 | no-one 866 | nor 867 | normally 868 | not 869 | nothing 870 | notwithstanding 871 | novel 872 | now 873 | nowhere 874 | o 875 | obviously 876 | of 877 | off 878 | often 879 | oh 880 | ok 881 | okay 882 | old 883 | on 884 | once 885 | one 886 | ones 887 | one's 888 | only 889 | onto 890 | opposite 891 | or 892 | other 893 | others 894 | otherwise 895 | ought 896 | oughtn't 897 | our 898 | ours 899 | ourselves 900 | out 901 | outside 902 | over 903 | overall 904 | own 905 | p 906 | particular 907 | particularly 908 | past 909 | per 910 | perhaps 911 | placed 912 | please 913 | plus 914 | possible 915 | presumably 916 | probably 917 | provided 918 | provides 919 | q 920 | que 921 | quite 922 | qv 923 | r 924 | rather 925 | rd 926 | re 927 | really 928 | reasonably 929 | recent 930 | recently 931 | regarding 932 | regardless 933 | regards 934 | relatively 935 | respectively 936 | right 937 | round 938 | s 939 | said 940 | same 941 | saw 942 | say 943 | saying 944 | says 945 | second 946 | secondly 947 | see 948 | seeing 949 | seem 950 | seemed 951 | seeming 952 | seems 953 | seen 954 | self 955 | selves 956 | sensible 957 | sent 958 | serious 959 | seriously 960 | seven 961 | several 962 | shall 963 | shan't 964 | she 965 | she'd 966 | she'll 967 | she's 968 | should 969 | shouldn't 970 | since 971 | six 972 | so 973 | some 974 | somebody 975 | someday 976 | somehow 977 | someone 978 | something 979 | sometime 980 | sometimes 981 | somewhat 982 | somewhere 983 | soon 984 | sorry 985 | specified 986 | specify 987 | specifying 988 | still 989 | sub 990 | such 991 | sup 992 | sure 993 | t 994 | take 995 | taken 996 | taking 997 | tell 998 | tends 999 | th 1000 | than 1001 | thank 1002 | thanks 1003 | thanx 1004 | that 1005 | that'll 1006 | thats 1007 | that's 1008 | that've 1009 | the 1010 | their 1011 | theirs 1012 | them 1013 | themselves 1014 | then 1015 | thence 1016 | there 1017 | thereafter 1018 | thereby 1019 | there'd 1020 | therefore 1021 | therein 1022 | there'll 1023 | there're 1024 | theres 1025 | there's 1026 | thereupon 1027 | there've 1028 | these 1029 | they 1030 | they'd 1031 | they'll 1032 | they're 1033 | they've 1034 | thing 1035 | things 1036 | think 1037 | third 1038 | thirty 1039 | this 1040 | thorough 1041 | thoroughly 1042 | those 1043 | though 1044 | three 1045 | through 1046 | throughout 1047 | thru 1048 | thus 1049 | till 1050 | to 1051 | together 1052 | too 1053 | took 1054 | toward 1055 | towards 1056 | tried 1057 | tries 1058 | truly 1059 | try 1060 | trying 1061 | t's 1062 | twice 1063 | two 1064 | u 1065 | un 1066 | under 1067 | underneath 1068 | undoing 1069 | unfortunately 1070 | unless 1071 | unlike 1072 | unlikely 1073 | until 1074 | unto 1075 | up 1076 | upon 1077 | upwards 1078 | us 1079 | use 1080 | used 1081 | useful 1082 | uses 1083 | using 1084 | usually 1085 | v 1086 | value 1087 | various 1088 | versus 1089 | very 1090 | via 1091 | viz 1092 | vs 1093 | w 1094 | want 1095 | wants 1096 | was 1097 | wasn't 1098 | way 1099 | we 1100 | we'd 1101 | welcome 1102 | well 1103 | we'll 1104 | went 1105 | were 1106 | we're 1107 | weren't 1108 | we've 1109 | what 1110 | whatever 1111 | what'll 1112 | what's 1113 | what've 1114 | when 1115 | whence 1116 | whenever 1117 | where 1118 | whereafter 1119 | whereas 1120 | whereby 1121 | wherein 1122 | where's 1123 | whereupon 1124 | wherever 1125 | whether 1126 | which 1127 | whichever 1128 | while 1129 | whilst 1130 | whither 1131 | who 1132 | who'd 1133 | whoever 1134 | whole 1135 | who'll 1136 | whom 1137 | whomever 1138 | who's 1139 | whose 1140 | why 1141 | will 1142 | willing 1143 | wish 1144 | with 1145 | within 1146 | without 1147 | wonder 1148 | won't 1149 | would 1150 | wouldn't 1151 | x 1152 | y 1153 | yes 1154 | yet 1155 | you 1156 | you'd 1157 | you'll 1158 | your 1159 | you're 1160 | yours 1161 | yourself 1162 | yourselves 1163 | you've 1164 | z 1165 | zero --------------------------------------------------------------------------------