diff --git a/.env.example b/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..1a6701268f8f2670b54b2a39d761679ae246b509 --- /dev/null +++ b/.env.example @@ -0,0 +1,6 @@ +SYNTHESIZER_MODEL= +SYNTHESIZER_BASE_URL= +SYNTHESIZER_API_KEY= +TRAINEE_MODEL= +TRAINEE_BASE_URL= +TRAINEE_API_KEY= diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..678cdc50b0dbb52dba8ba9306f6db3efa556df13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,179 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# UV +# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +#uv.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Ruff stuff: +.ruff_cache/ + +# PyPI configuration file +.pypirc + +cache +*.pyc +*.html +.gradio diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..f49a4e16e68b128803cc2dcea614603632b04eac --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/graphgen/__init__.py b/graphgen/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/configs/config.yaml.example b/graphgen/configs/config.yaml.example new file mode 100644 index 0000000000000000000000000000000000000000..eeb804af544f01167941f3d8f240131e3fc25312 --- /dev/null +++ b/graphgen/configs/config.yaml.example @@ -0,0 +1,16 @@ +data_type: raw +input_file: resources/examples/raw_demo.jsonl +tokenizer: cl100k_base +quiz_samples: 2 +traverse_strategy: + qa_form: atomic + bidirectional: true + edge_sampling: max_loss + expand_method: max_tokens + isolated_node_strategy: add + max_depth: 2 + max_extra_edges: 5 + max_tokens: 256 + loss_strategy: only_edge +web_search: false +re_judge: false diff --git a/graphgen/configs/graphgen_config.yaml b/graphgen/configs/graphgen_config.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4ddb66c7ac6db7c69356c1aa4a77a9423cd35b92 --- /dev/null +++ b/graphgen/configs/graphgen_config.yaml @@ -0,0 +1,16 @@ +data_type: raw +input_file: resources/examples/raw_demo.jsonl +tokenizer: cl100k_base +quiz_samples: 2 +traverse_strategy: + qa_form: aggregated + bidirectional: true + edge_sampling: max_loss + expand_method: max_width + isolated_node_strategy: ignore + max_depth: 1 + max_extra_edges: 2 + max_tokens: 256 + loss_strategy: only_edge +web_search: false +re_judge: false diff --git a/graphgen/evaluate.py b/graphgen/evaluate.py new file mode 100644 index 0000000000000000000000000000000000000000..da74a308743149ad1ea31f8c43f8e01c8c160a1d --- /dev/null +++ b/graphgen/evaluate.py @@ -0,0 +1,142 @@ +"""Evaluate the quality of the generated text using various metrics""" + +import os +import json +import argparse +import pandas as pd +from dotenv import load_dotenv +from .models import LengthEvaluator, MTLDEvaluator, RewardEvaluator, TextPair, UniEvaluator +from .utils import logger, set_logger + +sys_path = os.path.abspath(os.path.dirname(__file__)) +set_logger(os.path.join(sys_path, "cache", "logs", "evaluate.log")) + +load_dotenv() + +def evaluate_length(corpus, tokenizer_name): + length_evaluator = LengthEvaluator( + tokenizer_name=tokenizer_name + ) + logger.info("Length evaluator loaded") + scores = length_evaluator.get_average_score(corpus) + logger.info("Length scores: %s", scores) + return scores + +def evaluate_mtld(corpus): + mtld_evaluator = MTLDEvaluator() + logger.info("MTLD evaluator loaded") + scores = mtld_evaluator.get_average_score(corpus) + logger.info("MTLD scores: %s", scores) + min_max_scores = mtld_evaluator.get_min_max_score(corpus) + logger.info("MTLD min max scores: %s", min_max_scores) + return scores, min_max_scores + +def evaluate_reward(corpus, reward_model_names): + scores = [] + for reward_name in reward_model_names: + reward_evaluator = RewardEvaluator( + reward_name=reward_name + ) + logger.info("Loaded reward model: %s", reward_name) + average_score = reward_evaluator.get_average_score(corpus) + logger.info("%s scores: %s", reward_name, average_score) + min_max_scores = reward_evaluator.get_min_max_score(corpus) + logger.info("%s min max scores: %s", reward_name, min_max_scores) + scores.append({ + 'reward_name': reward_name.split('/')[-1], + 'score': average_score, + 'min_max_scores': min_max_scores + }) + del reward_evaluator + clean_gpu_cache() + return scores + +def evaluate_uni(corpus, uni_model_name): + uni_evaluator = UniEvaluator( + model_name=uni_model_name + ) + logger.info("Uni evaluator loaded with model %s", uni_model_name) + uni_scores = uni_evaluator.get_average_score(corpus) + for key, value in uni_scores.items(): + logger.info("Uni %s scores: %s", key, value) + min_max_scores = uni_evaluator.get_min_max_score(corpus) + for key, value in min_max_scores.items(): + logger.info("Uni %s min max scores: %s", key, value) + del uni_evaluator + clean_gpu_cache() + return (uni_scores['naturalness'], uni_scores['coherence'], uni_scores['understandability'], + min_max_scores['naturalness'], min_max_scores['coherence'], min_max_scores['understandability']) + + +def clean_gpu_cache(): + import torch + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +if __name__ == '__main__': + import torch.multiprocessing as mp + parser = argparse.ArgumentParser() + + parser.add_argument('--folder', type=str, default='cache/data', help='folder to load data') + parser.add_argument('--output', type=str, default='cache/output', help='path to save output') + + parser.add_argument('--tokenizer', type=str, default='cl100k_base', help='tokenizer name') + parser.add_argument('--reward', type=str, default='OpenAssistant/reward-model-deberta-v3-large-v2', + help='Comma-separated list of reward models') + parser.add_argument('--uni', type=str, default='MingZhong/unieval-sum', help='uni model name') + + args = parser.parse_args() + + if not os.path.exists(args.folder): + raise ValueError(f"Folder {args.folder} does not exist") + + if not os.path.exists(args.output): + os.makedirs(args.output) + + reward_models = args.reward.split(',') + + + results = [] + + logger.info("Data loaded from %s", args.folder) + mp.set_start_method('spawn') + + for file in os.listdir(args.folder): + if file.endswith('.json'): + logger.info("Processing %s", file) + with open(os.path.join(args.folder, file), 'r', encoding='utf-8') as f: + data = json.load(f) + data = [TextPair( + question=data[key]['question'], + answer=data[key]['answer'] + ) for key in data] + + length_scores = evaluate_length(data, args.tokenizer) + mtld_scores, min_max_mtld_scores = evaluate_mtld(data) + reward_scores = evaluate_reward(data, reward_models) + uni_naturalness_scores, uni_coherence_scores, uni_understandability_scores, \ + min_max_uni_naturalness_scores, min_max_uni_coherence_scores, min_max_uni_understandability_scores \ + = evaluate_uni(data, args.uni) + + result = { + 'file': file, + 'number': len(data), + 'length': length_scores, + 'mtld': mtld_scores, + 'mtld_min_max': min_max_mtld_scores, + 'uni_naturalness': uni_naturalness_scores, + 'uni_coherence': uni_coherence_scores, + 'uni_understandability': uni_understandability_scores, + 'uni_naturalness_min_max': min_max_uni_naturalness_scores, + 'uni_coherence_min_max': min_max_uni_coherence_scores, + 'uni_understandability_min_max': min_max_uni_understandability_scores + } + for reward_score in reward_scores: + result[reward_score['reward_name']] = reward_score['score'] + result[f"{reward_score['reward_name']}_min_max"] = reward_score['min_max_scores'] + + results.append(result) + + results = pd.DataFrame(results) + results.to_csv(os.path.join(args.output, 'evaluation.csv'), index=False) diff --git a/graphgen/generate.py b/graphgen/generate.py new file mode 100644 index 0000000000000000000000000000000000000000..14693471c4997346db428cb09ab9b83f57453e0d --- /dev/null +++ b/graphgen/generate.py @@ -0,0 +1,101 @@ +import os +import json +import time +import argparse +from importlib.resources import files +import yaml +from dotenv import load_dotenv + +from .graphgen import GraphGen +from .models import OpenAIModel, Tokenizer, TraverseStrategy +from .utils import set_logger + +sys_path = os.path.abspath(os.path.dirname(__file__)) + +load_dotenv() + +def set_working_dir(folder): + os.makedirs(folder, exist_ok=True) + os.makedirs(os.path.join(folder, "data", "graphgen"), exist_ok=True) + os.makedirs(os.path.join(folder, "logs"), exist_ok=True) + +def save_config(config_path, global_config): + if not os.path.exists(os.path.dirname(config_path)): + os.makedirs(os.path.dirname(config_path)) + with open(config_path, "w", encoding='utf-8') as config_file: + yaml.dump(global_config, config_file, default_flow_style=False, allow_unicode=True) + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument('--config_file', + help='Config parameters for GraphGen.', + # default=os.path.join(sys_path, "configs", "graphgen_config.yaml"), + default=files('graphgen').joinpath("configs", "graphgen_config.yaml"), + type=str) + parser.add_argument('--output_dir', + help='Output directory for GraphGen.', + default=sys_path, + required=True, + type=str) + + args = parser.parse_args() + + working_dir = args.output_dir + set_working_dir(working_dir) + unique_id = int(time.time()) + set_logger(os.path.join(working_dir, "logs", f"graphgen_{unique_id}.log"), if_stream=False) + + with open(args.config_file, "r", encoding='utf-8') as f: + config = yaml.load(f, Loader=yaml.FullLoader) + + input_file = config['input_file'] + + if config['data_type'] == 'raw': + with open(input_file, "r", encoding='utf-8') as f: + data = [json.loads(line) for line in f] + elif config['data_type'] == 'chunked': + with open(input_file, "r", encoding='utf-8') as f: + data = json.load(f) + else: + raise ValueError(f"Invalid data type: {config['data_type']}") + + synthesizer_llm_client = OpenAIModel( + model_name=os.getenv("SYNTHESIZER_MODEL"), + api_key=os.getenv("SYNTHESIZER_API_KEY"), + base_url=os.getenv("SYNTHESIZER_BASE_URL") + ) + trainee_llm_client = OpenAIModel( + model_name=os.getenv("TRAINEE_MODEL"), + api_key=os.getenv("TRAINEE_API_KEY"), + base_url=os.getenv("TRAINEE_BASE_URL") + ) + + traverse_strategy = TraverseStrategy( + **config['traverse_strategy'] + ) + + graph_gen = GraphGen( + working_dir=working_dir, + unique_id=unique_id, + synthesizer_llm_client=synthesizer_llm_client, + trainee_llm_client=trainee_llm_client, + if_web_search=config['web_search'], + tokenizer_instance=Tokenizer( + model_name=config['tokenizer'] + ), + traverse_strategy=traverse_strategy + ) + + graph_gen.insert(data, config['data_type']) + + graph_gen.quiz(max_samples=config['quiz_samples']) + + graph_gen.judge(re_judge=config["re_judge"]) + + graph_gen.traverse() + + path = os.path.join(working_dir, "data", "graphgen", str(unique_id), f"config-{unique_id}.yaml") + save_config(path, config) + +if __name__ == '__main__': + main() diff --git a/graphgen/graphgen.py b/graphgen/graphgen.py new file mode 100644 index 0000000000000000000000000000000000000000..265d32a998592c5b1ad1af60cdb689801b621bb0 --- /dev/null +++ b/graphgen/graphgen.py @@ -0,0 +1,260 @@ +# Adapt from https://github.com/HKUDS/LightRAG + +import asyncio +import os +import time +from dataclasses import dataclass, field +from typing import List, Union, cast + +import gradio as gr +from tqdm.asyncio import tqdm as tqdm_async + +from .models import ( + Chunk, + JsonKVStorage, + NetworkXStorage, + OpenAIModel, + Tokenizer, + TraverseStrategy, + WikiSearch, +) +from .models.storage.base_storage import StorageNameSpace +from .operators import ( + extract_kg, + judge_statement, + quiz, + search_wikipedia, + skip_judge_statement, + traverse_graph_atomically, + traverse_graph_by_edge, + traverse_graph_for_multi_hop, +) +from .utils import compute_content_hash, create_event_loop, logger + +sys_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) + +@dataclass +class GraphGen: + unique_id: int = int(time.time()) + working_dir: str = os.path.join(sys_path, "cache") + + # text chunking + chunk_size: int = 1024 + chunk_overlap_size: int = 100 + + # llm + synthesizer_llm_client: OpenAIModel = None + trainee_llm_client: OpenAIModel = None + tokenizer_instance: Tokenizer = None + + # web search + if_web_search: bool = False + wiki_client: WikiSearch = field(default_factory=WikiSearch) + + # traverse strategy + traverse_strategy: TraverseStrategy = field(default_factory=TraverseStrategy) + + # webui + progress_bar: gr.Progress = None + + def __post_init__(self): + self.full_docs_storage: JsonKVStorage = JsonKVStorage( + self.working_dir, namespace="full_docs" + ) + self.text_chunks_storage: JsonKVStorage = JsonKVStorage( + self.working_dir, namespace="text_chunks" + ) + self.wiki_storage: JsonKVStorage = JsonKVStorage( + self.working_dir, namespace="wiki" + ) + self.graph_storage: NetworkXStorage = NetworkXStorage( + self.working_dir, namespace="graph" + ) + self.rephrase_storage: JsonKVStorage = JsonKVStorage( + self.working_dir, namespace="rephrase" + ) + self.qa_storage: JsonKVStorage = JsonKVStorage( + os.path.join(self.working_dir, "data", "graphgen", str(self.unique_id)), namespace=f"qa-{self.unique_id}" + ) + + async def async_split_chunks(self, data: Union[List[list], List[dict]], data_type: str) -> dict: + # TODO: 是否进行指代消解 + if len(data) == 0: + return {} + + new_docs = {} + inserting_chunks = {} + if data_type == "raw": + assert isinstance(data, list) and isinstance(data[0], dict) + # compute hash for each document + new_docs = { + compute_content_hash(doc['content'], prefix="doc-"): {'content': doc['content']} for doc in data + } + _add_doc_keys = await self.full_docs_storage.filter_keys(list(new_docs.keys())) + new_docs = {k: v for k, v in new_docs.items() if k in _add_doc_keys} + if len(new_docs) == 0: + logger.warning("All docs are already in the storage") + return {} + logger.info("[New Docs] inserting %d docs", len(new_docs)) + + cur_index = 1 + doc_number = len(new_docs) + async for doc_key, doc in tqdm_async( + new_docs.items(), desc="[1/4]Chunking documents", unit="doc" + ): + chunks = { + compute_content_hash(dp["content"], prefix="chunk-"): { + **dp, + 'full_doc_id': doc_key + } for dp in self.tokenizer_instance.chunk_by_token_size(doc["content"], + self.chunk_overlap_size, self.chunk_size) + } + inserting_chunks.update(chunks) + + if self.progress_bar is not None: + self.progress_bar( + cur_index / doc_number, f"Chunking {doc_key}" + ) + cur_index += 1 + + _add_chunk_keys = await self.text_chunks_storage.filter_keys(list(inserting_chunks.keys())) + inserting_chunks = {k: v for k, v in inserting_chunks.items() if k in _add_chunk_keys} + elif data_type == "chunked": + assert isinstance(data, list) and isinstance(data[0], list) + new_docs = { + compute_content_hash("".join(chunk['content']), prefix="doc-"): {'content': "".join(chunk['content'])} + for doc in data for chunk in doc + } + _add_doc_keys = await self.full_docs_storage.filter_keys(list(new_docs.keys())) + new_docs = {k: v for k, v in new_docs.items() if k in _add_doc_keys} + if len(new_docs) == 0: + logger.warning("All docs are already in the storage") + return {} + logger.info("[New Docs] inserting %d docs", len(new_docs)) + async for doc in tqdm_async(data, desc="[1/4]Chunking documents", unit="doc"): + doc_str = "".join([chunk['content'] for chunk in doc]) + for chunk in doc: + chunk_key = compute_content_hash(chunk['content'], prefix="chunk-") + inserting_chunks[chunk_key] = { + **chunk, + 'full_doc_id': compute_content_hash(doc_str, prefix="doc-") + } + _add_chunk_keys = await self.text_chunks_storage.filter_keys(list(inserting_chunks.keys())) + inserting_chunks = {k: v for k, v in inserting_chunks.items() if k in _add_chunk_keys} + + await self.full_docs_storage.upsert(new_docs) + await self.text_chunks_storage.upsert(inserting_chunks) + + return inserting_chunks + + def insert(self, data: Union[List[list], List[dict]], data_type: str): + loop = create_event_loop() + loop.run_until_complete(self.async_insert(data, data_type)) + + async def async_insert(self, data: Union[List[list], List[dict]], data_type: str): + """ + + insert chunks into the graph + """ + + inserting_chunks = await self.async_split_chunks(data, data_type) + + if len(inserting_chunks) == 0: + logger.warning("All chunks are already in the storage") + return + logger.info("[New Chunks] inserting %d chunks", len(inserting_chunks)) + + logger.info("[Entity and Relation Extraction]...") + _add_entities_and_relations = await extract_kg( + llm_client=self.synthesizer_llm_client, + kg_instance=self.graph_storage, + tokenizer_instance=self.tokenizer_instance, + chunks=[Chunk(id=k, content=v['content']) for k, v in inserting_chunks.items()], + progress_bar = self.progress_bar, + ) + if not _add_entities_and_relations: + logger.warning("No entities or relations extracted") + return + + logger.info("[Wiki Search] is %s", 'enabled' if self.if_web_search else 'disabled') + if self.if_web_search: + logger.info("[Wiki Search]...") + _add_wiki_data = await search_wikipedia( + llm_client= self.synthesizer_llm_client, + wiki_search_client=self.wiki_client, + knowledge_graph_instance=_add_entities_and_relations + ) + await self.wiki_storage.upsert(_add_wiki_data) + + await self._insert_done() + + async def _insert_done(self): + tasks = [] + for storage_instance in [self.full_docs_storage, self.text_chunks_storage, + self.graph_storage, self.wiki_storage]: + if storage_instance is None: + continue + tasks.append(cast(StorageNameSpace, storage_instance).index_done_callback()) + await asyncio.gather(*tasks) + + def quiz(self, max_samples=1): + loop = create_event_loop() + loop.run_until_complete(self.async_quiz(max_samples)) + + async def async_quiz(self, max_samples=1): + await quiz(self.synthesizer_llm_client, self.graph_storage, self.rephrase_storage, max_samples) + await self.rephrase_storage.index_done_callback() + + def judge(self, re_judge=False, skip=False): + loop = create_event_loop() + loop.run_until_complete(self.async_judge(re_judge, skip)) + + async def async_judge(self, re_judge=False, skip=False): + if skip: + _update_relations = await skip_judge_statement(self.graph_storage) + else: + _update_relations = await judge_statement(self.trainee_llm_client, self.graph_storage, + self.rephrase_storage, re_judge) + await _update_relations.index_done_callback() + + def traverse(self): + loop = create_event_loop() + loop.run_until_complete(self.async_traverse()) + + async def async_traverse(self): + if self.traverse_strategy.qa_form == "atomic": + results = await traverse_graph_atomically(self.synthesizer_llm_client, + self.tokenizer_instance, + self.graph_storage, + self.traverse_strategy, + self.text_chunks_storage, + self.progress_bar) + elif self.traverse_strategy.qa_form == "multi_hop": + results = await traverse_graph_for_multi_hop(self.synthesizer_llm_client, + self.tokenizer_instance, + self.graph_storage, + self.traverse_strategy, + self.text_chunks_storage, + self.progress_bar) + elif self.traverse_strategy.qa_form == "aggregated": + results = await traverse_graph_by_edge(self.synthesizer_llm_client, self.tokenizer_instance, + self.graph_storage, self.traverse_strategy, self.text_chunks_storage, + self.progress_bar) + else: + raise ValueError(f"Unknown qa_form: {self.traverse_strategy.qa_form}") + await self.qa_storage.upsert(results) + await self.qa_storage.index_done_callback() + + def clear(self): + loop = create_event_loop() + loop.run_until_complete(self.async_clear()) + + async def async_clear(self): + await self.full_docs_storage.drop() + await self.text_chunks_storage.drop() + await self.wiki_storage.drop() + await self.graph_storage.clear() + await self.rephrase_storage.drop() + await self.qa_storage.drop() + + logger.info("All caches are cleared") diff --git a/graphgen/judge.py b/graphgen/judge.py new file mode 100644 index 0000000000000000000000000000000000000000..f05bdf1da816a0ba07ca682f300f968d48b29dd1 --- /dev/null +++ b/graphgen/judge.py @@ -0,0 +1,60 @@ +import os +import argparse +import asyncio +from dotenv import load_dotenv + +from .models import NetworkXStorage, JsonKVStorage, OpenAIModel +from .operators import judge_statement + +sys_path = os.path.abspath(os.path.dirname(__file__)) + +load_dotenv() + +def calculate_average_loss(graph: NetworkXStorage): + """ + Calculate the average loss of the graph. + + :param graph: NetworkXStorage + :return: float + """ + edges = asyncio.run(graph.get_all_edges()) + total_loss = 0 + for edge in edges: + total_loss += edge[2]['loss'] + return total_loss / len(edges) + + + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('--input', type=str, default=os.path.join(sys_path, "cache"), help='path to load input graph') + parser.add_argument('--output', type=str, default='cache/output/new_graph.graphml', help='path to save output') + + args = parser.parse_args() + + llm_client = OpenAIModel( + model_name=os.getenv("TRAINEE_MODEL"), + api_key=os.getenv("TRAINEE_API_KEY"), + base_url=os.getenv("TRAINEE_BASE_URL") + ) + + graph_storage = NetworkXStorage( + args.input, + namespace="graph" + ) + average_loss = calculate_average_loss(graph_storage) + print(f"Average loss of the graph: {average_loss}") + + rephrase_storage = JsonKVStorage( + os.path.join(sys_path, "cache"), + namespace="rephrase" + ) + + new_graph = asyncio.run(judge_statement(llm_client, graph_storage, rephrase_storage, re_judge=True)) + + graph_file = asyncio.run(graph_storage.get_graph()) + + new_graph.write_nx_graph(graph_file, args.output) + + average_loss = calculate_average_loss(new_graph) + print(f"Average loss of the graph: {average_loss}") diff --git a/graphgen/models/__init__.py b/graphgen/models/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..c2f9e71405a656ba2203b8cf55f8dc7225d0770b --- /dev/null +++ b/graphgen/models/__init__.py @@ -0,0 +1,41 @@ +from .text.chunk import Chunk +from .text.text_pair import TextPair + +from .llm.topk_token_model import Token, TopkTokenModel +from .llm.openai_model import OpenAIModel +from .llm.tokenizer import Tokenizer + +from .storage.networkx_storage import NetworkXStorage +from .storage.json_storage import JsonKVStorage + +from .search.wiki_search import WikiSearch + +from .evaluate.length_evaluator import LengthEvaluator +from .evaluate.mtld_evaluator import MTLDEvaluator +from .evaluate.reward_evaluator import RewardEvaluator +from .evaluate.uni_evaluator import UniEvaluator + +from .strategy.travserse_strategy import TraverseStrategy + + +__all__ = [ + # llm models + "OpenAIModel", + "TopkTokenModel", + "Token", + "Tokenizer", + # storage models + "Chunk", + "NetworkXStorage", + "JsonKVStorage", + # search models + "WikiSearch", + # evaluate models + "TextPair", + "LengthEvaluator", + "MTLDEvaluator", + "RewardEvaluator", + "UniEvaluator", + # strategy models + "TraverseStrategy", +] diff --git a/graphgen/models/embed/__init__.py b/graphgen/models/embed/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/embed/embedding.py b/graphgen/models/embed/embedding.py new file mode 100644 index 0000000000000000000000000000000000000000..8213b90f08820414402547ead11854da4f9b308b --- /dev/null +++ b/graphgen/models/embed/embedding.py @@ -0,0 +1,29 @@ +from dataclasses import dataclass +import asyncio +import numpy as np + +class UnlimitedSemaphore: + """A context manager that allows unlimited access.""" + + async def __aenter__(self): + pass + + async def __aexit__(self, exc_type, exc, tb): + pass + +@dataclass +class EmbeddingFunc: + embedding_dim: int + max_token_size: int + func: callable + concurrent_limit: int = 16 + + def __post_init__(self): + if self.concurrent_limit != 0: + self._semaphore = asyncio.Semaphore(self.concurrent_limit) + else: + self._semaphore = UnlimitedSemaphore() + + async def __call__(self, *args, **kwargs) -> np.ndarray: + async with self._semaphore: + return await self.func(*args, **kwargs) diff --git a/graphgen/models/evaluate/__init__.py b/graphgen/models/evaluate/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/evaluate/base_evaluator.py b/graphgen/models/evaluate/base_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..6c5ae2d5252e24322db5c89c70364b514f6f7cde --- /dev/null +++ b/graphgen/models/evaluate/base_evaluator.py @@ -0,0 +1,51 @@ +import asyncio + +from dataclasses import dataclass +from tqdm.asyncio import tqdm as tqdm_async +from graphgen.utils import create_event_loop +from graphgen.models.text.text_pair import TextPair + +@dataclass +class BaseEvaluator: + max_concurrent: int = 100 + results: list[float] = None + + def evaluate(self, pairs: list[TextPair]) -> list[float]: + """ + Evaluate the text and return a score. + """ + return create_event_loop().run_until_complete(self.async_evaluate(pairs)) + + async def async_evaluate(self, pairs: list[TextPair]) -> list[float]: + semaphore = asyncio.Semaphore(self.max_concurrent) + + async def evaluate_with_semaphore(pair): + async with semaphore: # 获取Semaphore + return await self.evaluate_single(pair) + + results = [] + for result in tqdm_async( + asyncio.as_completed([evaluate_with_semaphore(pair) for pair in pairs]), + total=len(pairs), + ): + results.append(await result) + return results + + async def evaluate_single(self, pair: TextPair) -> float: + raise NotImplementedError() + + def get_average_score(self, pairs: list[TextPair]) -> float: + """ + Get the average score of a batch of texts. + """ + results = self.evaluate(pairs) + self.results = results + return sum(self.results) / len(pairs) + + def get_min_max_score(self, pairs: list[TextPair]) -> tuple[float, float]: + """ + Get the min and max score of a batch of texts. + """ + if self.results is None: + self.get_average_score(pairs) + return min(self.results), max(self.results) diff --git a/graphgen/models/evaluate/length_evaluator.py b/graphgen/models/evaluate/length_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..ba53ff6b28b5ddfc6b20b079b326bd8f083167be --- /dev/null +++ b/graphgen/models/evaluate/length_evaluator.py @@ -0,0 +1,22 @@ +from dataclasses import dataclass +from graphgen.models.evaluate.base_evaluator import BaseEvaluator +from graphgen.models.llm.tokenizer import Tokenizer +from graphgen.models.text.text_pair import TextPair +from graphgen.utils import create_event_loop + + +@dataclass +class LengthEvaluator(BaseEvaluator): + tokenizer_name: str = "cl100k_base" + def __post_init__(self): + self.tokenizer = Tokenizer( + model_name=self.tokenizer_name + ) + + async def evaluate_single(self, pair: TextPair) -> float: + loop = create_event_loop() + return await loop.run_in_executor(None, self._calculate_length, pair.answer) + + def _calculate_length(self, text: str) -> float: + tokens = self.tokenizer.encode_string(text) + return len(tokens) diff --git a/graphgen/models/evaluate/mtld_evaluator.py b/graphgen/models/evaluate/mtld_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..4ea68875e7e16aabe232f7c642a44752aa125e6c --- /dev/null +++ b/graphgen/models/evaluate/mtld_evaluator.py @@ -0,0 +1,76 @@ +from dataclasses import dataclass, field +from typing import Set + +from graphgen.models.evaluate.base_evaluator import BaseEvaluator +from graphgen.models.text.text_pair import TextPair +from graphgen.utils import detect_main_language, NLTKHelper, create_event_loop + + +nltk_helper = NLTKHelper() + +@dataclass +class MTLDEvaluator(BaseEvaluator): + """ + 衡量文本词汇多样性的指标 + """ + stopwords_en: Set[str] = field(default_factory=lambda: set(nltk_helper.get_stopwords("english"))) + stopwords_zh: Set[str] = field(default_factory=lambda: set(nltk_helper.get_stopwords("chinese"))) + + async def evaluate_single(self, pair: TextPair) -> float: + loop = create_event_loop() + return await loop.run_in_executor(None, self._calculate_mtld_score, pair.answer) + + def _calculate_mtld_score(self, text: str, threshold=0.72) -> float: + """ + 计算MTLD (向前和向后的平均值) + + min is 1.0 + higher is better + """ + if not text or not text.strip(): + return 0.0 + + lang = detect_main_language(text) + tokens = nltk_helper.word_tokenize(text, lang) + + stopwords = self.stopwords_zh if lang == "zh" else self.stopwords_en + filtered_tokens = [word for word in tokens if word not in stopwords] + filtered_tokens = [word for word in filtered_tokens if word.isalnum()] + + if not filtered_tokens: + return 0 + + # 计算向前的MTLD + forward_factors = self._compute_factors(filtered_tokens, threshold) + + # 计算向后的MTLD + backward_factors = self._compute_factors(filtered_tokens[::-1], threshold) + + # 取平均值 + return (forward_factors + backward_factors) / 2 + + @staticmethod + def _compute_factors(tokens: list, threshold: float) -> float: + factors = 0 + current_segment = [] + unique_words = set() + + for token in tokens: + current_segment.append(token) + unique_words.add(token) + ttr = len(unique_words) / len(current_segment) + + if ttr <= threshold: + factors += 1 + current_segment = [] + unique_words = set() + + # 处理最后一个不完整片段 + if current_segment: + ttr = len(unique_words) / len(current_segment) + if ttr <= threshold: + factors += 1 + else: + factors += (1 - (ttr - threshold) / (1 - threshold)) + + return len(tokens) / factors if factors > 0 else len(tokens) diff --git a/graphgen/models/evaluate/reward_evaluator.py b/graphgen/models/evaluate/reward_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..2e4c021c03cf25f15b45b734d4af2cf4da0cefde --- /dev/null +++ b/graphgen/models/evaluate/reward_evaluator.py @@ -0,0 +1,101 @@ +from dataclasses import dataclass +from tqdm import tqdm +from graphgen.models.text.text_pair import TextPair + + +@dataclass +class RewardEvaluator: + """ + Reward Model Evaluator. + OpenAssistant/reward-model-deberta-v3-large-v2: 分数范围为[-inf, inf],越高越好 + """ + reward_name: str = "OpenAssistant/reward-model-deberta-v3-large-v2" + max_length: int = 2560 + results: list[float] = None + + def __post_init__(self): + import torch + self.num_gpus = torch.cuda.device_count() + + @staticmethod + def process_chunk(rank, pairs, reward_name, max_length, return_dict): + import torch + from transformers import AutoModelForSequenceClassification, AutoTokenizer + device = f'cuda:{rank}' + torch.cuda.set_device(rank) + + rank_model = AutoModelForSequenceClassification.from_pretrained(reward_name) + tokenizer = AutoTokenizer.from_pretrained(reward_name) + rank_model.to(device) + rank_model.eval() + + results = [] + with torch.no_grad(): + for pair in tqdm(pairs): + inputs = tokenizer( + pair.question, + pair.answer, + return_tensors="pt", + max_length=max_length, + truncation=True + ) + inputs = {k: v.to(device) for k, v in inputs.items()} + score = rank_model(**inputs).logits[0].item() + results.append(score) + + return_dict[rank] = results + + def evaluate(self, pairs: list[TextPair]) -> list[float]: + import torch.multiprocessing as mp + chunk_size = len(pairs) // self.num_gpus + chunks = [] + for i in range(self.num_gpus): + start = i * chunk_size + end = start + chunk_size + if i == self.num_gpus - 1: + end = len(pairs) + chunks.append(pairs[start:end]) + + # multi-process + manager = mp.Manager() + return_dict = manager.dict() + processes = [] + + for rank, chunk in enumerate(chunks): + p = mp.Process( + target=self.process_chunk, + args=(rank, chunk, self.reward_name, self.max_length, return_dict) + ) + p.start() + processes.append(p) + + for p in processes: + p.join() + + # 合并结果 + results = [] + for rank in range(len(chunks)): + results.extend(return_dict[rank]) + + for p in processes: + if p.is_alive(): + p.terminate() + p.join() + + return results + + def get_average_score(self, pairs: list[TextPair]) -> float: + """ + Get the average score of a batch of texts. + """ + results = self.evaluate(pairs) + self.results = results + return sum(self.results) / len(pairs) + + def get_min_max_score(self, pairs: list[TextPair]) -> tuple[float, float]: + """ + Get the min and max score of a batch of texts. + """ + if self.results is None: + self.get_average_score(pairs) + return min(self.results), max(self.results) diff --git a/graphgen/models/evaluate/uni_evaluator.py b/graphgen/models/evaluate/uni_evaluator.py new file mode 100644 index 0000000000000000000000000000000000000000..a334f0a9fa8e909c54339bdc7711d00659b50ff3 --- /dev/null +++ b/graphgen/models/evaluate/uni_evaluator.py @@ -0,0 +1,159 @@ +# https://github.com/maszhongming/UniEval/tree/main + +from dataclasses import dataclass, field +from tqdm import tqdm +from graphgen.models.text.text_pair import TextPair + + +def _add_questions(dimension: str, question: str, answer: str): + if dimension == "naturalness": + cur_input = 'question: Is this a natural response in the dialogue? response: ' + answer + elif dimension == "coherence": + cur_input = 'question: Is this a coherent response given the dialogue history? response: ' \ + + answer + ' dialogue history: ' + question + elif dimension == "understandability": + cur_input = 'question: Is this an understandable response in the dialogue? response: ' + answer + else: + raise NotImplementedError( + 'The input format for this dimension is still undefined. Please customize it first.') + return cur_input + +@dataclass +class UniEvaluator: + model_name: str = "MingZhong/unieval-sum" + dimensions: list = field(default_factory=lambda: ['naturalness', 'coherence', 'understandability']) + max_length: int = 2560 + results: dict = None + + def __post_init__(self): + import torch + self.num_gpus = torch.cuda.device_count() + self.results = {} + + @staticmethod + def process_chunk(rank, pairs, model_name, max_length, dimension, return_dict): + import torch + from transformers import AutoTokenizer, AutoModelForSeq2SeqLM + device = f'cuda:{rank}' + torch.cuda.set_device(rank) + + rank_model = AutoModelForSeq2SeqLM.from_pretrained(model_name) + tokenizer = AutoTokenizer.from_pretrained(model_name) + rank_model.to(device) + rank_model.eval() + + softmax = torch.nn.Softmax(dim=1) + + pos_id = tokenizer("Yes")["input_ids"][0] + neg_id = tokenizer("No")["input_ids"][0] + + results = [] + with torch.no_grad(): + for pair in tqdm(pairs): + text = _add_questions(dimension, pair.question, pair.answer) + + tgt = "No" + + encoded_src = tokenizer( + text, + max_length=max_length, + truncation=True, + padding=True, + return_tensors='pt' + ) + encoded_tgt = tokenizer( + tgt, + max_length=max_length, + truncation=True, + padding=True, + return_tensors='pt' + ) + + src_tokens = encoded_src['input_ids'].to(device) + src_mask = encoded_src['attention_mask'].to(device) + + tgt_tokens = encoded_tgt['input_ids'].to(device)[:, 0].unsqueeze(-1) + + output = rank_model( + input_ids=src_tokens, + attention_mask=src_mask, + labels=tgt_tokens, + use_cache = False + ) + + logits = output.logits.view(-1, rank_model.config.vocab_size) + + pos_score = softmax(logits)[:, pos_id] # Yes + neg_score = softmax(logits)[:, neg_id] + score = pos_score / (pos_score + neg_score) + + results.append(score.item()) + + return_dict[rank] = results + + def evaluate(self, pairs: list[TextPair]) -> list[dict]: + import torch.multiprocessing as mp + final_results = [] + for dimension in self.dimensions: + chunk_size = len(pairs) // self.num_gpus + chunks = [] + for i in range(self.num_gpus): + start = i * chunk_size + end = start + chunk_size + if i == self.num_gpus - 1: + end = len(pairs) + chunks.append(pairs[start:end]) + + # multi-process + manager = mp.Manager() + return_dict = manager.dict() + processes = [] + + for rank, chunk in enumerate(chunks): + p = mp.Process( + target=self.process_chunk, + args=(rank, chunk, self.model_name, self.max_length, dimension, return_dict) + ) + p.start() + processes.append(p) + + for p in processes: + p.join() + + # 合并结果 + results = [] + for rank in range(len(chunks)): + results.extend(return_dict[rank]) + + for p in processes: + if p.is_alive(): + p.terminate() + p.join() + + final_results.append({ + dimension: results + }) + return final_results + + def get_average_score(self, pairs: list[TextPair]) -> dict: + """ + Get the average score of a batch of texts. + """ + results = self.evaluate(pairs) + final_results = {} + for result in results: + for key, value in result.items(): + final_results[key] = sum(value) / len(value) + self.results[key] = value + return final_results + + def get_min_max_score(self, pairs: list[TextPair]) -> dict: + """ + Get the min and max score of a batch of texts. + """ + if self.results is None: + self.get_average_score(pairs) + final_results = {} + for key, value in self.results.items(): + final_results[key] = min(value), max(value) + return final_results diff --git a/graphgen/models/llm/__init__.py b/graphgen/models/llm/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/llm/limitter.py b/graphgen/models/llm/limitter.py new file mode 100644 index 0000000000000000000000000000000000000000..01cb1f709f17632652b36a1da0b21e963e823df0 --- /dev/null +++ b/graphgen/models/llm/limitter.py @@ -0,0 +1,88 @@ +import time +from datetime import datetime, timedelta +import asyncio + +from graphgen.utils import logger + + +class RPM: + + def __init__(self, rpm: int = 1000): + self.rpm = rpm + self.record = {'rpm_slot': self.get_minute_slot(), 'counter': 0} + + def get_minute_slot(self): + current_time = time.time() + dt_object = datetime.fromtimestamp(current_time) + total_minutes_since_midnight = dt_object.hour * 60 + dt_object.minute + return total_minutes_since_midnight + + async def wait(self, silent=False): + current = time.time() + dt_object = datetime.fromtimestamp(current) + minute_slot = self.get_minute_slot() + + if self.record['rpm_slot'] == minute_slot: + # check RPM exceed + if self.record['counter'] >= self.rpm: + # wait until next minute + next_minute = dt_object.replace( + second=0, microsecond=0) + timedelta(minutes=1) + _next = next_minute.timestamp() + sleep_time = abs(_next - current) + if not silent: + logger.info('RPM sleep %s', sleep_time) + await asyncio.sleep(sleep_time) + + self.record = { + 'rpm_slot': self.get_minute_slot(), + 'counter': 0 + } + else: + self.record = {'rpm_slot': self.get_minute_slot(), 'counter': 0} + self.record['counter'] += 1 + + if not silent: + logger.debug(self.record) + + +class TPM: + + def __init__(self, tpm: int = 20000): + self.tpm = tpm + self.record = {'tpm_slot': self.get_minute_slot(), 'counter': 0} + + def get_minute_slot(self): + current_time = time.time() + dt_object = datetime.fromtimestamp(current_time) + total_minutes_since_midnight = dt_object.hour * 60 + dt_object.minute + return total_minutes_since_midnight + + async def wait(self, token_count, silent=False): + current = time.time() + dt_object = datetime.fromtimestamp(current) + minute_slot = self.get_minute_slot() + + # get next slot, skip + if self.record['tpm_slot'] != minute_slot: + self.record = {'tpm_slot': minute_slot, 'counter': token_count} + return + + # check RPM exceed + self.record['counter'] += token_count + if self.record['counter'] > self.tpm: + # wait until next minute + next_minute = dt_object.replace( + second=0, microsecond=0) + timedelta(minutes=1) + _next = next_minute.timestamp() + sleep_time = abs(_next - current) + logger.info('TPM sleep %s', sleep_time) + await asyncio.sleep(sleep_time) + + self.record = { + 'tpm_slot': self.get_minute_slot(), + 'counter': token_count + } + + if not silent: + logger.debug(self.record) diff --git a/graphgen/models/llm/openai_model.py b/graphgen/models/llm/openai_model.py new file mode 100644 index 0000000000000000000000000000000000000000..6973c1cec13a3a0842eb50e5eec839c6a16612af --- /dev/null +++ b/graphgen/models/llm/openai_model.py @@ -0,0 +1,130 @@ +import math +from dataclasses import dataclass, field +from typing import List, Dict, Optional +import openai +from openai import AsyncOpenAI, RateLimitError, APIConnectionError, APITimeoutError +from tenacity import ( + retry, + stop_after_attempt, + wait_exponential, + retry_if_exception_type, +) + +from graphgen.models.llm.topk_token_model import TopkTokenModel, Token +from graphgen.models.llm.tokenizer import Tokenizer +from graphgen.models.llm.limitter import RPM, TPM + +def get_top_response_tokens(response: openai.ChatCompletion) -> List[Token]: + token_logprobs = response.choices[0].logprobs.content + tokens = [] + for token_prob in token_logprobs: + prob = math.exp(token_prob.logprob) + candidate_tokens = [ + Token(t.token, math.exp(t.logprob)) + for t in token_prob.top_logprobs + ] + token = Token(token_prob.token, prob, top_candidates=candidate_tokens) + tokens.append(token) + return tokens + +@dataclass +class OpenAIModel(TopkTokenModel): + model_name: str = "gpt-4o-mini" + api_key: str = None + base_url: str = None + + system_prompt: str = "" + json_mode: bool = False + seed: int = None + + token_usage: list = field(default_factory=list) + request_limit: bool = False + rpm: RPM = field(default_factory=lambda: RPM(rpm=1000)) + tpm: TPM = field(default_factory=lambda: TPM(tpm=50000)) + + + def __post_init__(self): + assert self.api_key is not None, "Please provide api key to access openai api." + if self.api_key == "": + self.api_key = "none" + self.client = AsyncOpenAI(api_key=self.api_key, base_url=self.base_url) + + def _pre_generate(self, text: str, history: List[str]) -> Dict: + kwargs = { + "temperature": self.temperature, + "top_p": self.topp, + "max_tokens": self.max_tokens, + } + if self.seed: + kwargs["seed"] = self.seed + if self.json_mode: + kwargs["response_format"] = {"type": "json_object"} + + messages = [] + if self.system_prompt: + messages.append({"role": "system", "content": self.system_prompt}) + messages.append({"role": "user", "content": text}) + + if history: + assert len(history) % 2 == 0, "History should have even number of elements." + messages = history + messages + + kwargs['messages']= messages + return kwargs + + + @retry( + stop=stop_after_attempt(5), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type((RateLimitError, APIConnectionError, APITimeoutError)), + ) + async def generate_topk_per_token(self, text: str, history: Optional[List[str]] = None) -> List[Token]: + kwargs = self._pre_generate(text, history) + if self.topk_per_token > 0: + kwargs["logprobs"] = True + kwargs["top_logprobs"] = self.topk_per_token + + # Limit max_tokens to 1 to avoid long completions + kwargs["max_tokens"] = 1 + + completion = await self.client.chat.completions.create( # pylint: disable=E1125 + model=self.model_name, + **kwargs + ) + + tokens = get_top_response_tokens(completion) + + return tokens + + @retry( + stop=stop_after_attempt(5), + wait=wait_exponential(multiplier=1, min=4, max=10), + retry=retry_if_exception_type((RateLimitError, APIConnectionError, APITimeoutError)), + ) + async def generate_answer(self, text: str, history: Optional[List[str]] = None, temperature: int = 0) -> str: + kwargs = self._pre_generate(text, history) + kwargs["temperature"] = temperature + + prompt_tokens = 0 + for message in kwargs['messages']: + prompt_tokens += len(Tokenizer().encode_string(message['content'])) + estimated_tokens = prompt_tokens + kwargs['max_tokens'] + + if self.request_limit: + await self.rpm.wait(silent=True) + await self.tpm.wait(estimated_tokens, silent=True) + + completion = await self.client.chat.completions.create( # pylint: disable=E1125 + model=self.model_name, + **kwargs + ) + if hasattr(completion, "usage"): + self.token_usage.append({ + "prompt_tokens": completion.usage.prompt_tokens, + "completion_tokens": completion.usage.completion_tokens, + "total_tokens": completion.usage.total_tokens, + }) + return completion.choices[0].message.content + + async def generate_inputs_prob(self, text: str, history: Optional[List[str]] = None) -> List[Token]: + raise NotImplementedError diff --git a/graphgen/models/llm/tokenizer.py b/graphgen/models/llm/tokenizer.py new file mode 100644 index 0000000000000000000000000000000000000000..6a1c4b2206a6980fcd070defe00f7e5a339a1ead --- /dev/null +++ b/graphgen/models/llm/tokenizer.py @@ -0,0 +1,73 @@ +from dataclasses import dataclass +from typing import List +import tiktoken + +try: + from transformers import AutoTokenizer + TRANSFORMERS_AVAILABLE = True +except ImportError: + AutoTokenizer = None + TRANSFORMERS_AVAILABLE = False + + +def get_tokenizer(tokenizer_name: str = "cl100k_base"): + """ + Get a tokenizer instance by name. + + :param tokenizer_name: tokenizer name, tiktoken encoding name or Hugging Face model name + :return: tokenizer instance + """ + if tokenizer_name in tiktoken.list_encoding_names(): + return tiktoken.get_encoding(tokenizer_name) + if TRANSFORMERS_AVAILABLE: + try: + return AutoTokenizer.from_pretrained(tokenizer_name) + except Exception as e: + raise ValueError(f"Failed to load tokenizer from Hugging Face: {e}") from e + else: + raise ValueError("Hugging Face Transformers is not available, please install it first.") + +@dataclass +class Tokenizer: + model_name: str = "cl100k_base" + + def __post_init__(self): + self.tokenizer = get_tokenizer(self.model_name) + + def encode_string(self, text: str) -> List[int]: + """ + Encode text to tokens + + :param text + :return: tokens + """ + return self.tokenizer.encode(text) + + def decode_tokens(self, tokens: List[int]) -> str: + """ + Decode tokens to text + + :param tokens + :return: text + """ + return self.tokenizer.decode(tokens) + + def chunk_by_token_size( + self, content: str, overlap_token_size=128, max_token_size=1024 + ): + tokens = self.encode_string(content) + results = [] + for index, start in enumerate( + range(0, len(tokens), max_token_size - overlap_token_size) + ): + chunk_content = self.decode_tokens( + tokens[start : start + max_token_size] + ) + results.append( + { + "tokens": min(max_token_size, len(tokens) - start), + "content": chunk_content.strip(), + "chunk_order_index": index, + } + ) + return results diff --git a/graphgen/models/llm/topk_token_model.py b/graphgen/models/llm/topk_token_model.py new file mode 100644 index 0000000000000000000000000000000000000000..b7595cb1c9810f1c2d977d05b40228ef2a82b9f0 --- /dev/null +++ b/graphgen/models/llm/topk_token_model.py @@ -0,0 +1,48 @@ +import math +from dataclasses import dataclass, field +from typing import List, Union, Optional + + +@dataclass +class Token: + text: str + prob: float + top_candidates: List = field(default_factory=list) + ppl: Union[float, None] = field(default=None) + + @property + def logprob(self) -> float: + return math.log(self.prob) + + +@dataclass +class TopkTokenModel: + do_sample: bool = False + temperature: float = 0 + max_tokens: int = 4096 + repetition_penalty: float = 1.05 + num_beams: int = 1 + topk: int = 50 + topp: float = 0.95 + + topk_per_token: int = 5 # number of topk tokens to generate for each token + + async def generate_topk_per_token(self, text: str) -> List[Token]: + """ + Generate prob, text and candidates for each token of the model's output. + This function is used to visualize the inference process. + """ + raise NotImplementedError + + async def generate_inputs_prob(self, text: str, history: Optional[List[str]] = None) -> List[Token]: + """ + Generate prob and text for each token of the input text. + This function is used to visualize the ppl. + """ + raise NotImplementedError + + async def generate_answer(self, text: str, history: Optional[List[str]] = None) -> str: + """ + Generate answer from the model. + """ + raise NotImplementedError diff --git a/graphgen/models/search/__init__.py b/graphgen/models/search/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/search/wiki_search.py b/graphgen/models/search/wiki_search.py new file mode 100644 index 0000000000000000000000000000000000000000..db312a2bfc333b485725712faa7be92fcedc43dd --- /dev/null +++ b/graphgen/models/search/wiki_search.py @@ -0,0 +1,36 @@ +from typing import List, Union +from dataclasses import dataclass + +import wikipedia +from wikipedia import set_lang +from graphgen.utils import detect_main_language, logger + + +@dataclass +class WikiSearch: + @staticmethod + def set_language(language: str): + assert language in ["en", "zh"], "Only support English and Chinese" + set_lang(language) + + async def search(self, query: str) -> Union[List[str], None]: + self.set_language(detect_main_language(query)) + return wikipedia.search(query) + + async def summary(self, query: str) -> Union[str, None]: + self.set_language(detect_main_language(query)) + try: + result = wikipedia.summary(query, auto_suggest=False, redirect=False) + except wikipedia.exceptions.DisambiguationError as e: + logger.error("DisambiguationError: %s", e) + result = None + return result + + async def page(self, query: str) -> Union[str, None]: + self.set_language(detect_main_language(query)) + try: + result = wikipedia.page(query, auto_suggest=False, redirect=False).content + except wikipedia.exceptions.DisambiguationError as e: + logger.error("DisambiguationError: %s", e) + result = None + return result diff --git a/graphgen/models/storage/__init__.py b/graphgen/models/storage/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/storage/base_storage.py b/graphgen/models/storage/base_storage.py new file mode 100644 index 0000000000000000000000000000000000000000..2e70a3cb6f1bc55910e241cf127ffdbc81f44ec0 --- /dev/null +++ b/graphgen/models/storage/base_storage.py @@ -0,0 +1,94 @@ +from dataclasses import dataclass +from typing import Union, Generic, TypeVar +from graphgen.models.embed.embedding import EmbeddingFunc + +T = TypeVar("T") + +@dataclass +class StorageNameSpace: + working_dir: str = None + namespace: str = None + + async def index_done_callback(self): + """commit the storage operations after indexing""" + + async def query_done_callback(self): + """commit the storage operations after querying""" + + +@dataclass +class BaseKVStorage(Generic[T], StorageNameSpace): + embedding_func: EmbeddingFunc = None + + async def all_keys(self) -> list[str]: + raise NotImplementedError + + async def get_by_id(self, id: str) -> Union[T, None]: + raise NotImplementedError + + async def get_by_ids( + self, ids: list[str], fields: Union[set[str], None] = None + ) -> list[Union[T, None]]: + raise NotImplementedError + + async def filter_keys(self, data: list[str]) -> set[str]: + """return un-exist keys""" + raise NotImplementedError + + async def upsert(self, data: dict[str, T]): + raise NotImplementedError + + async def drop(self): + raise NotImplementedError + +@dataclass +class BaseGraphStorage(StorageNameSpace): + embedding_func: EmbeddingFunc = None + + async def has_node(self, node_id: str) -> bool: + raise NotImplementedError + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + raise NotImplementedError + + async def node_degree(self, node_id: str) -> int: + raise NotImplementedError + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + raise NotImplementedError + + async def get_node(self, node_id: str) -> Union[dict, None]: + raise NotImplementedError + + async def update_node(self, node_id: str, node_data: dict[str, str]): + raise NotImplementedError + + async def get_all_nodes(self) -> Union[list[dict], None]: + raise NotImplementedError + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> Union[dict, None]: + raise NotImplementedError + + async def update_edge(self, source_node_id: str, target_node_id: str, edge_data: dict[str, str]): + raise NotImplementedError + + async def get_all_edges(self) -> Union[list[dict], None]: + raise NotImplementedError + + async def get_node_edges( + self, source_node_id: str + ) -> Union[list[tuple[str, str]], None]: + raise NotImplementedError + + async def upsert_node(self, node_id: str, node_data: dict[str, str]): + raise NotImplementedError + + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ): + raise NotImplementedError + + async def delete_node(self, node_id: str): + raise NotImplementedError diff --git a/graphgen/models/storage/json_storage.py b/graphgen/models/storage/json_storage.py new file mode 100644 index 0000000000000000000000000000000000000000..e4f21e6c28cfec38c4c76303d026469b4370318e --- /dev/null +++ b/graphgen/models/storage/json_storage.py @@ -0,0 +1,51 @@ +import os + +from dataclasses import dataclass +from graphgen.utils import logger, load_json, write_json +from graphgen.models.storage.base_storage import BaseKVStorage + + +@dataclass +class JsonKVStorage(BaseKVStorage): + _data: dict[str, str] = None + + def __post_init__(self): + self._file_name = os.path.join(self.working_dir, f"{self.namespace}.json") + self._data = load_json(self._file_name) or {} + logger.info("Load KV %s with %d data", self.namespace, len(self._data)) + + @property + def data(self): + return self._data + + async def all_keys(self) -> list[str]: + return list(self._data.keys()) + + async def index_done_callback(self): + write_json(self._data, self._file_name) + + async def get_by_id(self, id): + return self._data.get(id, None) + + async def get_by_ids(self, ids, fields=None) -> list: + if fields is None: + return [self._data.get(id, None) for id in ids] + return [ + ( + {k: v for k, v in self._data[id].items() if k in fields} + if self._data.get(id, None) + else None + ) + for id in ids + ] + + async def filter_keys(self, data: list[str]) -> set[str]: + return {s for s in data if s not in self._data} + + async def upsert(self, data: dict): + left_data = {k: v for k, v in data.items() if k not in self._data} + self._data.update(left_data) + return left_data + + async def drop(self): + self._data = {} diff --git a/graphgen/models/storage/networkx_storage.py b/graphgen/models/storage/networkx_storage.py new file mode 100644 index 0000000000000000000000000000000000000000..92643760708d6c62c86896baee8b4d3d7c9fe3e8 --- /dev/null +++ b/graphgen/models/storage/networkx_storage.py @@ -0,0 +1,159 @@ +import os +import html +from typing import Any, Union, cast, Optional +from dataclasses import dataclass +import networkx as nx + +from graphgen.utils import logger +from .base_storage import BaseGraphStorage + +@dataclass +class NetworkXStorage(BaseGraphStorage): + @staticmethod + def load_nx_graph(file_name) -> Optional[nx.Graph]: + if os.path.exists(file_name): + return nx.read_graphml(file_name) + return None + + @staticmethod + def write_nx_graph(graph: nx.Graph, file_name): + logger.info("Writing graph with %d nodes, %d edges", graph.number_of_nodes(), graph.number_of_edges()) + nx.write_graphml(graph, file_name) + + @staticmethod + def stable_largest_connected_component(graph: nx.Graph) -> nx.Graph: + """Refer to https://github.com/microsoft/graphrag/index/graph/utils/stable_lcc.py + Return the largest connected component of the graph, with nodes and edges sorted in a stable way. + """ + from graspologic.utils import largest_connected_component + + graph = graph.copy() + graph = cast(nx.Graph, largest_connected_component(graph)) + node_mapping = { + node: html.unescape(node.upper().strip()) for node in graph.nodes() + } # type: ignore + graph = nx.relabel_nodes(graph, node_mapping) + return NetworkXStorage._stabilize_graph(graph) + + @staticmethod + def _stabilize_graph(graph: nx.Graph) -> nx.Graph: + """Refer to https://github.com/microsoft/graphrag/index/graph/utils/stable_lcc.py + Ensure an undirected graph with the same relationships will always be read the same way. + 通过对节点和边进行排序来实现 + """ + fixed_graph = nx.DiGraph() if graph.is_directed() else nx.Graph() + + sorted_nodes = graph.nodes(data=True) + sorted_nodes = sorted(sorted_nodes, key=lambda x: x[0]) + + fixed_graph.add_nodes_from(sorted_nodes) + edges = list(graph.edges(data=True)) + + if not graph.is_directed(): + + def _sort_source_target(edge): + source, target, edge_data = edge + if source > target: + source, target = target, source + return source, target, edge_data + + edges = [_sort_source_target(edge) for edge in edges] + + def _get_edge_key(source: Any, target: Any) -> str: + return f"{source} -> {target}" + + edges = sorted(edges, key=lambda x: _get_edge_key(x[0], x[1])) + + fixed_graph.add_edges_from(edges) + return fixed_graph + + def __post_init__(self): + """ + 如果图文件存在,则加载图文件,否则创建一个新图 + """ + self._graphml_xml_file = os.path.join( + self.working_dir, f"{self.namespace}.graphml" + ) + preloaded_graph = NetworkXStorage.load_nx_graph(self._graphml_xml_file) + if preloaded_graph is not None: + logger.info( + "Loaded graph from %s with %d nodes, %d edges", self._graphml_xml_file, + preloaded_graph.number_of_nodes(), preloaded_graph.number_of_edges() + ) + self._graph = preloaded_graph or nx.Graph() + + async def index_done_callback(self): + NetworkXStorage.write_nx_graph(self._graph, self._graphml_xml_file) + + async def has_node(self, node_id: str) -> bool: + return self._graph.has_node(node_id) + + async def has_edge(self, source_node_id: str, target_node_id: str) -> bool: + return self._graph.has_edge(source_node_id, target_node_id) + + async def get_node(self, node_id: str) -> Union[dict, None]: + return self._graph.nodes.get(node_id) + + async def get_all_nodes(self) -> Union[list[dict], None]: + return self._graph.nodes(data=True) + + async def node_degree(self, node_id: str) -> int: + return self._graph.degree(node_id) + + async def edge_degree(self, src_id: str, tgt_id: str) -> int: + return self._graph.degree(src_id) + self._graph.degree(tgt_id) + + async def get_edge( + self, source_node_id: str, target_node_id: str + ) -> Union[dict, None]: + return self._graph.edges.get((source_node_id, target_node_id)) + + async def get_all_edges(self) -> Union[list[dict], None]: + return self._graph.edges(data=True) + + async def get_node_edges(self, source_node_id: str) -> Union[list[tuple[str, str]], None]: + if self._graph.has_node(source_node_id): + return list(self._graph.edges(source_node_id, data=True)) + return None + + async def get_graph(self) -> nx.Graph: + return self._graph + + async def upsert_node(self, node_id: str, node_data: dict[str, str]): + self._graph.add_node(node_id, **node_data) + + async def update_node(self, node_id: str, node_data: dict[str, str]): + if self._graph.has_node(node_id): + self._graph.nodes[node_id].update(node_data) + else: + logger.warning("Node %s not found in the graph for update.", node_id) + + async def upsert_edge( + self, source_node_id: str, target_node_id: str, edge_data: dict[str, str] + ): + self._graph.add_edge(source_node_id, target_node_id, **edge_data) + + async def update_edge(self, source_node_id: str, target_node_id: str, edge_data: dict[str, str]): + if self._graph.has_edge(source_node_id, target_node_id): + self._graph.edges[(source_node_id, target_node_id)].update(edge_data) + else: + logger.warning("Edge %s -> %s not found in the graph for update.", source_node_id, target_node_id) + + async def delete_node(self, node_id: str): + """ + Delete a node from the graph based on the specified node_id. + + :param node_id: The node_id to delete + """ + if self._graph.has_node(node_id): + self._graph.remove_node(node_id) + logger.info("Node %s deleted from the graph.", node_id) + else: + logger.warning("Node %s not found in the graph for deletion.", node_id) + + async def clear(self): + """ + Clear the graph by removing all nodes and edges. + """ + self._graph.clear() + logger.info("Graph %s cleared.", self.namespace) diff --git a/graphgen/models/strategy/__init__.py b/graphgen/models/strategy/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/strategy/base_strategy.py b/graphgen/models/strategy/base_strategy.py new file mode 100644 index 0000000000000000000000000000000000000000..70e0cc54af1b152d28f226c697e5a805a57018ea --- /dev/null +++ b/graphgen/models/strategy/base_strategy.py @@ -0,0 +1,5 @@ +from dataclasses import dataclass + +@dataclass +class BaseStrategy: + pass diff --git a/graphgen/models/strategy/travserse_strategy.py b/graphgen/models/strategy/travserse_strategy.py new file mode 100644 index 0000000000000000000000000000000000000000..06882c5f882d1bb152cc22625b185494100c2fc3 --- /dev/null +++ b/graphgen/models/strategy/travserse_strategy.py @@ -0,0 +1,30 @@ +from dataclasses import dataclass, fields + +from graphgen.models.strategy.base_strategy import BaseStrategy + + +@dataclass +class TraverseStrategy(BaseStrategy): + # 生成的QA形式:原子、多跳、聚合型 + qa_form: str = "atomic" # "atomic" or "multi_hop" or "aggregated" + # 最大边数和最大token数方法中选择一个生效 + expand_method: str = "max_tokens" # "max_width" or "max_tokens" + # 单向拓展还是双向拓展 + bidirectional: bool = True + # 每个方向拓展的最大边数 + max_extra_edges: int = 5 + # 最长token数 + max_tokens: int = 256 + # 每个方向拓展的最大深度 + max_depth: int = 2 + # 同一层中选边的策略(如果是双向拓展,同一层指的是两边连接的边的集合) + edge_sampling: str = "max_loss" # "max_loss" or "min_loss" or "random" + # 孤立节点的处理策略 + isolated_node_strategy: str = "add" # "add" or "ignore" + loss_strategy: str = "only_edge" # only_edge, both + + def to_yaml(self): + strategy_dict = {} + for f in fields(self): + strategy_dict[f.name] = getattr(self, f.name) + return {"traverse_strategy": strategy_dict} diff --git a/graphgen/models/text/__init__.py b/graphgen/models/text/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/graphgen/models/text/chunk.py b/graphgen/models/text/chunk.py new file mode 100644 index 0000000000000000000000000000000000000000..9678949fe170d9a1588f2b0911701c703a062b55 --- /dev/null +++ b/graphgen/models/text/chunk.py @@ -0,0 +1,7 @@ +from dataclasses import dataclass + + +@dataclass +class Chunk: + id : str + content: str diff --git a/graphgen/models/text/text_pair.py b/graphgen/models/text/text_pair.py new file mode 100644 index 0000000000000000000000000000000000000000..f9a971f1ce9fc2d1ecdb82f61eae3711d8b76ebc --- /dev/null +++ b/graphgen/models/text/text_pair.py @@ -0,0 +1,9 @@ +from dataclasses import dataclass + +@dataclass +class TextPair: + """ + A pair of input data. + """ + question: str + answer: str diff --git a/graphgen/operators/__init__.py b/graphgen/operators/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8ef14fdc5bfcbbac0d2e01eb111e643d916bbda4 --- /dev/null +++ b/graphgen/operators/__init__.py @@ -0,0 +1,16 @@ +from .extract_kg import extract_kg +from .quiz import quiz +from .judge import judge_statement, skip_judge_statement +from .search_wikipedia import search_wikipedia +from .traverse_graph import traverse_graph_by_edge, traverse_graph_atomically, traverse_graph_for_multi_hop + +__all__ = [ + "extract_kg", + "quiz", + "judge_statement", + "skip_judge_statement", + "search_wikipedia", + "traverse_graph_by_edge", + "traverse_graph_atomically", + "traverse_graph_for_multi_hop" +] diff --git a/graphgen/operators/extract_kg.py b/graphgen/operators/extract_kg.py new file mode 100644 index 0000000000000000000000000000000000000000..3fad55254730639eddc93f913ba77ad8b4cdf470 --- /dev/null +++ b/graphgen/operators/extract_kg.py @@ -0,0 +1,132 @@ +import re +import asyncio +from typing import List +from collections import defaultdict + +import gradio as gr +from tqdm.asyncio import tqdm as tqdm_async +from graphgen.models import Chunk, OpenAIModel, Tokenizer +from graphgen.models.storage.base_storage import BaseGraphStorage +from graphgen.templates import KG_EXTRACTION_PROMPT +from graphgen.utils import (logger, pack_history_conversations, split_string_by_multi_markers, + handle_single_entity_extraction, handle_single_relationship_extraction, + detect_if_chinese) +from graphgen.operators.merge_kg import merge_nodes, merge_edges + + +# pylint: disable=too-many-statements +async def extract_kg( + llm_client: OpenAIModel, + kg_instance: BaseGraphStorage, + tokenizer_instance: Tokenizer, + chunks: List[Chunk], + progress_bar: gr.Progress = None, + max_concurrent: int = 1000 +): + """ + :param llm_client: Synthesizer LLM model to extract entities and relationships + :param kg_instance + :param tokenizer_instance + :param chunks + :param progress_bar: Gradio progress bar to show the progress of the extraction + :param max_concurrent + :return: + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def _process_single_content(chunk: Chunk, max_loop: int = 3): + async with semaphore: + chunk_id = chunk.id + content = chunk.content + if detect_if_chinese(content): + language = "Chinese" + else: + language = "English" + KG_EXTRACTION_PROMPT["FORMAT"]["language"] = language + + hint_prompt = KG_EXTRACTION_PROMPT[language]["TEMPLATE"].format( + **KG_EXTRACTION_PROMPT["FORMAT"], input_text=content + ) + + final_result = await llm_client.generate_answer(hint_prompt) + logger.info('First result: %s', final_result) + + history = pack_history_conversations(hint_prompt, final_result) + for loop_index in range(max_loop): + if_loop_result = await llm_client.generate_answer( + text=KG_EXTRACTION_PROMPT[language]["IF_LOOP"], + history=history + ) + if_loop_result = if_loop_result.strip().strip('"').strip("'").lower() + if if_loop_result != "yes": + break + + glean_result = await llm_client.generate_answer( + text=KG_EXTRACTION_PROMPT[language]["CONTINUE"], + history=history + ) + logger.info('Loop %s glean: %s', loop_index, glean_result) + + history += pack_history_conversations(KG_EXTRACTION_PROMPT[language]["CONTINUE"], glean_result) + final_result += glean_result + if loop_index == max_loop - 1: + break + + records = split_string_by_multi_markers( + final_result, + [ + KG_EXTRACTION_PROMPT["FORMAT"]["record_delimiter"], + KG_EXTRACTION_PROMPT["FORMAT"]["completion_delimiter"]], + ) + + nodes = defaultdict(list) + edges = defaultdict(list) + + for record in records: + record = re.search(r"\((.*)\)", record) + if record is None: + continue + record = record.group(1) # 提取括号内的内容 + record_attributes = split_string_by_multi_markers( + record, [KG_EXTRACTION_PROMPT["FORMAT"]["tuple_delimiter"]] + ) + + entity = await handle_single_entity_extraction(record_attributes, chunk_id) + if entity is not None: + nodes[entity["entity_name"]].append(entity) + continue + relation = await handle_single_relationship_extraction(record_attributes, chunk_id) + if relation is not None: + edges[(relation["src_id"], relation["tgt_id"])].append(relation) + return dict(nodes), dict(edges) + + results = [] + chunk_number = len(chunks) + async for result in tqdm_async( + asyncio.as_completed([_process_single_content(c) for c in chunks]), + total=len(chunks), + desc="[3/4]Extracting entities and relationships from chunks", + unit="chunk", + ): + try: + if progress_bar is not None: + progress_bar(len(results) / chunk_number, desc="[3/4]Extracting entities and relationships from chunks") + results.append(await result) + if progress_bar is not None and len(results) == chunk_number: + progress_bar(1, desc="[3/4]Extracting entities and relationships from chunks") + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while extracting entities and relationships from chunks: %s", e) + + nodes = defaultdict(list) + edges = defaultdict(list) + for n, e in results: + for k, v in n.items(): + nodes[k].extend(v) + for k, v in e.items(): + edges[tuple(sorted(k))].extend(v) + + await merge_nodes(nodes, kg_instance, llm_client, tokenizer_instance) + await merge_edges(edges, kg_instance, llm_client, tokenizer_instance) + + return kg_instance diff --git a/graphgen/operators/judge.py b/graphgen/operators/judge.py new file mode 100644 index 0000000000000000000000000000000000000000..0292e1e40819a85b191bffd32ac622bc6811ddf0 --- /dev/null +++ b/graphgen/operators/judge.py @@ -0,0 +1,188 @@ +import math +import asyncio +from tqdm.asyncio import tqdm as tqdm_async +from graphgen.models import NetworkXStorage, OpenAIModel, JsonKVStorage +from graphgen.utils import logger, yes_no_loss_entropy +from graphgen.templates import STATEMENT_JUDGEMENT_PROMPT + + +async def judge_statement( # pylint: disable=too-many-statements + trainee_llm_client: OpenAIModel, + graph_storage: NetworkXStorage, + rephrase_storage: JsonKVStorage, + re_judge: bool = False, + max_concurrent: int = 1000) -> NetworkXStorage: + """ + Get all edges and nodes and judge them + + :param trainee_llm_client: judge the statements to get comprehension loss + :param graph_storage: graph storage instance + :param rephrase_storage: rephrase storage instance + :param re_judge: re-judge the relations + :param max_concurrent: max concurrent + :return: + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def _judge_single_relation( + edge: tuple, + ): + async with semaphore: + source_id = edge[0] + target_id = edge[1] + edge_data = edge[2] + + if (not re_judge) and "loss" in edge_data and edge_data["loss"] is not None: + logger.info("Edge %s -> %s already judged, loss: %s, skip", source_id, target_id, edge_data["loss"]) + return source_id, target_id, edge_data + + description = edge_data["description"] + + try: + descriptions = await rephrase_storage.get_by_id(description) + assert descriptions is not None + + judgements = [] + gts = [gt for _, gt in descriptions] + for description, gt in descriptions: + judgement = await trainee_llm_client.generate_topk_per_token( + STATEMENT_JUDGEMENT_PROMPT['TEMPLATE'].format(statement=description) + ) + judgements.append(judgement[0].top_candidates) + + loss = yes_no_loss_entropy(judgements, gts) + + logger.info("Edge %s -> %s description: %s loss: %s", source_id, target_id, description, loss) + + edge_data["loss"] = loss + except Exception as e: # pylint: disable=broad-except + logger.error("Error in judging relation %s -> %s: %s", source_id, target_id, e) + logger.info("Use default loss 0.1") + edge_data["loss"] = -math.log(0.1) + + await graph_storage.update_edge(source_id, target_id, edge_data) + return source_id, target_id, edge_data + + edges = await graph_storage.get_all_edges() + + results = [] + for result in tqdm_async( + asyncio.as_completed([_judge_single_relation(edge) for edge in edges]), + total=len(edges), + desc="Judging relations" + ): + results.append(await result) + + async def _judge_single_entity( + node: tuple, + ): + async with semaphore: + node_id = node[0] + node_data = node[1] + + if (not re_judge) and "loss" in node_data and node_data["loss"] is not None: + logger.info("Node %s already judged, loss: %s, skip", node_id, node_data["loss"]) + return node_id, node_data + + description = node_data["description"] + + try: + descriptions = await rephrase_storage.get_by_id(description) + assert descriptions is not None + + judgements = [] + gts = [gt for _, gt in descriptions] + for description, gt in descriptions: + judgement = await trainee_llm_client.generate_topk_per_token( + STATEMENT_JUDGEMENT_PROMPT['TEMPLATE'].format(statement=description) + ) + judgements.append(judgement[0].top_candidates) + + loss = yes_no_loss_entropy(judgements, gts) + + logger.info("Node %s description: %s loss: %s", node_id, description, loss) + + node_data["loss"] = loss + except Exception as e: # pylint: disable=broad-except + logger.error("Error in judging entity %s: %s", node_id, e) + logger.info("Use default loss 0.1") + node_data["loss"] = -math.log(0.1) + + await graph_storage.update_node(node_id, node_data) + return node_id, node_data + + nodes = await graph_storage.get_all_nodes() + + results = [] + for result in tqdm_async( + asyncio.as_completed([_judge_single_entity(node) for node in nodes]), + total=len(nodes), + desc="Judging entities" + ): + results.append(await result) + + return graph_storage + +async def skip_judge_statement( + graph_storage: NetworkXStorage, + max_concurrent: int = 1000 +): + """ + Skip the judgement of the statement + :param graph_storage: graph storage instance + :param max_concurrent: max concurrent + :return: + """ + semaphore = asyncio.Semaphore(max_concurrent) + + async def _skip_single_relation( + edge: tuple, + ): + async with semaphore: + source_id = edge[0] + target_id = edge[1] + edge_data = edge[2] + + if "loss" in edge_data and edge_data["loss"] is not None: + logger.info("Edge %s -> %s already judged, loss: %s, skip", source_id, target_id, edge_data["loss"]) + return source_id, target_id, edge_data + + edge_data["loss"] = -math.log(0.1) + await graph_storage.update_edge(source_id, target_id, edge_data) + return source_id, target_id, edge_data + + edges = await graph_storage.get_all_edges() + results = [] + for result in tqdm_async( + asyncio.as_completed([_skip_single_relation(edge) for edge in edges]), + total=len(edges), + desc="Skipping judgement of relations" + ): + results.append(await result) + + async def _skip_single_entity( + node: tuple, + ): + async with semaphore: + node_id = node[0] + node_data = node[1] + + if "loss" in node_data and node_data["loss"] is not None: + logger.info("Node %s already judged, loss: %s, skip", node_id, node_data["loss"]) + return node_id, node_data + + node_data["loss"] = -math.log(0.1) + await graph_storage.update_node(node_id, node_data) + return node_id, node_data + + nodes = await graph_storage.get_all_nodes() + results = [] + for result in tqdm_async( + asyncio.as_completed([_skip_single_entity(node) for node in nodes]), + total=len(nodes), + desc="Skipping judgement of entities" + ): + results.append(await result) + + return graph_storage diff --git a/graphgen/operators/merge_kg.py b/graphgen/operators/merge_kg.py new file mode 100644 index 0000000000000000000000000000000000000000..33aa1395b26f4ed0d5754cfde0de5967ee296b2a --- /dev/null +++ b/graphgen/operators/merge_kg.py @@ -0,0 +1,215 @@ +from collections import Counter +import asyncio +from tqdm.asyncio import tqdm as tqdm_async + +from graphgen.utils.format import split_string_by_multi_markers +from graphgen.utils import logger, detect_main_language +from graphgen.models import TopkTokenModel, Tokenizer +from graphgen.models.storage.base_storage import BaseGraphStorage +from graphgen.templates import KG_SUMMARIZATION_PROMPT, KG_EXTRACTION_PROMPT + +async def _handle_kg_summary( + entity_or_relation_name: str, + description: str, + llm_client: TopkTokenModel, + tokenizer_instance: Tokenizer, + max_summary_tokens: int = 200 +) -> str: + """ + 处理实体或关系的描述信息 + + :param entity_or_relation_name + :param description + :param llm_client + :param tokenizer_instance + :param max_summary_tokens + :return: new description + """ + language = detect_main_language(description) + if language == "en": + language = "English" + else: + language = "Chinese" + KG_EXTRACTION_PROMPT["FORMAT"]["language"] = language + + tokens = tokenizer_instance.encode_string(description) + if len(tokens) < max_summary_tokens: + return description + + use_description = tokenizer_instance.decode_tokens(tokens[:max_summary_tokens]) + prompt = KG_SUMMARIZATION_PROMPT[language]["TEMPLATE"].format( + entity_name=entity_or_relation_name, + description_list=use_description.split(''), + **KG_SUMMARIZATION_PROMPT["FORMAT"] + ) + new_description = await llm_client.generate_answer(prompt) + logger.info("Entity or relation %s summary: %s", entity_or_relation_name, new_description) + return new_description + + +async def merge_nodes( + nodes_data: dict, + kg_instance: BaseGraphStorage, + llm_client: TopkTokenModel, + tokenizer_instance: Tokenizer, + max_concurrent: int = 1000 +): + """ + Merge nodes + + :param nodes_data + :param kg_instance + :param llm_client + :param tokenizer_instance + :param max_concurrent + :return + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def process_single_node(entity_name: str, node_data: list[dict]): + async with semaphore: + entity_types = [] + source_ids = [] + descriptions = [] + + node = await kg_instance.get_node(entity_name) + if node is not None: + entity_types.append(node["entity_type"]) + source_ids.extend( + split_string_by_multi_markers(node["source_id"], ['']) + ) + descriptions.append(node["description"]) + + # 统计当前节点数据和已有节点数据的entity_type出现次数,取出现次数最多的entity_type + entity_type = sorted( + Counter( + [dp["entity_type"] for dp in node_data] + entity_types + ).items(), + key=lambda x: x[1], + reverse=True, + )[0][0] + + description = ''.join( + sorted(set([dp["description"] for dp in node_data] + descriptions)) + ) + description = await _handle_kg_summary( + entity_name, description, llm_client, tokenizer_instance + ) + + source_id = ''.join( + set([dp["source_id"] for dp in node_data] + source_ids) + ) + + node_data = { + "entity_type": entity_type, + "description": description, + "source_id": source_id + } + await kg_instance.upsert_node( + entity_name, + node_data=node_data + ) + node_data["entity_name"] = entity_name + return node_data + + logger.info("Inserting entities into storage...") + entities_data = [] + for result in tqdm_async( + asyncio.as_completed( + [process_single_node(k, v) for k, v in nodes_data.items()] + ), + total=len(nodes_data), + desc="Inserting entities into storage", + unit="entity", + ): + try: + entities_data.append(await result) + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while inserting entities into storage: %s", e) + + +async def merge_edges( + edges_data: dict, + kg_instance: BaseGraphStorage, + llm_client: TopkTokenModel, + tokenizer_instance: Tokenizer, + max_concurrent: int = 1000 +): + """ + Merge edges + + :param edges_data + :param kg_instance + :param llm_client + :param tokenizer_instance + :param max_concurrent + :return + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def process_single_edge(src_id: str, tgt_id: str, edge_data: list[dict]): + async with semaphore: + source_ids = [] + descriptions = [] + + edge = await kg_instance.get_edge(src_id, tgt_id) + if edge is not None: + source_ids.extend( + split_string_by_multi_markers(edge["source_id"], ['']) + ) + descriptions.append(edge["description"]) + + description = ''.join( + sorted(set([dp["description"] for dp in edge_data] + descriptions)) + ) + source_id = ''.join( + set([dp["source_id"] for dp in edge_data] + source_ids) + ) + + for insert_id in [src_id, tgt_id]: + if not await kg_instance.has_node(insert_id): + await kg_instance.upsert_node( + insert_id, + node_data={ + "source_id": source_id, + "description": description, + "entity_type": "UNKNOWN" + } + ) + + description = await _handle_kg_summary( + f"({src_id}, {tgt_id})", description, llm_client, tokenizer_instance + ) + + await kg_instance.upsert_edge( + src_id, + tgt_id, + edge_data={ + "source_id": source_id, + "description": description + } + ) + + edge_data = { + "src_id": src_id, + "tgt_id": tgt_id, + "description": description + } + return edge_data + + logger.info("Inserting relationships into storage...") + relationships_data = [] + for result in tqdm_async( + asyncio.as_completed( + [process_single_edge(src_id, tgt_id, v) for (src_id, tgt_id), v in edges_data.items()] + ), + total=len(edges_data), + desc="Inserting relationships into storage", + unit="relationship", + ): + try: + relationships_data.append(await result) + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while inserting relationships into storage: %s", e) diff --git a/graphgen/operators/quiz.py b/graphgen/operators/quiz.py new file mode 100644 index 0000000000000000000000000000000000000000..36edddb100c1ccca7b764a199d48e539fec3b757 --- /dev/null +++ b/graphgen/operators/quiz.py @@ -0,0 +1,109 @@ +import asyncio +from collections import defaultdict + +from tqdm.asyncio import tqdm as tqdm_async +from graphgen.models import JsonKVStorage, OpenAIModel, NetworkXStorage +from graphgen.utils import logger, detect_main_language +from graphgen.templates import DESCRIPTION_REPHRASING_PROMPT + + +async def quiz( + synth_llm_client: OpenAIModel, + graph_storage: NetworkXStorage, + rephrase_storage: JsonKVStorage, + max_samples: int = 1, + max_concurrent: int = 1000) -> JsonKVStorage: + """ + Get all edges and quiz them + + :param synth_llm_client: generate statements + :param graph_storage: graph storage instance + :param rephrase_storage: rephrase storage instance + :param max_samples: max samples for each edge + :param max_concurrent: max concurrent + :return: + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def _process_single_quiz( + des: str, + prompt: str, + gt: str + ): + async with semaphore: + try: + # 如果在rephrase_storage中已经存在,直接取出 + descriptions = await rephrase_storage.get_by_id(des) + if descriptions: + return None + + new_description = await synth_llm_client.generate_answer( + prompt, + temperature=1 + ) + return {des: [(new_description, gt)]} + + except Exception as e: # pylint: disable=broad-except + logger.error("Error when quizzing description %s: %s", des, e) + return None + + + edges = await graph_storage.get_all_edges() + nodes = await graph_storage.get_all_nodes() + + results = defaultdict(list) + tasks = [] + for edge in edges: + edge_data = edge[2] + + description = edge_data["description"] + language = "English" if detect_main_language(description) == "en" else "Chinese" + + results[description] = [(description, 'yes')] + + for i in range(max_samples): + if i > 0: + tasks.append( + _process_single_quiz(description, + DESCRIPTION_REPHRASING_PROMPT[language]['TEMPLATE'].format( + input_sentence=description), 'yes') + ) + tasks.append(_process_single_quiz(description, + DESCRIPTION_REPHRASING_PROMPT[language]['ANTI_TEMPLATE'].format( + input_sentence=description), 'no')) + + for node in nodes: + node_data = node[1] + description = node_data["description"] + language = "English" if detect_main_language(description) == "en" else "Chinese" + + results[description] = [(description, 'yes')] + + for i in range(max_samples): + if i > 0: + tasks.append( + _process_single_quiz(description, + DESCRIPTION_REPHRASING_PROMPT[language]['TEMPLATE'].format( + input_sentence=description), 'yes') + ) + tasks.append(_process_single_quiz(description, + DESCRIPTION_REPHRASING_PROMPT[language]['ANTI_TEMPLATE'].format( + input_sentence=description), 'no')) + + for result in tqdm_async( + asyncio.as_completed(tasks), + total=len(tasks), + desc="Quizzing descriptions" + ): + new_result = await result + if new_result: + for key, value in new_result.items(): + results[key].extend(value) + + for key, value in results.items(): + results[key] = list(set(value)) + await rephrase_storage.upsert({key: results[key]}) + + + return rephrase_storage diff --git a/graphgen/operators/resolute_coreference.py b/graphgen/operators/resolute_coreference.py new file mode 100644 index 0000000000000000000000000000000000000000..4a1012fb55aa8d9aee0e1cd36cf4eed55f25fa8d --- /dev/null +++ b/graphgen/operators/resolute_coreference.py @@ -0,0 +1,33 @@ +from typing import List +from graphgen.models import Chunk +from graphgen.models import OpenAIModel +from graphgen.templates import COREFERENCE_RESOLUTION_TEMPLATE +from graphgen.utils import detect_main_language + +async def resolute_coreference( + llm_client: OpenAIModel, + chunks: List[Chunk]) -> List[Chunk]: + """ + Resolute conference + + :param llm_client: LLM model + :param chunks: List of chunks + :return: List of chunks + """ + + if len(chunks) == 0: + return chunks + + results = [chunks[0]] + + for _, chunk in enumerate(chunks[1:]): + language = detect_main_language(chunk.content) + result = await llm_client.generate_answer( + COREFERENCE_RESOLUTION_TEMPLATE[language].format( + reference = results[0].content, + input_sentence = chunk.content + ) + ) + results.append(Chunk(id=chunk.id, content=result)) + + return results diff --git a/graphgen/operators/search_wikipedia.py b/graphgen/operators/search_wikipedia.py new file mode 100644 index 0000000000000000000000000000000000000000..d3d7e28314eebd3ba72cb731290a069c96fe7e97 --- /dev/null +++ b/graphgen/operators/search_wikipedia.py @@ -0,0 +1,71 @@ +import asyncio +from graphgen.models import WikiSearch, OpenAIModel +from graphgen.models.storage.base_storage import BaseGraphStorage +from graphgen.templates import SEARCH_JUDGEMENT_PROMPT +from graphgen.utils import logger + + +async def _process_single_entity(entity_name: str, + description: str, + llm_client: OpenAIModel, + wiki_search_client: WikiSearch) -> tuple[str, None] | tuple[str, str]: + """ + Process single entity + + """ + search_results = await wiki_search_client.search(entity_name) + if not search_results: + return entity_name, None + examples = "\n".join(SEARCH_JUDGEMENT_PROMPT["EXAMPLES"]) + search_results.append("None of the above") + + search_results_str = "\n".join([f"{i + 1}. {sr}" for i, sr in enumerate(search_results)]) + prompt = SEARCH_JUDGEMENT_PROMPT["TEMPLATE"].format( + examples=examples, + entity_name=entity_name, + description=description, + search_results=search_results_str, + ) + response = await llm_client.generate_answer(prompt) + + try: + response = response.strip() + response = int(response) + if response < 1 or response >= len(search_results): + response = None + else: + response = await wiki_search_client.summary(search_results[response - 1]) + except ValueError: + response = None + + logger.info("Entity %s search result: %s response: %s", entity_name, str(search_results), response) + + return entity_name, response + +async def search_wikipedia(llm_client: OpenAIModel, + wiki_search_client: WikiSearch, + knowledge_graph_instance: BaseGraphStorage,) -> dict: + """ + Search wikipedia for entities + + :param llm_client: LLM model + :param wiki_search_client: wiki search client + :param knowledge_graph_instance: knowledge graph instance + :return: nodes with search results + """ + + + nodes = await knowledge_graph_instance.get_all_nodes() + nodes = list(nodes) + wiki_data = {} + + tasks = [ + _process_single_entity(node[0].strip('"'), node[1]["description"], llm_client, wiki_search_client) + for node in nodes + ] + + for task in asyncio.as_completed(tasks): + result = await task + wiki_data[result[0]] = result[1] + + return wiki_data diff --git a/graphgen/operators/split_graph.py b/graphgen/operators/split_graph.py new file mode 100644 index 0000000000000000000000000000000000000000..e2e2b5cab36f0c7f5e1193712792a58755293456 --- /dev/null +++ b/graphgen/operators/split_graph.py @@ -0,0 +1,333 @@ +import random +from collections import defaultdict +from tqdm.asyncio import tqdm as tqdm_async +from graphgen.utils import logger + +from graphgen.models import NetworkXStorage, TraverseStrategy + +async def _get_node_info( + node_id: str, + graph_storage: NetworkXStorage, +)-> dict: + """ + Get node info + + :param node_id: node id + :param graph_storage: graph storage instance + :return: node info + """ + node_data = await graph_storage.get_node(node_id) + return { + "node_id": node_id, + **node_data + } + + +def _get_level_n_edges_by_max_width( + edge_adj_list: dict, + node_dict: dict, + edges: list, + nodes, + src_edge: tuple, + max_depth: int, + bidirectional: bool, + max_extra_edges: int, + edge_sampling: str, + loss_strategy: str = "only_edge" +) -> list: + """ + Get level n edges for an edge. + n is decided by max_depth in traverse_strategy + + :param edge_adj_list + :param node_dict + :param edges + :param nodes + :param src_edge + :param max_depth + :param bidirectional + :param max_extra_edges + :param edge_sampling + :return: level n edges + """ + src_id, tgt_id, _ = src_edge + + level_n_edges = [] + + start_nodes = {tgt_id} if not bidirectional else {src_id, tgt_id} + + while max_depth > 0 and max_extra_edges > 0: + max_depth -= 1 + + candidate_edges = [ + edges[edge_id] + for node in start_nodes + for edge_id in edge_adj_list[node] + if not edges[edge_id][2].get("visited", False) + ] + + if not candidate_edges: + break + + if len(candidate_edges) >= max_extra_edges: + if loss_strategy == "both": + er_tuples = [([nodes[node_dict[edge[0]]], nodes[node_dict[edge[1]]]], edge) for edge in candidate_edges] + candidate_edges = _sort_tuples(er_tuples, edge_sampling)[:max_extra_edges] + elif loss_strategy == "only_edge": + candidate_edges = _sort_edges(candidate_edges, edge_sampling)[:max_extra_edges] + else: + raise ValueError(f"Invalid loss strategy: {loss_strategy}") + + for edge in candidate_edges: + level_n_edges.append(edge) + edge[2]["visited"] = True + break + + max_extra_edges -= len(candidate_edges) + new_start_nodes = set() + + for edge in candidate_edges: + level_n_edges.append(edge) + edge[2]["visited"] = True + + if not edge[0] in start_nodes: + new_start_nodes.add(edge[0]) + if not edge[1] in start_nodes: + new_start_nodes.add(edge[1]) + + start_nodes = new_start_nodes + + return level_n_edges + + +def _get_level_n_edges_by_max_tokens( + edge_adj_list: dict, + node_dict: dict, + edges: list, + nodes: list, + src_edge: tuple, + max_depth: int, + bidirectional: bool, + max_tokens: int, + edge_sampling: str, + loss_strategy: str = "only_edge" +) -> list: + """ + Get level n edges for an edge. + n is decided by max_depth in traverse_strategy. + + :param edge_adj_list + :param node_dict + :param edges + :param nodes + :param src_edge + :param max_depth + :param bidirectional + :param max_tokens + :param edge_sampling + :return: level n edges + """ + src_id, tgt_id, src_edge_data = src_edge + + max_tokens -= (src_edge_data["length"] + nodes[node_dict[src_id]][1]["length"] + + nodes[node_dict[tgt_id]][1]["length"]) + + level_n_edges = [] + + start_nodes = {tgt_id} if not bidirectional else {src_id, tgt_id} + temp_nodes = {src_id, tgt_id} + + while max_depth > 0 and max_tokens > 0: + max_depth -= 1 + + candidate_edges = [ + edges[edge_id] + for node in start_nodes + for edge_id in edge_adj_list[node] + if not edges[edge_id][2].get("visited", False) + ] + + if not candidate_edges: + break + + if loss_strategy == "both": + er_tuples = [([nodes[node_dict[edge[0]]], nodes[node_dict[edge[1]]]], edge) for edge in candidate_edges] + candidate_edges = _sort_tuples(er_tuples, edge_sampling) + elif loss_strategy == "only_edge": + candidate_edges = _sort_edges(candidate_edges, edge_sampling) + else: + raise ValueError(f"Invalid loss strategy: {loss_strategy}") + + for edge in candidate_edges: + max_tokens -= edge[2]["length"] + if not edge[0] in temp_nodes: + max_tokens -= nodes[node_dict[edge[0]]][1]["length"] + if not edge[1] in temp_nodes: + max_tokens -= nodes[node_dict[edge[1]]][1]["length"] + + if max_tokens < 0: + return level_n_edges + + level_n_edges.append(edge) + edge[2]["visited"] = True + temp_nodes.add(edge[0]) + temp_nodes.add(edge[1]) + + new_start_nodes = set() + for edge in candidate_edges: + if not edge[0] in start_nodes: + new_start_nodes.add(edge[0]) + if not edge[1] in start_nodes: + new_start_nodes.add(edge[1]) + + start_nodes = new_start_nodes + + return level_n_edges + + +def _sort_tuples(er_tuples: list, edge_sampling: str) -> list: + """ + Sort edges with edge sampling strategy + + :param er_tuples: [(nodes:list, edge:tuple)] + :param edge_sampling: edge sampling strategy (random, min_loss, max_loss) + :return: sorted edges + """ + if edge_sampling == "random": + er_tuples = random.sample(er_tuples, len(er_tuples)) + elif edge_sampling == "min_loss": + er_tuples = sorted(er_tuples, key=lambda x: sum(node[1]["loss"] for node in x[0]) + x[1][2]["loss"]) + elif edge_sampling == "max_loss": + er_tuples = sorted(er_tuples, key=lambda x: sum(node[1]["loss"] for node in x[0]) + x[1][2]["loss"], + reverse=True) + else: + raise ValueError(f"Invalid edge sampling: {edge_sampling}") + edges = [edge for _, edge in er_tuples] + return edges + +def _sort_edges(edges: list, edge_sampling: str) -> list: + """ + Sort edges with edge sampling strategy + + :param edges: total edges + :param edge_sampling: edge sampling strategy (random, min_loss, max_loss) + :return: sorted edges + """ + if edge_sampling == "random": + random.shuffle(edges) + elif edge_sampling == "min_loss": + edges = sorted(edges, key=lambda x: x[2]["loss"]) + elif edge_sampling == "max_loss": + edges = sorted(edges, key=lambda x: x[2]["loss"], reverse=True) + else: + raise ValueError(f"Invalid edge sampling: {edge_sampling}") + return edges + +async def get_batches_with_strategy( # pylint: disable=too-many-branches + nodes: list, + edges: list, + graph_storage: NetworkXStorage, + traverse_strategy: TraverseStrategy +): + expand_method = traverse_strategy.expand_method + if expand_method == "max_width": + logger.info("Using max width strategy") + elif expand_method == "max_tokens": + logger.info("Using max tokens strategy") + else: + raise ValueError(f"Invalid expand method: {expand_method}") + + max_depth = traverse_strategy.max_depth + edge_sampling = traverse_strategy.edge_sampling + + # 构建临接矩阵 + edge_adj_list = defaultdict(list) + node_dict = {} + processing_batches = [] + + node_cache = {} + + async def get_cached_node_info(node_id: str) -> dict: + if node_id not in node_cache: + node_cache[node_id] = await _get_node_info(node_id, graph_storage) + return node_cache[node_id] + + for i, (node_name, _) in enumerate(nodes): + node_dict[node_name] = i + + if traverse_strategy.loss_strategy == "both": + er_tuples = [([nodes[node_dict[edge[0]]], nodes[node_dict[edge[1]]]], edge) for edge in edges] + edges = _sort_tuples(er_tuples, edge_sampling) + elif traverse_strategy.loss_strategy == "only_edge": + edges = _sort_edges(edges, edge_sampling) + else: + raise ValueError(f"Invalid loss strategy: {traverse_strategy.loss_strategy}") + + for i, (src, tgt, _) in enumerate(edges): + edge_adj_list[src].append(i) + edge_adj_list[tgt].append(i) + + for edge in tqdm_async(edges, desc="Preparing batches"): + if "visited" in edge[2] and edge[2]["visited"]: + continue + + edge[2]["visited"] = True + + _process_nodes = [] + _process_edges = [] + + src_id = edge[0] + tgt_id = edge[1] + + _process_nodes.extend([await get_cached_node_info(src_id), + await get_cached_node_info(tgt_id)]) + _process_edges.append(edge) + + if expand_method == "max_width": + level_n_edges = _get_level_n_edges_by_max_width( + edge_adj_list, node_dict, edges, nodes, edge, max_depth, + traverse_strategy.bidirectional, traverse_strategy.max_extra_edges, + edge_sampling, traverse_strategy.loss_strategy + ) + else: + level_n_edges = _get_level_n_edges_by_max_tokens( + edge_adj_list, node_dict, edges, nodes, edge, max_depth, + traverse_strategy.bidirectional, traverse_strategy.max_tokens, + edge_sampling, traverse_strategy.loss_strategy + ) + + for _edge in level_n_edges: + _process_nodes.append(await get_cached_node_info(_edge[0])) + _process_nodes.append(await get_cached_node_info(_edge[1])) + _process_edges.append(_edge) + + # 去重 + _process_nodes = list({node['node_id']: node for node in _process_nodes}.values()) + _process_edges = list({(edge[0], edge[1]): edge for edge in _process_edges}.values()) + + processing_batches.append((_process_nodes, _process_edges)) + + logger.info("Processing batches: %d", len(processing_batches)) + + # isolate nodes + isolated_node_strategy = traverse_strategy.isolated_node_strategy + if isolated_node_strategy == "add": + processing_batches = await _add_isolated_nodes(nodes, processing_batches, graph_storage) + logger.info("Processing batches after adding isolated nodes: %d", len(processing_batches)) + + return processing_batches + +async def _add_isolated_nodes( + nodes: list, + processing_batches: list, + graph_storage: NetworkXStorage, +) -> list: + visited_nodes = set() + for _process_nodes, _process_edges in processing_batches: + for node in _process_nodes: + visited_nodes.add(node["node_id"]) + for node in nodes: + if node[0] not in visited_nodes: + _process_nodes = [await _get_node_info(node[0], graph_storage)] + processing_batches.append((_process_nodes, [])) + return processing_batches diff --git a/graphgen/operators/traverse_graph.py b/graphgen/operators/traverse_graph.py new file mode 100644 index 0000000000000000000000000000000000000000..947033ed233311d75f349afcc40a3661c0a09bb8 --- /dev/null +++ b/graphgen/operators/traverse_graph.py @@ -0,0 +1,485 @@ +import asyncio +import gradio as gr + +from tqdm.asyncio import tqdm as tqdm_async + +from graphgen.models import OpenAIModel, NetworkXStorage, TraverseStrategy, Tokenizer, JsonKVStorage +from graphgen.templates import ANSWER_REPHRASING_PROMPT, QUESTION_GENERATION_PROMPT, MULTI_HOP_GENERATION_PROMPT +from graphgen.utils import detect_main_language, compute_content_hash, logger +from graphgen.operators.split_graph import get_batches_with_strategy + + +async def _pre_tokenize(graph_storage: NetworkXStorage, + tokenizer: Tokenizer, + edges: list, + nodes: list) -> tuple: + + sem = asyncio.Semaphore(1000) + async def handle_edge(edge: tuple) -> tuple: + async with sem: + if 'length' not in edge[2]: + edge[2]['length'] = len( + await asyncio.get_event_loop().run_in_executor(None, + tokenizer.encode_string, + edge[2]['description'])) + return edge + + async def handle_node(node: dict) -> dict: + async with sem: + if 'length' not in node[1]: + node[1]['length'] = len( + await asyncio.get_event_loop().run_in_executor(None, + tokenizer.encode_string, + node[1]['description'])) + return node + + new_edges = [] + new_nodes = [] + + for result in tqdm_async(asyncio.as_completed([handle_edge(edge) for edge in edges]), + total=len(edges), desc="Pre-tokenizing edges"): + new_edge = await result + await graph_storage.update_edge(new_edge[0], new_edge[1], new_edge[2]) + new_edges.append(new_edge) + + for result in tqdm_async(asyncio.as_completed([handle_node(node) for node in nodes]), + total=len(nodes), desc="Pre-tokenizing nodes"): + new_node = await result + await graph_storage.update_node(new_node[0], new_node[1]) + new_nodes.append(new_node) + + await graph_storage.index_done_callback() + return new_edges, new_nodes + +async def _construct_rephrasing_prompt(_process_nodes: list, + _process_edges: list, + text_chunks_storage: JsonKVStorage, + add_context: bool = False + ) -> str: + entities = [ + f"{_process_node['node_id']}: {_process_node['description']}" for _process_node in _process_nodes + ] + relations = [ + f"{_process_edge[0]} -- {_process_edge[1]}: {_process_edge[2]['description']}" + for _process_edge in _process_edges + ] + + entities_str = "\n".join([f"{index + 1}. {entity}" for index, entity in enumerate(entities)]) + relations_str = "\n".join([f"{index + 1}. {relation}" for index, relation in enumerate(relations)]) + language = "Chinese" if detect_main_language(entities_str + relations_str) == "zh" else "English" + + if add_context: + original_ids = ([node['source_id'].split('')[0] for node in _process_nodes] + + [edge[2]['source_id'].split('')[0] for edge in _process_edges]) + + original_ids = list(set(original_ids)) + original_text = await text_chunks_storage.get_by_ids(original_ids) + original_text = "\n".join([f"{index + 1}. {text['content']}" for index, text in enumerate(original_text)]) + + prompt = ANSWER_REPHRASING_PROMPT[language]['CONTEXT_TEMPLATE'].format( + language=language, + original_text=original_text, + entities=entities_str, + relationships=relations_str + ) + return prompt + + prompt = ANSWER_REPHRASING_PROMPT[language]['TEMPLATE'].format( + language=language, + entities=entities_str, + relationships=relations_str + ) + return prompt + +def get_loss_tercile(losses: list) -> (float, float): + losses = sorted(losses) + q1_index = int(len(losses) * (1 / 3)) + q2_index = int(len(losses) * (2 / 3)) + + return losses[q1_index], losses[q2_index] + +def get_average_loss(batch: tuple, loss_strategy: str) -> float: + if loss_strategy == "only_edge": + return sum(edge[2]['loss'] for edge in batch[1]) / len(batch[1]) + if loss_strategy == "both": + return sum(edge[2]['loss'] for edge in batch[1]) + sum(node['loss'] for node in batch[0]) / \ + (len(batch[0]) + len(batch[1])) + raise ValueError("Invalid loss strategy") + +def _post_process_synthetic_data(data): + block = data.split("\n\n") + qas = [] + for line in block: + if "Question:" in line and "Answer:" in line: + question = line.split("Question:")[1].split("Answer:")[0].strip() + answer = line.split("Answer:")[1].strip() + qas.append({ + "question": question, + "answer": answer + }) + elif "问题:" in line and "答案:" in line: + question = line.split("问题:")[1].split("答案:")[0].strip() + answer = line.split("答案:")[1].strip() + qas.append({ + "question": question, + "answer": answer + }) + elif "问题:" in line and "回答:" in line: + question = line.split("问题:")[1].split("回答:")[0].strip() + answer = line.split("回答:")[1].strip() + qas.append({ + "question": question, + "answer": answer + }) + return qas + +async def traverse_graph_by_edge( + llm_client: OpenAIModel, + tokenizer: Tokenizer, + graph_storage: NetworkXStorage, + traverse_strategy: TraverseStrategy, + text_chunks_storage: JsonKVStorage, + progress_bar: gr.Progress = None, + max_concurrent: int = 1000 +) -> dict: + """ + Traverse the graph + + :param llm_client + :param tokenizer + :param graph_storage + :param traverse_strategy + :param text_chunks_storage + :param progress_bar + :param max_concurrent + :return: question and answer + """ + + semaphore = asyncio.Semaphore(max_concurrent) + + async def _process_nodes_and_edges( + _process_nodes: list, + _process_edges: list, + ) -> str: + prompt = await _construct_rephrasing_prompt( + _process_nodes, + _process_edges, + text_chunks_storage, + add_context = False + ) + context = await llm_client.generate_answer(prompt) + + # post-process the context + if context.startswith("Rephrased Text:"): + context = context[len("Rephrased Text:"):].strip() + elif context.startswith("重述文本:"): + context = context[len("重述文本:"):].strip() + + return context + + async def _process_single_batch( + _process_batch: tuple, + question_type: str = "single" + ) -> dict: + async with semaphore: + context = await _process_nodes_and_edges( + _process_batch[0], + _process_batch[1], + ) + + language = "Chinese" if detect_main_language(context) == "zh" else "English" + pre_length = sum(node['length'] for node in _process_batch[0]) \ + + sum(edge[2]['length'] for edge in _process_batch[1]) + + if question_type == "single": + question = await llm_client.generate_answer( + QUESTION_GENERATION_PROMPT[language]['SINGLE_TEMPLATE'].format( + answer=context + ) + ) + if question.startswith("Question:"): + question = question[len("Question:"):].strip() + elif question.startswith("问题:"): + question = question[len("问题:"):].strip() + + logger.info("%d nodes and %d edges processed", len(_process_batch[0]), len(_process_batch[1])) + logger.info("Pre-length: %s", pre_length) + logger.info("Question: %s", question) + logger.info("Answer: %s", context) + + return { + compute_content_hash(context): { + "question": question, + "answer": context, + "loss": get_average_loss(_process_batch, traverse_strategy.loss_strategy) + } + } + + content = await llm_client.generate_answer( + QUESTION_GENERATION_PROMPT[language]['MULTI_TEMPLATE'].format( + doc=context + ) + ) + qas = _post_process_synthetic_data(content) + + if len(qas) == 0: + print(content) + logger.error("Error occurred while processing batch, question or answer is None") + return {} + + final_results = {} + logger.info("%d nodes and %d edges processed", len(_process_batch[0]), len(_process_batch[1])) + logger.info("Pre-length: %s", pre_length) + for qa in qas: + logger.info("Question: %s", qa['question']) + logger.info("Answer: %s", qa['answer']) + final_results[compute_content_hash(qa['question'])] = { + "question": qa['question'], + "answer": qa['answer'], + "loss": get_average_loss(_process_batch, traverse_strategy.loss_strategy) + } + return final_results + + results = {} + edges = list(await graph_storage.get_all_edges()) + nodes = list(await graph_storage.get_all_nodes()) + + edges, nodes = await _pre_tokenize(graph_storage, tokenizer, edges, nodes) + + processing_batches = await get_batches_with_strategy( + nodes, + edges, + graph_storage, + traverse_strategy + ) + + for result in tqdm_async(asyncio.as_completed( + [_process_single_batch(batch) for batch in processing_batches] + ), total=len(processing_batches), desc="[4/4]Generating QAs"): + try: + if progress_bar is not None: + progress_bar(len(results) / len(processing_batches), desc="[4/4]Generating QAs") + results.update(await result) + if progress_bar is not None and len(results) == len(processing_batches): + progress_bar(1, desc="[4/4]Generating QAs") + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while generating QA: %s", e) + + return results + + +async def traverse_graph_atomically( + llm_client: OpenAIModel, + tokenizer: Tokenizer, + graph_storage: NetworkXStorage, + traverse_strategy: TraverseStrategy, + text_chunks_storage: JsonKVStorage, + progress_bar: gr.Progress = None, + max_concurrent: int = 1000 +) -> dict: + """ + Traverse the graph atomicly + + :param llm_client + :param tokenizer + :param graph_storage + :param traverse_strategy + :param text_chunks_storage + :param progress_bar + :param max_concurrent + :return: question and answer + """ + assert traverse_strategy.qa_form == "atomic" + + semaphore = asyncio.Semaphore(max_concurrent) + async def _generate_question( + node_or_edge: tuple + ): + if len(node_or_edge) == 2: + des = node_or_edge[0] + ": " + node_or_edge[1]['description'] + loss = node_or_edge[1]['loss'] + else: + des = node_or_edge[2]['description'] + loss = node_or_edge[2]['loss'] + + async with semaphore: + try: + language = "Chinese" if detect_main_language(des) == "zh" else "English" + + qa = await llm_client.generate_answer( + QUESTION_GENERATION_PROMPT[language]['SINGLE_QA_TEMPLATE'].format( + doc=des + ) + ) + + if "Question:" in qa and "Answer:" in qa: + question = qa.split("Question:")[1].split("Answer:")[0].strip() + answer = qa.split("Answer:")[1].strip() + elif "问题:" in qa and "答案:" in qa: + question = qa.split("问题:")[1].split("答案:")[0].strip() + answer = qa.split("答案:")[1].strip() + else: + return {} + + question = question.strip("\"") + answer = answer.strip("\"") + + logger.info("Question: %s", question) + logger.info("Answer: %s", answer) + return { + compute_content_hash(question): { + "question": question, + "answer": answer, + "loss": loss + } + } + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while generating question: %s", e) + return {} + + results = {} + edges = list(await graph_storage.get_all_edges()) + nodes = list(await graph_storage.get_all_nodes()) + + edges, nodes = await _pre_tokenize(graph_storage, tokenizer, edges, nodes) + + tasks = [] + for node in nodes: + if "" in node[1]['description']: + description_list = node[1]['description'].split("") + for item in description_list: + tasks.append((node[0], {"description": item, 'loss': node[1]['loss']})) + else: + tasks.append((node[0], node[1])) + for edge in edges: + if "" in edge[2]['description']: + description_list = edge[2]['description'].split("") + for item in description_list: + tasks.append((edge[0], edge[1], {"description": item, 'loss': edge[2]['loss']})) + else: + tasks.append((edge[0], edge[1], edge[2])) + + for result in tqdm_async( + asyncio.as_completed([_generate_question(task) for task in tasks]), + total=len(tasks), + desc="[4/4]Generating QAs" + ): + try: + if progress_bar is not None: + progress_bar(len(results) / len(tasks), desc="[4/4]Generating QAs") + results.update(await result) + if progress_bar is not None and len(results) == len(tasks): + progress_bar(1, desc="[4/4]Generating QAs") + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while generating QA: %s", e) + return results + +async def traverse_graph_for_multi_hop( + llm_client: OpenAIModel, + tokenizer: Tokenizer, + graph_storage: NetworkXStorage, + traverse_strategy: TraverseStrategy, + text_chunks_storage: JsonKVStorage, + progress_bar: gr.Progress = None, + max_concurrent: int = 1000 +) -> dict: + """ + Traverse the graph for multi-hop + + :param llm_client + :param tokenizer + :param graph_storage + :param traverse_strategy + :param text_chunks_storage + :param progress_bar + :param max_concurrent + :return: question and answer + """ + assert traverse_strategy.qa_form == "multi_hop" + + semaphore = asyncio.Semaphore(max_concurrent) + + results = {} + edges = list(await graph_storage.get_all_edges()) + nodes = list(await graph_storage.get_all_nodes()) + + edges, nodes = await _pre_tokenize(graph_storage, tokenizer, edges, nodes) + + processing_batches = await get_batches_with_strategy( + nodes, + edges, + graph_storage, + traverse_strategy + ) + + async def _process_single_batch( + _process_batch: tuple + ) -> dict: + async with semaphore: + try: + language = "Chinese" if detect_main_language(_process_batch[0][0]['description']) == "zh" else "English" + + _process_nodes = _process_batch[0] + _process_edges = _process_batch[1] + + entities = [ + f"{_process_node['node_id']}: {_process_node['description']}" for _process_node in _process_nodes + ] + + relations = [ + f"{_process_edge[0]} -- {_process_edge[1]}: {_process_edge[2]['description']}" + for _process_edge in _process_edges + ] + + entities_str = "\n".join([f"{index + 1}. {entity}" for index, entity in enumerate(entities)]) + relations_str = "\n".join([f"{index + 1}. {relation}" for index, relation in enumerate(relations)]) + + prompt = MULTI_HOP_GENERATION_PROMPT[language].format( + entities=entities_str, + relationships=relations_str + ) + + context = await llm_client.generate_answer(prompt) + + # post-process the context + if "Question:" in context and "Answer:" in context: + question = context.split("Question:")[1].split("Answer:")[0].strip() + answer = context.split("Answer:")[1].strip() + elif "问题:" in context and "答案:" in context: + question = context.split("问题:")[1].split("答案:")[0].strip() + answer = context.split("答案:")[1].strip() + else: + return {} + + question = question.strip("\"") + answer = answer.strip("\"") + + logger.info("Question: %s", question) + logger.info("Answer: %s", answer) + + return { + compute_content_hash(question): { + "question": question, + "answer": answer, + "loss": get_average_loss(_process_batch, traverse_strategy.loss_strategy), + } + } + + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while processing batch: %s", e) + return {} + + async for result in tqdm_async( + asyncio.as_completed([_process_single_batch(batch) for batch in processing_batches]), + total=len(processing_batches), + desc="[4/4]Generating QAs" + ): + try: + if progress_bar is not None: + progress_bar(len(results) / len(processing_batches), desc="[4/4]Generating QAs") + results.update(await result) + if progress_bar is not None and len(results) == len(processing_batches): + progress_bar(1, desc="[4/4]Generating QAs") + except Exception as e: # pylint: disable=broad-except + logger.error("Error occurred while generating QA: %s", e) + return results diff --git a/graphgen/templates/__init__.py b/graphgen/templates/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..6e362d081792fa6beaf74f3ea1ca8fa846a3bf1b --- /dev/null +++ b/graphgen/templates/__init__.py @@ -0,0 +1,9 @@ +from .kg_extraction import KG_EXTRACTION_PROMPT +from .kg_summarization import KG_SUMMARIZATION_PROMPT +from .search_judgement import SEARCH_JUDGEMENT_PROMPT +from .description_rephrasing import DESCRIPTION_REPHRASING_PROMPT +from .statement_judgement import STATEMENT_JUDGEMENT_PROMPT +from .answer_rephrasing import ANSWER_REPHRASING_PROMPT +from .question_generation import QUESTION_GENERATION_PROMPT +from .multi_hop_generation import MULTI_HOP_GENERATION_PROMPT +from .coreference_resolution import COREFERENCE_RESOLUTION_TEMPLATE diff --git a/graphgen/templates/answer_rephrasing.py b/graphgen/templates/answer_rephrasing.py new file mode 100644 index 0000000000000000000000000000000000000000..a33e9d9e0b0e2278fb3dec1a7fc144784b995887 --- /dev/null +++ b/graphgen/templates/answer_rephrasing.py @@ -0,0 +1,219 @@ +TEMPLATE_CONTEXT_EN: str = """---Role--- + +You are an NLP expert responsible for generating a logically structured and coherent rephrased version of the TEXT based on ENTITIES and RELATIONSHIPS provided below. You may refer to the original text to assist in generating the rephrased version, but ensure that the final output text meets the requirements. +Use {language} as output language. + +---Goal--- +To generate a version of the text that is rephrased and conveys the same meaning as the original entity and relationship descriptions, while: +1. Following a clear logical flow and structure +2. Establishing proper cause-and-effect relationships +3. Ensuring temporal and sequential consistency +4. Creating smooth transitions between ideas using conjunctions and appropriate linking words like "firstly," "however," "therefore," etc. + +---Instructions--- +1. Analyze the provided ENTITIES and RELATIONSHIPS carefully to identify: + - Key concepts and their hierarchies + - Temporal sequences and chronological order + - Cause-and-effect relationships + - Dependencies between different elements + +2. Organize the information in a logical sequence by: + - Starting with foundational concepts + - Building up to more complex relationships + - Grouping related ideas together + - Creating clear transitions between sections + +3. Rephrase the text while maintaining: + - Logical flow and progression + - Clear connections between ideas + - Proper context and background + - Coherent narrative structure + +4. Review and refine the text to ensure: + - Logical consistency throughout + - Clear cause-and-effect relationships + +################ +-ORIGINAL TEXT- +################ +{original_text} + +################ +-ENTITIES- +################ +{entities} + +################ +-RELATIONSHIPS- +################ +{relationships} + +""" + +TEMPLATE_CONTEXT_ZH: str = """---角色--- + +你是一位NLP专家,负责根据下面提供的实体和关系生成逻辑结构清晰且连贯的文本重述版本。你可以参考原始文本辅助生成,但需要确保最终输出的文本符合要求。 +使用{language}作为输出语言。 + +---目标--- + +生成文本的重述版本,使其传达与原始实体和关系描述相同的含义,同时: +1. 遵循清晰的逻辑流和结构 +2. 建立适当的因果关系 +3. 确保时间和顺序的一致性 +4. 使用连词和适当的连接词(如"首先"、"然而"、"因此"等)创造流畅的过渡 + +---说明--- +1. 仔细分析提供的实体和关系,以识别: + - 关键概念及其层级关系 + - 时间序列和时间顺序 + - 因果关系 + - 不同元素之间的依赖关系 +2. 通过以下方式将信息组织成逻辑顺序: + - 从基础概念开始 + - 逐步建立更复杂的关系 + - 将相关的想法分组在一起 + - 在各部分之间创建清晰的过渡 +3. 重述文本时保持: + - 逻辑流畅 + - 概念之间的清晰联系 + - 适当的上下文和背景 + - 连贯的叙述结构 +4. 检查和完善文本以确保: + - 整体逻辑一致性 + - 清晰的因果关系 + +################ +-原始文本- +################ +{original_text} + +################ +-实体- +################ +{entities} + +################ +-关系- +################ +{relationships} + +""" + +TEMPLATE_EN: str = """---Role--- + +You are an NLP expert responsible for generating a logically structured and coherent rephrased version of the TEXT based on ENTITIES and RELATIONSHIPS provided below. +Use {language} as output language. + +---Goal--- +To generate a version of the text that is rephrased and conveys the same meaning as the original entity and relationship descriptions, while: +1. Following a clear logical flow and structure +2. Establishing proper cause-and-effect relationships +3. Ensuring temporal and sequential consistency +4. Creating smooth transitions between ideas using conjunctions and appropriate linking words like "firstly," "however," "therefore," etc. + +---Instructions--- +1. Analyze the provided ENTITIES and RELATIONSHIPS carefully to identify: + - Key concepts and their hierarchies + - Temporal sequences and chronological order + - Cause-and-effect relationships + - Dependencies between different elements + +2. Organize the information in a logical sequence by: + - Starting with foundational concepts + - Building up to more complex relationships + - Grouping related ideas together + - Creating clear transitions between sections + +3. Rephrase the text while maintaining: + - Logical flow and progression + - Clear connections between ideas + - Proper context and background + - Coherent narrative structure + +4. Review and refine the text to ensure: + - Logical consistency throughout + - Clear cause-and-effect relationships + +################ +-ENTITIES- +################ +{entities} + +################ +-RELATIONSHIPS- +################ +{relationships} + +""" + +TEMPLATE_ZH: str = """---角色--- + +你是一位NLP专家,负责根据下面提供的实体和关系生成逻辑结构清晰且连贯的文本重述版本。 +使用{language}作为输出语言。 + +---目标--- + +生成文本的重述版本,使其传达与原始实体和关系描述相同的含义,同时: +1. 遵循清晰的逻辑流和结构 +2. 建立适当的因果关系 +3. 确保时间和顺序的一致性 +4. 使用连词和适当的连接词(如"首先"、"然而"、"因此"等)创造流畅的过渡 + +---说明--- +1. 仔细分析提供的实体和关系,以识别: + - 关键概念及其层级关系 + - 时间序列和时间顺序 + - 因果关系 + - 不同元素之间的依赖关系 +2. 通过以下方式将信息组织成逻辑顺序: + - 从基础概念开始 + - 逐步建立更复杂的关系 + - 将相关的想法分组在一起 + - 在各部分之间创建清晰的过渡 +3. 重述文本时保持: + - 逻辑流畅 + - 概念之间的清晰联系 + - 适当的上下文和背景 + - 连贯的叙述结构 +4. 检查和完善文本以确保: + - 整体逻辑一致性 + - 清晰的因果关系 + +################ +-实体- +################ +{entities} + +################ +-关系- +################ +{relationships} + +""" + +REQUIREMENT_ZH = """ +################ +请在下方直接输出连贯的重述文本,不要输出任何额外的内容。 + +重述文本: +""" + +REQUIREMENT_EN = """ +################ +Please directly output the coherent rephrased text below, without any additional content. + +Rephrased Text: +""" + + +ANSWER_REPHRASING_PROMPT= { + "English": { + "TEMPLATE": TEMPLATE_EN + REQUIREMENT_EN, + "CONTEXT_TEMPLATE": TEMPLATE_CONTEXT_EN + REQUIREMENT_EN + }, + "Chinese": { + "TEMPLATE": TEMPLATE_ZH + REQUIREMENT_ZH, + "CONTEXT_TEMPLATE": TEMPLATE_CONTEXT_ZH + REQUIREMENT_ZH + } +} diff --git a/graphgen/templates/coreference_resolution.py b/graphgen/templates/coreference_resolution.py new file mode 100644 index 0000000000000000000000000000000000000000..b29394ad6b6916fa95e6ce35e4df20cb6981c801 --- /dev/null +++ b/graphgen/templates/coreference_resolution.py @@ -0,0 +1,39 @@ +# pylint: disable=C0301 +TEMPLATE_ZH: str = """请根据参考文本识别并消解文本中的指代词,明确每个代词所指代的具体实体,并直接输出消解后的文本。 + +-示例- +输入: +小明和小红一起去公园。她们玩得很开心。之后,他们去吃冰淇淋。 +输出: +小明和小红一起去公园。小明和小红玩得很开心。之后,小明和小红去吃冰淇淋。 + +-真实数据- +参考文本: +{reference} +输入: +{input_sentence} +请直接输出改写后的句子,不要输出任何额外信息。 +输出: +""" + +TEMPLATE_EN: str = """Please identify and resolve the pronouns in the reference text, specify the specific entities referred to by each pronoun, and directly output the resolved text. + +-Example- +Input: +John and Mary went to the park. They had a great time. Later, they went to eat ice cream. +Output: +John and Mary went to the park. John and Mary had a great time. Later, John and Mary went to eat ice cream. + +-Real Data- +Reference text: +{reference} +Input: +{input_sentence} +Please directly output the rewritten sentence without any additional information. +Output: +""" + +COREFERENCE_RESOLUTION_TEMPLATE = { + "en": TEMPLATE_EN, + "zh": TEMPLATE_ZH +} diff --git a/graphgen/templates/description_rephrasing.py b/graphgen/templates/description_rephrasing.py new file mode 100644 index 0000000000000000000000000000000000000000..a0e38012347f8d24237afda47497faed34ad5e67 --- /dev/null +++ b/graphgen/templates/description_rephrasing.py @@ -0,0 +1,121 @@ +ANTI_TEMPLATE_EN: str = """-Goal- +Transform the input sentence into its opposite meaning while: + +1. Preserving most of the original sentence structure +2. Changing only key words that affect the core meaning +3. Maintaining the same tone and style +4. The input sentence provided is a right description, and the output sentence should be a wrong description +5. The output sentence should be fluent and grammatically correct + +################ +-Examples- +################ +Input: +The bright sunshine made everyone feel energetic and happy. + +Output: +The bright sunshine made everyone feel tired and sad. + +################ +-Real Data- +################ +Input: +{input_sentence} +################ +Please directly output the rewritten sentence without any additional information. +Output: +""" + +ANTI_TEMPLATE_ZH: str = """-目标- +将输入句子转换为相反含义的句子,同时: + +1. 保留大部分原始句子结构 +2. 仅更改影响核心含义的关键词 +3. 保持相同的语气和风格 +4. 提供的输入句子是一个正确的描述,输出句子应该是一个错误的描述 +5. 输出句子应该流畅且语法正确 + +################ +-示例- +################ +输入: +明亮的阳光让每个人都感到充满活力和快乐。 + +输出: +明亮的阳光让每个人都感到疲惫和悲伤。 + +################ +-真实数据- +################ +输入: +{input_sentence} +################ +请直接输出改写后的句子,不要输出任何额外信息。 +输出: +""" + +TEMPLATE_ZH: str = """-目标- +将输入句子转换为相同含义的句子,同时: + +1. 保留大部分原始句子结构 +2. 仅更改影响核心含义的关键词 +3. 保持相同的语气和风格 +4. 输出句子应该流畅且语法正确 + +################ +-示例- +################ +输入: +明亮的阳光让每个人都感到充满活力和快乐。 + +输出: +明媚的阳光让每个人都感受到活力与快乐。 + +################ +-真实数据- +################ +输入: +{input_sentence} +################ +请直接输出改写后的句子,不要输出任何额外信息。 +输出: +""" + +TEMPLATE_EN: str = """-Goal- +Transform the input sentence into a sentence with the same meaning while: + +1. Preserving most of the original sentence structure +2. Changing only key words that affect the core meaning +3. Maintaining the same tone and style +4. The output sentence should be fluent and grammatically correct + +################ +-Examples- +################ +Input: +The bright sunshine made everyone feel energetic and happy. + +Output: +The bright sunshine made everyone feel energetic and joyful. + +################ +-Real Data- +################ +Input: +{input_sentence} +################ +Please directly output the rewritten sentence without any additional information. +Output: +""" + + +DESCRIPTION_REPHRASING_PROMPT= { + "English": { + "ANTI_TEMPLATE": ANTI_TEMPLATE_EN, + "TEMPLATE": TEMPLATE_EN + }, + "Chinese": { + "ANTI_TEMPLATE": ANTI_TEMPLATE_ZH, + "TEMPLATE": TEMPLATE_ZH + } +} diff --git a/graphgen/templates/kg_extraction.py b/graphgen/templates/kg_extraction.py new file mode 100644 index 0000000000000000000000000000000000000000..8d98bb9593c1dcc6b5ddba7db06ff397dd16fb9c --- /dev/null +++ b/graphgen/templates/kg_extraction.py @@ -0,0 +1,210 @@ +# pylint: disable=C0301 + +TEMPLATE_EN: str = """You are an NLP expert, skilled at analyzing text to extract named entities and their relationships. + +-Goal- +Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities. +Use {language} as output language. + +-Steps- +1. Identify all entities. For each identified entity, extract the following information: +- entity_name: Name of the entity, use same language as input text. If English, capitalized the name. +- entity_type: One of the following types: [{entity_types}] +- entity_summary: Comprehensive summary of the entity's attributes and activities +Format each entity as ("entity"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other. +For each pair of related entities, extract the following information: +- source_entity: name of the source entity, as identified in step 1 +- target_entity: name of the target entity, as identified in step 1 +- relationship_summary: explanation as to why you think the source entity and the target entity are related to each other +Format each relationship as ("relationship"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +3. Identify high-level key words that summarize the main concepts, themes, or topics of the entire text. These should capture the overarching ideas present in the document. +Format the content-level key words as ("content_keywords"{tuple_delimiter}) + +4. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter. + +5. When finished, output {completion_delimiter} + +################ +-Examples- +################ +-Example 1- +Text: +################ +In the second century of the Christian Era, the empire of Rome comprehended the fairest part of the earth, and the most civilized portion of mankind. The frontiers of that extensive monarchy were guarded by ancient renown and disciplined valor. The gentle but powerful influence of laws and manners had gradually cemented the union of the provinces. Their peaceful inhabitants enjoyed and abused the advantages of wealth and luxury. The image of a free constitution was preserved with decent reverence: the Roman senate appeared to possess the sovereign authority, and devolved on the emperors all the executive powers of government. During a happy period of more than fourscore years, the public administration was conducted by the virtue and abilities of Nerva, Trajan, Hadrian, and the two Antonines. +################ +Output: +("entity"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"organization"{tuple_delimiter}"The dominant empire of the second century CE, encompassing the most developed regions of the known world."){record_delimiter} +("entity"{tuple_delimiter}"Second Century CE"{tuple_delimiter}"date"{tuple_delimiter}"Time period of the Christian Era when the Roman Empire was at its height."){record_delimiter} +("entity"{tuple_delimiter}"Rome"{tuple_delimiter}"location"{tuple_delimiter}"The capital and heart of the Roman Empire."){record_delimiter} +("entity"{tuple_delimiter}"Roman Senate"{tuple_delimiter}"organization"{tuple_delimiter}"Legislative body that appeared to hold sovereign authority in Rome."){record_delimiter} +("entity"{tuple_delimiter}"Nerva"{tuple_delimiter}"person"{tuple_delimiter}"Roman emperor who contributed to the public administration during a prosperous period."){record_delimiter} +("entity"{tuple_delimiter}"Trajan"{tuple_delimiter}"person"{tuple_delimiter}"Roman emperor known for his virtue and administrative abilities."){record_delimiter} +("entity"{tuple_delimiter}"Hadrian"{tuple_delimiter}"person"{tuple_delimiter}"Roman emperor who governed during the empire's peaceful period."){record_delimiter} +("entity"{tuple_delimiter}"Antonines"{tuple_delimiter}"person"{tuple_delimiter}"Two Roman emperors who ruled during a period of prosperity and good governance."){record_delimiter} +("entity"{tuple_delimiter}"Roman Law"{tuple_delimiter}"concept"{tuple_delimiter}"System of laws and manners that unified the provinces of the Roman Empire."){record_delimiter} +("relationship"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"Roman Law"{tuple_delimiter}"The empire was unified and maintained through the influence of its laws and customs."){record_delimiter} +("relationship"{tuple_delimiter}"Roman Senate"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"The Senate appeared to possess sovereign authority while delegating executive powers to emperors."){record_delimiter} +("relationship"{tuple_delimiter}"Nerva"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"Nerva was one of the emperors who contributed to the empire's successful administration."){record_delimiter} +("relationship"{tuple_delimiter}"Trajan"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"Trajan was one of the emperors who governed during the empire's prosperous period."){record_delimiter} +("relationship"{tuple_delimiter}"Hadrian"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"Hadrian was one of the emperors who managed the empire's administration effectively."){record_delimiter} +("relationship"{tuple_delimiter}"Antonines"{tuple_delimiter}"Roman Empire"{tuple_delimiter}"The Antonines were emperors who helped maintain the empire's prosperity through their governance."){record_delimiter} +("content_keywords"{tuple_delimiter}"Roman governance, imperial prosperity, law and order, civilized society"){completion_delimiter} + +-Example 2- +Text: +############# +Overall, the analysis of the OsDT11 sequence demonstrated that this protein belongs to the CRP family. Since OsDT11 is predicted to be a secreted protein, the subcellular localization of OsDT11 was determined by fusing the OsDT11 ORF to RFP in a p35S::RFP vector by in vivo protein targeting in NB epidermal cells by performing an Agrobacterium tumefaciens-mediated transient assay. After incubation for 48 h, the RFP signals were mainly detected in the cell-wall of OsDT11-RFP transformed cells, while the control cells (transformed with the RFP construct) displayed ubiquitous RFP signals, demonstrating that OsDT11 is a secreted signal peptide. Moreover, when the infiltrated leaf sections were plasmolyzed, the OsDT11-RFP fusion proteins were located on the cell wall. +############# +Output: +("entity"{tuple_delimiter}"OsDT11"{tuple_delimiter}"gene"{tuple_delimiter}"A protein sequence belonging to the CRP family, demonstrated to be a secreted signal peptide that localizes to cell walls."){record_delimiter} +("entity"{tuple_delimiter}"CRP family"{tuple_delimiter}"science"{tuple_delimiter}"A protein family to which OsDT11 belongs, characterized by specific structural and functional properties."){record_delimiter} +("entity"{tuple_delimiter}"RFP"{tuple_delimiter}"technology"{tuple_delimiter}"Red Fluorescent Protein, used as a fusion marker to track protein localization in cells."){record_delimiter} +("entity"{tuple_delimiter}"p35S::RFP vector"{tuple_delimiter}"technology"{tuple_delimiter}"A genetic construct used for protein expression and visualization studies, containing the 35S promoter and RFP marker."){record_delimiter} +("entity"{tuple_delimiter}"NB epidermal cells"{tuple_delimiter}"nature"{tuple_delimiter}"Plant epidermal cells used as the experimental system for protein localization studies."){record_delimiter} +("entity"{tuple_delimiter}"Agrobacterium tumefaciens"{tuple_delimiter}"nature"{tuple_delimiter}"A bacteria species used for transferring genetic material into plant cells in laboratory experiments."){record_delimiter} +("relationship"{tuple_delimiter}"OsDT11"{tuple_delimiter}"CRP family"{tuple_delimiter}"OsDT11 is identified as a member of the CRP family through sequence analysis."){record_delimiter} +("relationship"{tuple_delimiter}"OsDT11"{tuple_delimiter}"RFP"{tuple_delimiter}"OsDT11 was fused to RFP to study its cellular localization."){record_delimiter} +("relationship"{tuple_delimiter}"Agrobacterium tumefaciens"{tuple_delimiter}"NB epidermal cells"{tuple_delimiter}"Agrobacterium tumefaciens was used to transfer genetic material into NB epidermal cells through a transient assay."){record_delimiter} +("relationship"{tuple_delimiter}"OsDT11"{tuple_delimiter}"NB epidermal cells"{tuple_delimiter}"OsDT11's subcellular localization was studied in NB epidermal cells, showing cell wall targeting."){record_delimiter} +("content_keywords"{tuple_delimiter}"protein localization, gene expression, cellular biology, molecular techniques"){completion_delimiter} + +################ +-Real Data- +################ +Entity_types: {entity_types} +Text: {input_text} +################ +Output: +""" + + +TEMPLATE_ZH: str = """你是一个NLP专家,擅长分析文本提取命名实体和关系。 + +-目标- +给定一个实体类型列表和可能与列表相关的文本,从文本中识别所有这些类型的实体,以及这些实体之间所有的关系。 +使用{language}作为输出语言。 + +-步骤- +1. 识别所有实体。对于每个识别的实体,提取以下信息: + - entity_name:实体的名称,首字母大写 + - entity_type:以下类型之一:[{entity_types}] + - entity_summary:实体的属性与活动的全面总结 + 将每个实体格式化为("entity"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +2. 从步骤1中识别的实体中,识别所有(源实体,目标实体)对,这些实体彼此之间*明显相关*。 + 对于每对相关的实体,提取以下信息: + - source_entity:步骤1中识别的源实体名称 + - target_entity:步骤1中识别的目标实体名称 + - relationship_summary:解释为什么你认为源实体和目标实体彼此相关 + 将每个关系格式化为("relationship"{tuple_delimiter}{tuple_delimiter}{tuple_delimiter}) + +3. 识别总结整个文本的主要概念、主题或话题的高级关键词。这些应该捕捉文档中存在的总体思想。 + 将内容级关键词格式化为("content_keywords"{tuple_delimiter}) + +4. 以中文返回步骤1和2中识别出的所有实体和关系的输出列表。使用**{record_delimiter}**作为列表分隔符。 + +5. 完成后,输出{completion_delimiter} + +################ +-示例- +################ +-示例 1- +文本: +################ +鲁镇的酒店的格局,是和别处不同的:都是当街一个曲尺形的大柜台,柜里面预备着热水,可以随时温酒。做工的人,傍午傍晚散了工,每每花四文铜钱,买一碗酒,——这是二十多年前的事,现在每碗要涨到十文,——靠柜外站着,热热的喝了休息;倘肯多花一文,便可以买一碟盐煮笋,或者茴香豆,做下酒物了,如果出到十几文,那就能买一样荤菜,但这些顾客,多是短衣帮,大抵没有这样阔绰。只有穿长衫的,才踱进店面隔壁的房子里,要酒要菜,慢慢地坐喝。 +################ +输出: +("entity"{tuple_delimiter}"鲁镇的酒店"{tuple_delimiter}"location"{tuple_delimiter}"鲁镇的酒店是一个特定地点,其格局独特,柜台形状为曲尺形,提供热水温酒服务。"){record_delimiter} +("entity"{tuple_delimiter}"曲尺形的大柜台"{tuple_delimiter}"keyword"{tuple_delimiter}"曲尺形的大柜台是鲁镇酒店内独特的设施,用于提供服务。"){record_delimiter} +("entity"{tuple_delimiter}"热水温酒"{tuple_delimiter}"keyword"{tuple_delimiter}"热水温酒是鲁镇酒店提供的一项服务,顾客可以随时温酒。"){record_delimiter} +("entity"{tuple_delimiter}"做工的人"{tuple_delimiter}"person"{tuple_delimiter}"做工的人是鲁镇酒店的常客,通常在工作结束后花四文铜钱买一碗酒,有时还会买一些下酒菜。"){record_delimiter} +("entity"{tuple_delimiter}"二十多年前的事"{tuple_delimiter}"date"{tuple_delimiter}"二十多年前的事是指过去的时间点,当时一碗酒的价格为四文铜钱。"){record_delimiter} +("entity"{tuple_delimiter}"现在"{tuple_delimiter}"date"{tuple_delimiter}"现在是指当前的时间点,与过去相比,一碗酒的价格涨到了十文。"){record_delimiter} +("entity"{tuple_delimiter}"短衣帮"{tuple_delimiter}"concept"{tuple_delimiter}"短衣帮是指做工的人,他们通常穿着短衣,经济条件有限。"){record_delimiter} +("entity"{tuple_delimiter}"穿长衫的"{tuple_delimiter}"person"{tuple_delimiter}"穿长衫的是鲁镇酒店的另一类顾客,他们经济条件较好,通常会进入店面隔壁的房间慢慢喝酒吃菜。"){record_delimiter} +("entity"{tuple_delimiter}"盐煮笋"{tuple_delimiter}"food"{tuple_delimiter}"盐煮笋是鲁镇酒店提供的一种下酒菜,顾客可以花一文铜钱购买。"){record_delimiter} +("entity"{tuple_delimiter}"茴香豆"{tuple_delimiter}"food"{tuple_delimiter}"茴香豆是鲁镇酒店提供的另一种下酒菜,顾客可以花一文铜钱购买。"){record_delimiter} +("entity"{tuple_delimiter}"荤菜"{tuple_delimiter}"food"{tuple_delimiter}"荤菜是鲁镇酒店提供的较为昂贵的菜品,顾客需要花十几文铜钱购买。"){record_delimiter} +("relationship"{tuple_delimiter}"鲁镇的酒店"{tuple_delimiter}"曲尺形的大柜台"{tuple_delimiter}"鲁镇的酒店内设有一个曲尺形的大柜台,用于提供服务。"){record_delimiter} +("relationship"{tuple_delimiter}"鲁镇的酒店"{tuple_delimiter}"热水温酒"{tuple_delimiter}"鲁镇的酒店提供热水温酒服务,顾客可以随时温酒。"){record_delimiter} +("relationship"{tuple_delimiter}"做工的人"{tuple_delimiter}"二十多年前的事"{tuple_delimiter}"做工的人在二十多年前花四文铜钱买一碗酒,反映了当时的生活成本。"){record_delimiter} +("relationship"{tuple_delimiter}"做工的人"{tuple_delimiter}"现在"{tuple_delimiter}"现在做工的人需要花十文铜钱买一碗酒,反映了物价的上涨。"){record_delimiter} +("relationship"{tuple_delimiter}"做工的人"{tuple_delimiter}"短衣帮"{tuple_delimiter}"做工的人属于短衣帮,通常经济条件有限。"){record_delimiter} +("relationship"{tuple_delimiter}"做工的人"{tuple_delimiter}"穿长衫的"{tuple_delimiter}"做工的人与穿长衫的形成对比,反映了社会阶层的差异。"){record_delimiter} +("relationship"{tuple_delimiter}"穿长衫的"{tuple_delimiter}"鲁镇的酒店"{tuple_delimiter}"穿长衫的顾客通常会进入鲁镇酒店的房间慢慢喝酒吃菜,享受更高级的服务。"){record_delimiter} +("content_keywords"{tuple_delimiter}"社会分层, 经济差距, 服务, 生活成本, 历史背景"){completion_delimiter} + +-示例 2- +文本: +################ +黄华占是感温型常规稻品种,2016—2017 年在铅山县汪二镇作中稻示范种植综合表现优良。结合示范情况,对黄华占的特征特性作简单总结,在此基础上提出高产栽培技术,以期为该品种的推广种植提供参考。近年来,铅山县粮食生产紧紧围绕“稳产、优质、增效”的总体要求、大力实施优质稻推广,积极引导粮食生产由增产转向提质。我国杂交水稻技术世界领先、优质稻品种众多,在市场走势方面(尤其稻米行情清淡期),人们习惯性地北涨看长粒香、南涨看黄华占。黄华占是广东省农业科学院水稻研究所以黄新占/丰华占为亲本选育而成,分别通过粤、湘、鄂、浙、桂、琼等省审定。为了更好、更快地推广黄华占水稻,铅山县分别于2016 年、2017 年在汪二镇火田村试验示范种植黄华占近 5.87 hm^2 ,综合表现优良。现将黄华占水稻的特征特性及高产栽培技术介绍如下。 +################ +输出: +("entity"{tuple_delimiter}"黄华占"{tuple_delimiter}"work"{tuple_delimiter}"黄华占是一种感温型常规稻品种,由广东省农业科学院水稻研究所选育,通过多个省份审定,2016-2017年在铅山县汪二镇进行示范种植,表现优良。"){record_delimiter} +("entity"{tuple_delimiter}"2016—2017年"{tuple_delimiter}"date"{tuple_delimiter}"2016—2017年是黄华占在铅山县汪二镇进行示范种植的时间段。"){record_delimiter} +("entity"{tuple_delimiter}"铅山县"{tuple_delimiter}"location"{tuple_delimiter}"铅山县位于中国江西省,是黄华占水稻示范种植的地点之一。"){record_delimiter} +("entity"{tuple_delimiter}"汪二镇"{tuple_delimiter}"location"{tuple_delimiter}"汪二镇是铅山县的一个镇,2016-2017年在此进行了黄华占水稻的示范种植。"){record_delimiter} +("entity"{tuple_delimiter}"火田村"{tuple_delimiter}"location"{tuple_delimiter}"火田村是汪二镇的一个村庄,2016-2017年在此进行了黄华占水稻的试验示范种植。"){record_delimiter} +("entity"{tuple_delimiter}"广东省农业科学院水稻研究所"{tuple_delimiter}"organization"{tuple_delimiter}"广东省农业科学院水稻研究所是中国的一个科研机构,负责黄华占水稻的选育工作。"){record_delimiter} +("entity"{tuple_delimiter}"黄新占/丰华占"{tuple_delimiter}"work"{tuple_delimiter}"黄新占和丰华占是黄华占水稻的亲本,用于选育黄华占。"){record_delimiter} +("entity"{tuple_delimiter}"粤、湘、鄂、浙、桂、琼等省"{tuple_delimiter}"location"{tuple_delimiter}"这些省份通过了黄华占水稻的审定,表明该品种在这些地区具有良好的适应性和推广潜力。"){record_delimiter} +("entity"{tuple_delimiter}"高产栽培技术"{tuple_delimiter}"technology"{tuple_delimiter}"高产栽培技术是指为了提高黄华占水稻产量而采用的一系列农业技术措施。"){record_delimiter} +("entity"{tuple_delimiter}"稳产、优质、增效"{tuple_delimiter}"concept"{tuple_delimiter}"这是铅山县粮食生产的主要目标,强调了粮食生产的稳定、质量和效益。"){record_delimiter} +("entity"{tuple_delimiter}"优质稻推广"{tuple_delimiter}"mission"{tuple_delimiter}"优质稻推广是铅山县粮食生产的一个重要任务,旨在提高稻米的质量和市场竞争力。"){record_delimiter} +("entity"{tuple_delimiter}"杂交水稻技术"{tuple_delimiter}"technology"{tuple_delimiter}"杂交水稻技术是中国领先的世界级农业技术,用于提高水稻的产量和质量。"){record_delimiter} +("entity"{tuple_delimiter}"北涨看长粒香、南涨看黄华占"{tuple_delimiter}"concept"{tuple_delimiter}"这是市场对不同地区优质稻品种的习惯性关注点,北方面对长粒香,南方面对黄华占。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"2016—2017年"{tuple_delimiter}"黄华占在2016—2017年期间在铅山县进行了示范种植,展示了其优良的特性。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"铅山县"{tuple_delimiter}"黄华占在铅山县进行了示范种植,表现出了优良的适应性和产量。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"汪二镇"{tuple_delimiter}"黄华占在汪二镇进行了示范种植,这是其在铅山县示范种植的一部分。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"火田村"{tuple_delimiter}"黄华占在火田村进行了试验示范种植,这是其在汪二镇示范种植的一部分。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"广东省农业科学院水稻研究所"{tuple_delimiter}"黄华占是由广东省农业科学院水稻研究所选育的,该研究所负责其研发工作。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"黄新占/丰华占"{tuple_delimiter}"黄华占的亲本是黄新占和丰华占,这些亲本用于选育黄华占。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"粤、湘、鄂、浙、桂、琼等省"{tuple_delimiter}"黄华占通过了这些省份的审定,表明其在这些地区的适应性和推广潜力。"){record_delimiter} +("relationship"{tuple_delimiter}"黄华占"{tuple_delimiter}"高产栽培技术"{tuple_delimiter}"高产栽培技术是为了提高黄华占水稻产量而开发的技术措施。"){record_delimiter} +("relationship"{tuple_delimiter}"铅山县"{tuple_delimiter}"稳产、优质、增效"{tuple_delimiter}"铅山县的粮食生产目标是稳产、优质、增效,这些目标指导了黄华占的示范种植。"){record_delimiter} +("relationship"{tuple_delimiter}"铅山县"{tuple_delimiter}"优质稻推广"{tuple_delimiter}"铅山县实施了优质稻推广计划,黄华占是该计划的一部分。"){record_delimiter} +("relationship"{tuple_delimiter}"杂交水稻技术"{tuple_delimiter}"北涨看长粒香、南涨看黄华占"{tuple_delimiter}"杂交水稻技术的发展使得黄华占等优质稻品种在市场中受到关注。"){record_delimiter} +("content_keywords"{tuple_delimiter}"黄华占, 水稻种植, 高产栽培技术, 优质稻推广, 地区适应性, 市场趋势, 技术影响"){completion_delimiter} + +-真实数据- +实体类型:{entity_types} +文本:{input_text} +################ +输出: +""" + +CONTINUE_EN: str = """MANY entities and relationships were missed in the last extraction. \ +Add them below using the same format: +""" + +CONTINUE_ZH: str = """很多实体和关系在上一次的提取中可能被遗漏了。请在下面使用相同的格式添加它们:""" + +IF_LOOP_EN: str = """It appears some entities and relationships may have still been missed. \ +Answer YES | NO if there are still entities and relationships that need to be added. +""" + +IF_LOOP_ZH: str = """看起来可能仍然遗漏了一些实体和关系。如果仍有实体和关系需要添加,请回答YES | NO。""" + +KG_EXTRACTION_PROMPT: dict = { + "English": { + "TEMPLATE": TEMPLATE_EN, + "CONTINUE": CONTINUE_EN, + "IF_LOOP": IF_LOOP_EN, + }, + "Chinese": { + "TEMPLATE": TEMPLATE_ZH, + "CONTINUE": CONTINUE_ZH, + "IF_LOOP": IF_LOOP_ZH, + }, + "FORMAT": { + "tuple_delimiter": "<|>", + "record_delimiter": "##", + "completion_delimiter": "<|COMPLETE|>", + "entity_types": "concept, date, location, keyword, organization, person, event, work, nature, artificial, \ +science, technology, mission, gene", + "language": "English", + }, +} diff --git a/graphgen/templates/kg_summarization.py b/graphgen/templates/kg_summarization.py new file mode 100644 index 0000000000000000000000000000000000000000..7cf751801f6d113527d2390a88f30121325cdc75 --- /dev/null +++ b/graphgen/templates/kg_summarization.py @@ -0,0 +1,45 @@ +TEMPLATE_EN = """You are an NLP expert responsible for generating a comprehensive summary of the data provided below. +Given one entity or relationship, and a list of descriptions, all related to the same entity or relationship. +Please concatenate all of these into a single, comprehensive description. Make sure to include information collected from all the descriptions. +If the provided descriptions are contradictory, please resolve the contradictions and provide a single, coherent summary. +Make sure it is written in third person, and include the entity names so we the have full context. +Use {language} as output language. + +####### +-Data- +Entities: {entity_name} +Description List: {description_list} +####### +Output: +""" + +TEMPLATE_ZH = """你是一个NLP专家,负责根据以下提供的数据生成综合摘要。 +给定一个实体或关系,以及一系列描述,所有描述都与同一实体或关系相关。 +请将所有这些描述整合成一个综合描述。确保包含所有描述中收集的信息。 +如果提供的描述是矛盾的,请解决这些矛盾并提供一个连贯的总结。 +确保以第三人称写作,并包含实体名称,以便我们有完整的上下文。 +使用{language}作为输出语言。 + +####### +-数据- +实体:{entity_name} +描述列表:{description_list} +####### +输出: +""" + + +KG_SUMMARIZATION_PROMPT = { + "Chinese": { + "TEMPLATE": TEMPLATE_ZH + }, + "English": { + "TEMPLATE": TEMPLATE_EN + }, + "FORMAT": { + "language": "English", + "tuple_delimiter": "<|>", + "record_delimiter": "##", + "completion_delimiter": "<|COMPLETE|>", + }, +} diff --git a/graphgen/templates/multi_hop_generation.py b/graphgen/templates/multi_hop_generation.py new file mode 100644 index 0000000000000000000000000000000000000000..dad2ee36204f8eae483a99d39d55c2b04ba879b9 --- /dev/null +++ b/graphgen/templates/multi_hop_generation.py @@ -0,0 +1,60 @@ +# pylint: disable=C0301 + +TEMPLATE_ZH: str = """请基于以下知识子图生成多跳推理问题和答案。你将获得一个知识子图,其中包含一系列实体、关系和事实。你的任务是提出一个问题,该问题需要经过多次推理才能回答。问题的答案应该是从给定的知识子图中推断出来的。确保问题的难度适中,需要多步推理才能回答。 + +例如: +######## +--实体-- +1. 苹果 +2. 水果 +3. 维生素C +######## +--关系-- +1. 苹果-水果:苹果是一种水果 +2. 水果-维生素C:水果中富含维生素C +######## +问题:通过吃苹果补充的什么物质,有助于维持健康? +答案:维生素C +######## + +######### +--实体-- +{entities} +######### +--关系-- +{relationships} +######### +直接输出生成的问题和答案,请不要直接复制示例问题和答案,不要输出无关内容。 +""" + +TEMPLATE_EN: str = """Please generate a multi-hop reasoning question and answer based on the following knowledge subgraph. You will be provided with a knowledge subgraph that contains a series of entities, relations, and facts. Your task is to generate a question that requires multiple steps of reasoning to answer. The answer to the question should be inferred from the given knowledge subgraph. Ensure that the question is of moderate difficulty and requires multiple steps of reasoning to answer. + +For example: +######## +--Entities-- +1. Apple +2. Fruit +3. Vitamin C +######## +--Relations-- +1. Apple-Fruit: Apple is a type of fruit +2. Fruit-Vitamin C: Fruits are rich in Vitamin C +######## +Question: What substance, obtained through eating apples, helps maintain health? +Answer: Vitamin C +######## + +######## +--Entities-- +{entities} +######## +--Relations-- +{relationships} +######## +Output the generated question and answer directly, please do not copy the example question and answer directly, and do not provide irrelevant information. +""" + +MULTI_HOP_GENERATION_PROMPT = { + "English": TEMPLATE_EN, + "Chinese": TEMPLATE_ZH +} diff --git a/graphgen/templates/question_generation.py b/graphgen/templates/question_generation.py new file mode 100644 index 0000000000000000000000000000000000000000..d9ca9128fad65c127f985080f887351cf2efe68e --- /dev/null +++ b/graphgen/templates/question_generation.py @@ -0,0 +1,78 @@ +# pylint: disable=C0301 +TEMPLATE_SINGLE_EN: str = """The answer to a question is provided. Please generate a question that corresponds to the answer. + +################ +Answer: +{answer} +################ +Question: +""" + +TEMPLATE_SINGLE_ZH: str = """下面提供了一个问题的答案,请生成一个与答案对应的问题。 + +################ +答案: +{answer} +################ +问题: +""" + +TEMPLATE_SINGLE_QA_EN: str = """You are given a text passage. Your task is to generate a question and answer (QA) pair based on the content of that text. +The answer should be accurate and directly derived from the text. Make sure the QA pair is relevant to the main theme or important details of the given text. +For example: +Question: What is the effect of overexpressing the BG1 gene on grain size and development? +Answer: Overexpression of the BG1 gene leads to significantly increased grain size, demonstrating its role in grain development. + +Question: What role does TAC4 play in the gravitropism of rice shoots? +Answer: TAC4 is a key regulator of gravitropism in rice shoots, promoting the bending of shoots towards the gravity vector. + +Here is the text passage you need to generate a QA pair for: +{doc} +""" + +TEMPLATE_SINGLE_QA_ZH: str = """给定一个文本段落。你的任务是根据该文本的内容生成一个问答(QA)对。 +答案应准确且直接从文本中得出。确保QA对与给定文本的主题或重要细节相关。 +例如: +问题:过表达BG1基因对谷粒大小和发育有什么影响? +答案:BG1基因的过表达显著增加了谷粒大小,表明其在谷物发育中的作用。 + +问题:TAC4在水稻茎的重力性状中扮演什么角色? +答案:TAC4是水稻茎重力性状的关键调节因子,促进茎向重力矢量弯曲。 + +以下是你需要为其生成QA对的文本段落: +{doc} +""" + +# TODO: 修改这里的prompt +TEMPLATE_MULTI_EN = """You are an assistant to help read a article and then rephrase it in a question answering format. The user will provide you with an article with its content. You need to generate a paraphrase of the same article in question and answer format with one tag of "Question: ..." followed by "Answer: ...". Remember to keep the meaning and every content of the article intact. + +Here is the format you should follow for your response: +Question: +Answer: + +Here is the article you need to rephrase: +{doc} +""" + +TEMPLATE_MULTI_ZH = """你是一位助手,帮助阅读一篇文章,然后以问答格式重述它。用户将为您提供一篇带有内容的文章。你需要以一个标签"问题:..."为开头,接着是"答案:...",生成一篇与原文章相同的问答格式的重述。请确保保持文章的意义和每个内容不变。 + +以下是你应该遵循的响应格式: +问题: <问题> +答案: <答案> + +以下是你需要重述的文章: +{doc} +""" + +QUESTION_GENERATION_PROMPT = { + "English": { + "SINGLE_TEMPLATE": TEMPLATE_SINGLE_EN, + "SINGLE_QA_TEMPLATE": TEMPLATE_SINGLE_QA_EN, + "MULTI_TEMPLATE": TEMPLATE_MULTI_EN + }, + "Chinese": { + "SINGLE_TEMPLATE": TEMPLATE_SINGLE_ZH, + "SINGLE_QA_TEMPLATE": TEMPLATE_SINGLE_QA_ZH, + "MULTI_TEMPLATE": TEMPLATE_MULTI_ZH + } +} diff --git a/graphgen/templates/search_judgement.py b/graphgen/templates/search_judgement.py new file mode 100644 index 0000000000000000000000000000000000000000..ca9e7e12fae76e27743edb4c753b60484aafd5d5 --- /dev/null +++ b/graphgen/templates/search_judgement.py @@ -0,0 +1,67 @@ +# pylint: disable=C0301 + +TEMPLATE: str = """-Goal- +Please select the most relevant search result for the given entity. +The name and description of the entity are provided. The search results are provided as a list. +Please select the most relevant search result from the list. If none of the search results are relevant, please select 'None of the above'. + +Steps: +1. Read the name and description of the entity. + +2. Read the search results. For each search result, compare it with the entity name and description to determine if it is relevant. + +3. Select the most relevant search result from the list. If none of the search results are relevant, select 'None of the above'. + +4. Output your selection directly, please do not provide any additional information. + +################ +-Examples- +################ +{examples} + +################ +-Real Data- +################ +Entity_name: {entity_name} +Description: {description} +Search Results: +{search_results} +################ +Output: +""" + +EXAMPLES = [ + """Example 1: +################ +Entity_name: Java +Description: Java is a high-level programming language developed by Sun Microsystems. It is used to create web applications, mobile applications, and enterprise software. +Search Results: +1. Java (programming language) +2. Java (island) +3. Java (software platform) +4. Java (drink) +5. Java (disambiguation) +6. None of the above +################ +Output: +1 +################""", + """Example 2: +################ +Entity_name: Apple +Description: Apple Inc. is an American multinational technology company that designs, manufactures, and sells consumer electronics, computer software, and online services. +Search Results: +1. Apple (fruit) +2. Apple Inc. +3. Apple (disambiguation) +4. None of the above +################ +Output: +2 +################""", +] + +SEARCH_JUDGEMENT_PROMPT = { + "TEMPLATE": TEMPLATE, + "EXAMPLES": EXAMPLES, +} diff --git a/graphgen/templates/statement_judgement.py b/graphgen/templates/statement_judgement.py new file mode 100644 index 0000000000000000000000000000000000000000..5af4468dd2611b08a539651a6d59ea51de770349 --- /dev/null +++ b/graphgen/templates/statement_judgement.py @@ -0,0 +1,13 @@ +TEMPLATE: str = """Please determine if the following statement is correct. + +Note: +1. If the statement is correct, please reply with 'yes', otherwise reply with 'no'. +2. The answer should be either 'yes' or 'no', do not output any other content. + +Statement: +{statement} +Judgement: """ + +STATEMENT_JUDGEMENT_PROMPT = { + "TEMPLATE": TEMPLATE +} diff --git a/graphgen/utils/__init__.py b/graphgen/utils/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..932f8df1c1ca1444bb0225060e2dadbe690223ce --- /dev/null +++ b/graphgen/utils/__init__.py @@ -0,0 +1,9 @@ +from .log import logger, set_logger, parse_log +from .loop import create_event_loop +from .format import (pack_history_conversations, split_string_by_multi_markers, + handle_single_entity_extraction, handle_single_relationship_extraction, + load_json, write_json) +from .hash import compute_content_hash, compute_args_hash +from .detect_lang import detect_main_language, detect_if_chinese +from .calculate_confidence import yes_no_loss_entropy +from .help_nltk import NLTKHelper diff --git a/graphgen/utils/calculate_confidence.py b/graphgen/utils/calculate_confidence.py new file mode 100644 index 0000000000000000000000000000000000000000..1b596d910c93f35ed0b133607c5e209201bfc05a --- /dev/null +++ b/graphgen/utils/calculate_confidence.py @@ -0,0 +1,54 @@ +import math +from typing import List +from graphgen.models.llm.topk_token_model import Token + +def preprocess_tokens(tokens: List[Token]) -> List[Token]: + """Preprocess tokens for calculating confidence.""" + tokens = [x for x in tokens if x.prob > 0] + return tokens + +def joint_probability(tokens: List[Token]) -> float: + """Calculate joint probability of a list of tokens.""" + tokens = preprocess_tokens(tokens) + logprob_sum = sum(x.logprob for x in tokens) + return math.exp(logprob_sum / len(tokens)) + +def min_prob(tokens: List[Token]) -> float: + """Calculate the minimum probability of a list of tokens.""" + tokens = preprocess_tokens(tokens) + return min(x.prob for x in tokens) + +def average_prob(tokens: List[Token]) -> float: + """Calculate the average probability of a list of tokens.""" + tokens = preprocess_tokens(tokens) + return sum(x.prob for x in tokens) / len(tokens) + +def average_confidence(tokens: List[Token]) -> float: + """Calculate the average confidence of a list of tokens.""" + tokens = preprocess_tokens(tokens) + confidence = [x.prob / sum(y.prob for y in x.top_candidates[:5]) for x in tokens] + return sum(confidence) / len(tokens) + +def yes_no_loss(tokens_list: List[List[Token]], ground_truth: List[str]) -> float: + """Calculate the loss for yes/no question.""" + losses = [] + for i, tokens in enumerate(tokens_list): + token = tokens[0] + assert token.text.lower() in ["yes", "no"] + if token.text == ground_truth[i]: + losses.append(1 - token.prob) + else: + losses.append(token.prob) + return sum(losses) / len(losses) + +def yes_no_loss_entropy(tokens_list: List[List[Token]], ground_truth: List[str]) -> float: + """Calculate the loss for yes/no question using entropy.""" + losses = [] + for i, tokens in enumerate(tokens_list): + token = tokens[0] + assert token.text.lower() in ["yes", "no"] + if token.text == ground_truth[i]: + losses.append(-math.log(token.prob)) + else: + losses.append(-math.log(1 - token.prob)) + return sum(losses) / len(losses) diff --git a/graphgen/utils/detect_lang.py b/graphgen/utils/detect_lang.py new file mode 100644 index 0000000000000000000000000000000000000000..c34ddac48e318925b3b6a04258824d0dc9a4ce63 --- /dev/null +++ b/graphgen/utils/detect_lang.py @@ -0,0 +1,40 @@ +def detect_main_language(text): + """ + 识别文本的主要语言 + + :param text: + :return: + """ + assert isinstance(text, str) + def is_chinese_char(char): + return '\u4e00' <= char <= '\u9fff' + + def is_english_char(char): + return char.isascii() and char.isalpha() + + # 去除空格和标点符号 + text = ''.join(char for char in text if char.strip()) + + chinese_count = sum(1 for char in text if is_chinese_char(char)) + english_count = sum(1 for char in text if is_english_char(char)) + + total = chinese_count + english_count + if total == 0: + return 'en' + + chinese_ratio = chinese_count / total + + if chinese_ratio >= 0.5: + return 'zh' + return 'en' + +def detect_if_chinese(text): + """ + 判断文本是否包含有中文 + + :param text: + :return: + """ + + assert isinstance(text, str) + return any('\u4e00' <= char <= '\u9fff' for char in text) diff --git a/graphgen/utils/format.py b/graphgen/utils/format.py new file mode 100644 index 0000000000000000000000000000000000000000..0a0c101d4a5b3badf7bf33f03d1e34cf86b27164 --- /dev/null +++ b/graphgen/utils/format.py @@ -0,0 +1,85 @@ +import re +import os +import json +import html + +from typing import Any + +def pack_history_conversations(*args: str): + roles = ["user", "assistant"] + return [ + {"role": roles[i % 2], "content": content} for i, content in enumerate(args) + ] + +def split_string_by_multi_markers(content: str, markers: list[str]) -> list[str]: + """Split a string by multiple markers""" + if not markers: + return [content] + results = re.split("|".join(re.escape(marker) for marker in markers), content) + return [r.strip() for r in results if r.strip()] + +# Refer the utils functions of the official GraphRAG implementation: +# https://github.com/microsoft/graphrag +def clean_str(input: Any) -> str: + """Clean an input string by removing HTML escapes, control characters, and other unwanted characters.""" + # If we get non-string input, just give it back + if not isinstance(input, str): + return input + + result = html.unescape(input.strip()) + # https://stackoverflow.com/questions/4324790/removing-control-characters-from-a-string-in-python + return re.sub(r"[\x00-\x1f\x7f-\x9f]", "", result) + +async def handle_single_entity_extraction( + record_attributes: list[str], + chunk_key: str, +): + if len(record_attributes) < 4 or record_attributes[0] != '"entity"': + return None + # add this record as a node in the G + entity_name = clean_str(record_attributes[1].upper()) + if not entity_name.strip(): + return None + entity_type = clean_str(record_attributes[2].upper()) + entity_description = clean_str(record_attributes[3]) + entity_source_id = chunk_key + return { + "entity_name": entity_name, + "entity_type": entity_type, + "description": entity_description, + "source_id": entity_source_id, + } + +def is_float_regex(value): + return bool(re.match(r"^[-+]?[0-9]*\.?[0-9]+$", value)) + +async def handle_single_relationship_extraction( + record_attributes: list[str], + chunk_key: str, +): + if len(record_attributes) < 4 or record_attributes[0] != '"relationship"': + return None + # add this record as edge + source = clean_str(record_attributes[1].upper()) + target = clean_str(record_attributes[2].upper()) + edge_description = clean_str(record_attributes[3]) + + edge_source_id = chunk_key + return { + "src_id": source, + "tgt_id": target, + "description": edge_description, + "source_id": edge_source_id, + } + +def load_json(file_name): + if not os.path.exists(file_name): + return None + with open(file_name, encoding="utf-8") as f: + return json.load(f) + +def write_json(json_obj, file_name): + if not os.path.exists(os.path.dirname(file_name)): + os.makedirs(os.path.dirname(file_name), exist_ok=True) + with open(file_name, "w", encoding="utf-8") as f: + json.dump(json_obj, f, indent=4, ensure_ascii=False) diff --git a/graphgen/utils/hash.py b/graphgen/utils/hash.py new file mode 100644 index 0000000000000000000000000000000000000000..bf93ec5fee27bd9f83bba1c7575a5cc8602b57e7 --- /dev/null +++ b/graphgen/utils/hash.py @@ -0,0 +1,7 @@ +from hashlib import md5 + +def compute_args_hash(*args): + return md5(str(args).encode()).hexdigest() + +def compute_content_hash(content, prefix: str = ""): + return prefix + md5(content.encode()).hexdigest() diff --git a/graphgen/utils/help_nltk.py b/graphgen/utils/help_nltk.py new file mode 100644 index 0000000000000000000000000000000000000000..2d2610ba63c0af563b1b83f22a19bfdacca3957e --- /dev/null +++ b/graphgen/utils/help_nltk.py @@ -0,0 +1,39 @@ +import os +from typing import Dict, List, Optional +import nltk +import jieba + +resource_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), "resources") + + +class NLTKHelper: + _stopwords: Dict[str, Optional[List[str]]] = { + "english": None, + "chinese": None, + } + + def __init__(self): + jieba.initialize() + + def get_stopwords(self, lang: str) -> List[str]: + nltk.data.path.append(os.path.join(resource_path, "nltk_data")) + if self._stopwords[lang] is None: + try: + nltk.data.find("corpora/stopwords") + except LookupError: + nltk.download("stopwords", download_dir=os.path.join(resource_path, "nltk_data")) + + self._stopwords[lang] = nltk.corpus.stopwords.words(lang) + return self._stopwords[lang] + + @staticmethod + def word_tokenize(text: str, lang: str) -> List[str]: + if lang == "zh": + return jieba.lcut(text) + nltk.data.path.append(os.path.join(resource_path, "nltk_data")) + try: + nltk.data.find("tokenizers/punkt_tab") + except LookupError: + nltk.download("punkt_tab", download_dir=os.path.join(resource_path, "nltk_data")) + + return nltk.word_tokenize(text) diff --git a/graphgen/utils/log.py b/graphgen/utils/log.py new file mode 100644 index 0000000000000000000000000000000000000000..32b9bac6b43524c13ba53fa43c641ed87a23ebcc --- /dev/null +++ b/graphgen/utils/log.py @@ -0,0 +1,32 @@ +import logging + +logger = logging.getLogger("graphgen") + +def set_logger(log_file: str, log_level: int = logging.INFO, if_stream: bool = True): + logger.setLevel(log_level) + + formatter = logging.Formatter( + "%(asctime)s - %(name)s - %(levelname)s - %(message)s" + ) + + file_handler = logging.FileHandler(log_file, mode='w') + file_handler.setLevel(log_level) + file_handler.setFormatter(formatter) + + stream_handler = None + + if if_stream: + stream_handler = logging.StreamHandler() + stream_handler.setLevel(log_level) + stream_handler.setFormatter(formatter) + + if not logger.handlers: + logger.addHandler(file_handler) + if if_stream and stream_handler: + logger.addHandler(stream_handler) + + +def parse_log(log_file: str): + with open(log_file, "r", encoding='utf-8') as f: + lines = f.readlines() + return lines diff --git a/graphgen/utils/loop.py b/graphgen/utils/loop.py new file mode 100644 index 0000000000000000000000000000000000000000..5f12fa5bb61d01ce1f3fa7e813b22cfb3bd93795 --- /dev/null +++ b/graphgen/utils/loop.py @@ -0,0 +1,28 @@ +import asyncio + +from .log import logger + + +def create_event_loop() -> asyncio.AbstractEventLoop: + """ + Ensure that there is always an event loop available. + + This function tries to get the current event loop. If the current event loop is closed or does not exist, + it creates a new event loop and sets it as the current event loop. + + Returns: + asyncio.AbstractEventLoop: The current or newly created event loop. + """ + try: + # Try to get the current event loop + current_loop = asyncio.get_event_loop() + if current_loop.is_closed(): + raise RuntimeError("Event loop is closed.") + return current_loop + + except RuntimeError: + # If no event loop exists or it is closed, create a new one + logger.info("Creating a new event loop in main thread.") + new_loop = asyncio.new_event_loop() + asyncio.set_event_loop(new_loop) + return new_loop diff --git a/graphgen/version.py b/graphgen/version.py new file mode 100644 index 0000000000000000000000000000000000000000..73315e64e6b9b14bcd5527b691c7f824dd0c9543 --- /dev/null +++ b/graphgen/version.py @@ -0,0 +1,28 @@ + +from typing import Tuple + +__version__ = '20250416' +short_version = __version__ + + +def parse_version_info(version_str: str) -> Tuple: + """Parse version from a string. + + Args: + version_str (str): A string represents a version info. + + Returns: + tuple: A sequence of integer and string represents version. + """ + _version_info = [] + for x in version_str.split('.'): + if x.isdigit(): + _version_info.append(int(x)) + elif x.find('rc') != -1: + patch_version = x.split('rc') + _version_info.append(int(patch_version[0])) + _version_info.append(f'rc{patch_version[1]}') + return tuple(_version_info) + + +version_info = parse_version_info(__version__) diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..ab329cb596c8420378a15c85acb03fe88e4d52fb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,19 @@ +tqdm +openai +python-dotenv +numpy +networkx +graspologic +tiktoken +pyecharts +wikipedia +tenacity +nltk +jieba +plotly +pandas +gradio>=5.25.0 +gradio-i18n==0.3.0 +kaleido +pyyaml +langcodes diff --git a/resources/examples/chunked_demo.json b/resources/examples/chunked_demo.json new file mode 100644 index 0000000000000000000000000000000000000000..ad7219a32e7e2e7f67c50ccacb8917e954ec9540 --- /dev/null +++ b/resources/examples/chunked_demo.json @@ -0,0 +1,14 @@ +[ + [ + {"content": "云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。"} + ], + [ + {"content": "隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。"} + ], + [ + {"content": "Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity."} + ], + [ + {"content": "Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture."} + ] +] diff --git a/resources/examples/raw_demo.jsonl b/resources/examples/raw_demo.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..024559a682e5c040a3ee208445ad5b2f1b95266d --- /dev/null +++ b/resources/examples/raw_demo.jsonl @@ -0,0 +1,4 @@ +{"content": "云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。"} +{"content": "隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。"} +{"content": "Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity."} +{"content": "Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture."} diff --git a/resources/examples/txt_demo.txt b/resources/examples/txt_demo.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe8377bc06e8cfac83d9d5aaa1db6e09d7ce3e42 --- /dev/null +++ b/resources/examples/txt_demo.txt @@ -0,0 +1,7 @@ +云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。 + +隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。 + +Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity. + +Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture. diff --git a/resources/nltk_data/corpora/stopwords/chinese b/resources/nltk_data/corpora/stopwords/chinese new file mode 100644 index 0000000000000000000000000000000000000000..0873a9033a24948ae253085187c882418b5b3aaa --- /dev/null +++ b/resources/nltk_data/corpora/stopwords/chinese @@ -0,0 +1,841 @@ +一 +一下 +一些 +一切 +一则 +一天 +一定 +一方面 +一旦 +一时 +一来 +一样 +一次 +一片 +一直 +一致 +一般 +一起 +一边 +一面 +万一 +上下 +上升 +上去 +上来 +上述 +上面 +下列 +下去 +下来 +下面 +不一 +不久 +不仅 +不会 +不但 +不光 +不单 +不变 +不只 +不可 +不同 +不够 +不如 +不得 +不怕 +不惟 +不成 +不拘 +不敢 +不断 +不是 +不比 +不然 +不特 +不独 +不管 +不能 +不要 +不论 +不足 +不过 +不问 +与 +与其 +与否 +与此同时 +专门 +且 +两者 +严格 +严重 +个 +个人 +个别 +中小 +中间 +丰富 +临 +为 +为主 +为了 +为什么 +为什麽 +为何 +为着 +主张 +主要 +举行 +乃 +乃至 +么 +之 +之一 +之前 +之后 +之後 +之所以 +之类 +乌乎 +乎 +乘 +也 +也好 +也是 +也罢 +了 +了解 +争取 +于 +于是 +于是乎 +云云 +互相 +产生 +人们 +人家 +什么 +什么样 +什麽 +今后 +今天 +今年 +今後 +仍然 +从 +从事 +从而 +他 +他人 +他们 +他的 +代替 +以 +以上 +以下 +以为 +以便 +以免 +以前 +以及 +以后 +以外 +以後 +以来 +以至 +以至于 +以致 +们 +任 +任何 +任凭 +任务 +企图 +伟大 +似乎 +似的 +但 +但是 +何 +何况 +何处 +何时 +作为 +你 +你们 +你的 +使得 +使用 +例如 +依 +依照 +依靠 +促进 +保持 +俺 +俺们 +倘 +倘使 +倘或 +倘然 +倘若 +假使 +假如 +假若 +做到 +像 +允许 +充分 +先后 +先後 +先生 +全部 +全面 +兮 +共同 +关于 +其 +其一 +其中 +其二 +其他 +其余 +其它 +其实 +其次 +具体 +具体地说 +具体说来 +具有 +再者 +再说 +冒 +冲 +决定 +况且 +准备 +几 +几乎 +几时 +凭 +凭借 +出去 +出来 +出现 +分别 +则 +别 +别的 +别说 +到 +前后 +前者 +前进 +前面 +加之 +加以 +加入 +加强 +十分 +即 +即令 +即使 +即便 +即或 +即若 +却不 +原来 +又 +及 +及其 +及时 +及至 +双方 +反之 +反应 +反映 +反过来 +反过来说 +取得 +受到 +变成 +另 +另一方面 +另外 +只是 +只有 +只要 +只限 +叫 +叫做 +召开 +叮咚 +可 +可以 +可是 +可能 +可见 +各 +各个 +各人 +各位 +各地 +各种 +各级 +各自 +合理 +同 +同一 +同时 +同样 +后来 +后面 +向 +向着 +吓 +吗 +否则 +吧 +吧哒 +吱 +呀 +呃 +呕 +呗 +呜 +呜呼 +呢 +周围 +呵 +呸 +呼哧 +咋 +和 +咚 +咦 +咱 +咱们 +咳 +哇 +哈 +哈哈 +哉 +哎 +哎呀 +哎哟 +哗 +哟 +哦 +哩 +哪 +哪个 +哪些 +哪儿 +哪天 +哪年 +哪怕 +哪样 +哪边 +哪里 +哼 +哼唷 +唉 +啊 +啐 +啥 +啦 +啪达 +喂 +喏 +喔唷 +嗡嗡 +嗬 +嗯 +嗳 +嘎 +嘎登 +嘘 +嘛 +嘻 +嘿 +因 +因为 +因此 +因而 +固然 +在 +在下 +地 +坚决 +坚持 +基本 +处理 +复杂 +多 +多少 +多数 +多次 +大力 +大多数 +大大 +大家 +大批 +大约 +大量 +失去 +她 +她们 +她的 +好的 +好象 +如 +如上所述 +如下 +如何 +如其 +如果 +如此 +如若 +存在 +宁 +宁可 +宁愿 +宁肯 +它 +它们 +它们的 +它的 +安全 +完全 +完成 +实现 +实际 +宣布 +容易 +密切 +对 +对于 +对应 +将 +少数 +尔后 +尚且 +尤其 +就 +就是 +就是说 +尽 +尽管 +属于 +岂但 +左右 +巨大 +巩固 +己 +已经 +帮助 +常常 +并 +并不 +并不是 +并且 +并没有 +广大 +广泛 +应当 +应用 +应该 +开外 +开始 +开展 +引起 +强烈 +强调 +归 +当 +当前 +当时 +当然 +当着 +形成 +彻底 +彼 +彼此 +往 +往往 +待 +後来 +後面 +得 +得出 +得到 +心里 +必然 +必要 +必须 +怎 +怎么 +怎么办 +怎么样 +怎样 +怎麽 +总之 +总是 +总的来看 +总的来说 +总的说来 +总结 +总而言之 +恰恰相反 +您 +意思 +愿意 +慢说 +成为 +我 +我们 +我的 +或 +或是 +或者 +战斗 +所 +所以 +所有 +所谓 +打 +扩大 +把 +抑或 +拿 +按 +按照 +换句话说 +换言之 +据 +掌握 +接着 +接著 +故 +故此 +整个 +方便 +方面 +旁人 +无宁 +无法 +无论 +既 +既是 +既然 +时候 +明显 +明确 +是 +是否 +是的 +显然 +显著 +普通 +普遍 +更加 +曾经 +替 +最后 +最大 +最好 +最後 +最近 +最高 +有 +有些 +有关 +有利 +有力 +有所 +有效 +有时 +有点 +有的 +有着 +有著 +望 +朝 +朝着 +本 +本着 +来 +来着 +极了 +构成 +果然 +果真 +某 +某个 +某些 +根据 +根本 +欢迎 +正在 +正如 +正常 +此 +此外 +此时 +此间 +毋宁 +每 +每个 +每天 +每年 +每当 +比 +比如 +比方 +比较 +毫不 +没有 +沿 +沿着 +注意 +深入 +清楚 +满足 +漫说 +焉 +然则 +然后 +然後 +然而 +照 +照着 +特别是 +特殊 +特点 +现代 +现在 +甚么 +甚而 +甚至 +用 +由 +由于 +由此可见 +的 +的话 +目前 +直到 +直接 +相似 +相信 +相反 +相同 +相对 +相对而言 +相应 +相当 +相等 +省得 +看出 +看到 +看来 +看看 +看见 +真是 +真正 +着 +着呢 +矣 +知道 +确定 +离 +积极 +移动 +突出 +突然 +立即 +第 +等 +等等 +管 +紧接着 +纵 +纵令 +纵使 +纵然 +练习 +组成 +经 +经常 +经过 +结合 +结果 +给 +绝对 +继续 +继而 +维持 +综上所述 +罢了 +考虑 +者 +而 +而且 +而况 +而外 +而已 +而是 +而言 +联系 +能 +能否 +能够 +腾 +自 +自个儿 +自从 +自各儿 +自家 +自己 +自身 +至 +至于 +良好 +若 +若是 +若非 +范围 +莫若 +获得 +虽 +虽则 +虽然 +虽说 +行为 +行动 +表明 +表示 +被 +要 +要不 +要不是 +要不然 +要么 +要是 +要求 +规定 +觉得 +认为 +认真 +认识 +让 +许多 +论 +设使 +设若 +该 +说明 +诸位 +谁 +谁知 +赶 +起 +起来 +起见 +趁 +趁着 +越是 +跟 +转动 +转变 +转贴 +较 +较之 +边 +达到 +迅速 +过 +过去 +过来 +运用 +还是 +还有 +这 +这个 +这么 +这么些 +这么样 +这么点儿 +这些 +这会儿 +这儿 +这就是说 +这时 +这样 +这点 +这种 +这边 +这里 +这麽 +进入 +进步 +进而 +进行 +连 +连同 +适应 +适当 +适用 +逐步 +逐渐 +通常 +通过 +造成 +遇到 +遭到 +避免 +那 +那个 +那么 +那么些 +那么样 +那些 +那会儿 +那儿 +那时 +那样 +那边 +那里 +那麽 +部分 +鄙人 +采取 +里面 +重大 +重新 +重要 +鉴于 +问题 +防止 +阿 +附近 +限制 +除 +除了 +除此之外 +除非 +随 +随着 +随著 +集中 +需要 +非但 +非常 +非徒 +靠 +顺 +顺着 +首先 +高兴 +是不是 diff --git a/resources/nltk_data/corpora/stopwords/english b/resources/nltk_data/corpora/stopwords/english new file mode 100644 index 0000000000000000000000000000000000000000..1280aa3b08d64b846272b2d23314377200db36e9 --- /dev/null +++ b/resources/nltk_data/corpora/stopwords/english @@ -0,0 +1,179 @@ +i +me +my +myself +we +our +ours +ourselves +you +you're +you've +you'll +you'd +your +yours +yourself +yourselves +he +him +his +himself +she +she's +her +hers +herself +it +it's +its +itself +they +them +their +theirs +themselves +what +which +who +whom +this +that +that'll +these +those +am +is +are +was +were +be +been +being +have +has +had +having +do +does +did +doing +a +an +the +and +but +if +or +because +as +until +while +of +at +by +for +with +about +against +between +into +through +during +before +after +above +below +to +from +up +down +in +out +on +off +over +under +again +further +then +once +here +there +when +where +why +how +all +any +both +each +few +more +most +other +some +such +no +nor +not +only +own +same +so +than +too +very +s +t +can +will +just +don +don't +should +should've +now +d +ll +m +o +re +ve +y +ain +aren +aren't +couldn +couldn't +didn +didn't +doesn +doesn't +hadn +hadn't +hasn +hasn't +haven +haven't +isn +isn't +ma +mightn +mightn't +mustn +mustn't +needn +needn't +shan +shan't +shouldn +shouldn't +wasn +wasn't +weren +weren't +won +won't +wouldn +wouldn't diff --git a/resources/nltk_data/tokenizers/punkt_tab/english/abbrev_types.txt b/resources/nltk_data/tokenizers/punkt_tab/english/abbrev_types.txt new file mode 100644 index 0000000000000000000000000000000000000000..b38862b8c3126ae4ad3468f3377a7b2708554c17 --- /dev/null +++ b/resources/nltk_data/tokenizers/punkt_tab/english/abbrev_types.txt @@ -0,0 +1,156 @@ +ct +m.j +t +a.c +n.h +ms +p.a.m +dr +pa +p.m +u.k +st +dec +u.s.a +lt +g.k +adm +p +h.m +ga +tenn +yr +sen +n.c +j.j +d.h +s.g +inc +vs +s.p.a +a.t +n +feb +sr +jan +s.a.y +n.y +col +g.f +c.o.m.b +d +ft +va +r.k +e.f +chg +r.i +a.g +minn +a.h +k +n.j +m +l.f +f.j +gen +i.m.s +s.a +aug +j.p +okla +m.d.c +ltd +oct +s +vt +r.a +j.c +ariz +w.w +b.v +ore +h +w.r +e.h +mrs +cie +corp +w +n.v +a.d +r.j +ok +. . +e.m +w.c +ill +nov +u.s +prof +conn +u.s.s.r +mg +f.g +ph.d +g +calif +messrs +h.f +wash +tues +sw +bros +u.n +l +wis +mr +sep +d.c +ave +e.l +co +s.s +reps +c +r.t +h.c +r +wed +a.s +v +fla +jr +r.h +c.v +m.b.a +rep +a.a +e +c.i.t +l.a +b.f +j.b +d.w +j.k +ala +f +w.va +sept +mich +n.m +j.r +l.p +s.c +colo +fri +a.m +g.d +kan +maj +ky +a.m.e +n.d +t.j +cos +nev \ No newline at end of file diff --git a/resources/nltk_data/tokenizers/punkt_tab/english/collocations.tab b/resources/nltk_data/tokenizers/punkt_tab/english/collocations.tab new file mode 100644 index 0000000000000000000000000000000000000000..c7032b7fc96369e446570185d07cd195c7bd5381 --- /dev/null +++ b/resources/nltk_data/tokenizers/punkt_tab/english/collocations.tab @@ -0,0 +1,37 @@ +##number## international +##number## rj +##number## commodities +##number## cooper +b stewart +##number## genentech +##number## wedgestone +i toussie +##number## pepper +j fialka +o ludcke +##number## insider +##number## aes +i magnin +##number## credit +##number## corrections +##number## financing +##number## henley +##number## business +##number## pay-fone +b wigton +b edelman +b levine +##number## leisure +b smith +j walter +##number## pegasus +##number## dividend +j aron +##number## review +##number## abreast +##number## who +##number## letters +##number## colgate +##number## cbot +##number## notable +##number## zimmer \ No newline at end of file diff --git a/resources/nltk_data/tokenizers/punkt_tab/english/ortho_context.tab b/resources/nltk_data/tokenizers/punkt_tab/english/ortho_context.tab new file mode 100644 index 0000000000000000000000000000000000000000..a33a364852803f59d77bd6b8433801dbf7581439 --- /dev/null +++ b/resources/nltk_data/tokenizers/punkt_tab/english/ortho_context.tab @@ -0,0 +1,20366 @@ +coverage 36 +springsteen 4 +sandoz 4 +board-room 32 +eastman 6 +enter 32 +procedure 36 +blowing 32 +competition 46 +sinai 4 +t-word 4 +entangled 32 +clines 12 +seasonally 34 +firing 32 +legal-trade 32 +disruptive 32 +wagner 12 +soften 32 +ex-grenfell 4 +cementing 32 +threats 32 +sleepers 32 +bulgarian 4 +him 96 +citing 42 +phelps-stokes 4 +oglesby 12 +dieter 4 +showman 32 +half-hour 32 +deliveries 32 +monetary 110 +counters 32 +hill 12 +exceed 32 +miscreants 32 +poisoning 32 +neutral 32 +allocated 32 +angry 32 +registers 32 +chose 32 +cardinal 4 +also 110 +magnin 12 +vernacular 32 +rebound 32 +penicillin 32 +behave 36 +restrained 32 +diver 36 +journalists 34 +pops 32 +x-ray 4 +mansion 32 +overhauling 32 +merely 32 +julian 2 +veer 32 +fueled 36 +affordable 32 +amos-lee 4 +longstanding 32 +two-part 32 +warrants 36 +text 32 +aetna 10 +recollections 32 +entirely 32 +washing 32 +mathematical 32 +improvement 32 +reexamined 32 +therefore 34 +month 38 +mover 32 +agreement 36 +shoppers 32 +arabian 4 +cyclical 32 +creepers 32 +solicitation 32 +sculptures 32 +troupe 36 +break-even 32 +expressively 32 +indications 34 +kremlin 4 +czech 4 +darts 4 +worksheets 32 +secondary 40 +diplomat 32 +prescriptions 32 +cream 32 +devote 32 +repertoire 32 +berton 4 +waiting 32 +sculptured 32 +energy-related 32 +amplify 32 +apologetic 32 +indelible 32 +piggyback 32 +dwarfism 32 +respectively 32 +ahp 12 +bis 4 +wkr 8 +bit 32 +blew 32 +pgulf 8 +property-casualty 32 +banded 32 +interviewed 32 +expatriate 32 +branches 32 +superintendent 32 +stinginess 32 +bid 36 +big 46 +enigmatic 32 +attacked 32 +corporate 110 +southeastern 4 +one-fourth 32 +jacobs 4 +entertaining 32 +sbo 12 +sharpest 32 +sbc 4 +pest-resistant 32 +beating 32 +berkowitz 4 +serious 36 +skepticism 32 +shelf 32 +revisions 32 +kravis 4 +ellsworth 4 +intimidate 32 +pearson 6 +swarming 32 +bureaucracy 32 +pmi 8 +final 34 +speculative 32 +violence 36 +chocolates 44 +purists 2 +shapiro 12 +distillates 32 +saatchi 6 +temptation 32 +immigration 36 +drooping 32 +walk 32 +publishers 6 +waxing 32 +assembles 32 +reimbursed 32 +peculiar 32 +butter 32 +anywhere 32 +hoots 32 +cavalier 4 +banxquote 4 +turkish 4 +buried 34 +contributed 32 +intermittent 32 +omniscient 32 +appalled 32 +moved 32 +electromagnetism 32 +fancy 32 +sorts 36 +uncertainty 32 +front 36 +mcneill 4 +plainly 32 +firmly 32 +relations 38 +plasma 32 +enduring 32 +sayer 4 +stumbling 32 +exit 36 +non-refundable 32 +regan 12 +refrigerators 32 +pieter 4 +recipes 32 +doubtful 32 +sue 36 +undercut 32 +patent 44 +liberalization 32 +alvin 4 +progress 38 +brothers 36 +leaves 36 +revert 32 +lover 34 +handmade 32 +deceiving 32 +kessler 12 +ropak 6 +baytown 4 +attacks 32 +juncture 4 +martha 4 +questioning 32 +loved 32 +wiedemann 8 +acquire 36 +falsified 32 +corrigan 4 +romanticized 32 +stealing 32 +intel 12 +recruited 32 +calculating 32 +berger 4 +quantify 32 +gifts 32 +exuding 32 +bigger 32 +evaluate 32 +distributor 32 +restraining 34 +highlights 40 +madness 32 +budget/tax 32 +popularizing 32 +leningrad 6 +bread-and-butter 32 +groups 36 +leaders 34 +amadou-mahtar 2 +non-profit 32 +ivan 4 +wicklow 4 +logo 32 +devoting 32 +teach 32 +luis 4 +bigger-than-expected 32 +credentials 32 +conglomerate 32 +talmudic 4 +banning 2 +steelmaker 40 +ingratiate 32 +anguish 32 +handelman 4 +clymer 8 +acid-rain 96 +your 42 +concluded 32 +atco 8 +calmly 32 +pleads 32 +restart 32 +swimming 32 +boyish 32 +batchelder 12 +japan-style 4 +westport 4 +nominate 32 +perverse 32 +petrochemicals 32 +sunday 4 +trafficking 32 +epidemic 32 +curtailed 32 +rosenbaum 4 +exist 32 +submarine 32 +stepping 32 +lighthearted 32 +then-standard 32 +backwater 32 +religion 32 +plow 32 +colman 4 +nuclei 32 +plot 32 +full-hearted 32 +visit 38 +oriented 32 +abilities 32 +defeated 32 +ddb 6 +horse 32 +halts 32 +mistakes 32 +descended 32 +requesting 32 +bain 14 +reserved 32 +carolina 4 +allocates 32 +speeches 32 +horst 4 +ollmann 4 +russia 4 +basket 32 +wordperfect 4 +seating 32 +unrealized 32 +mistaken 32 +thoroughly 32 +mdest 12 +oldest 32 +mich. 4 +telephone-utility 32 +depot 4 +methodically 32 +talcs 32 +d.c. 4 +jason 2 +implicate 32 +models 36 +sorely 32 +barbecue 38 +triton 14 +bias 32 +subatomic 32 +modell 12 +window 32 +self-indulgent 32 +adelman 4 +complicate 32 +favorite 32 +can-sealing 32 +harvest 32 +boil 32 +warner 12 +miti 14 +tax-law 32 +welton 4 +commodity-chip 32 +student-loan 32 +dearly 32 +fiance 32 +restricting 34 +pick 32 +album 32 +topping 32 +hussmann 4 +fabulously 32 +razzmatazz 32 +skeptic 32 +withstand 32 +interfered 32 +plaza 4 +assertion 32 +e.f.ihutton 4 +diversify 32 +patents 32 +tack 32 +poor 38 +devising 32 +baldness 32 +commented 32 +cooperated 32 +personal-computer 32 +necessity 32 +vintage 10 +entitles 32 +hardymon 8 +elusiveness 32 +outgoing 34 +complacent 32 +keflex 4 +adding 34 +punitive 36 +hoechst 4 +percentage-point 32 +safety 36 +flannigan 4 +brakes 32 +collective 32 +mexican 6 +cours-la-reine 4 +frustrated 34 +anatomy 8 +distributes 32 +daring 32 +overpaid 32 +monty 4 +phaseout 32 +nationally 34 +moonlight 4 +primer 4 +surfeit 32 +distractions 32 +billet 4 +back-to-basics 32 +writ 32 +complying 32 +telephoned 32 +fence 32 +hearing 40 +billed 32 +drabness 32 +balding 32 +glamorous 32 +telephones 32 +adapted 32 +campaigner 32 +rubbed 32 +mandate 32 +economy 100 +breast 32 +spectra 4 +sealed 32 +achievements 32 +odds 32 +keyboard 32 +ambassador 32 +keener 32 +lyonnais 4 +registering 32 +ghetto 4 +apply 32 +bronx 4 +sogevalor 4 +hung 36 +sign 44 +plate 32 +sigh 32 +niles 8 +molten 32 +moves 36 +free-fall 32 +landmark 32 +raton 4 +accrediting 36 +investigations 32 +single-state 32 +disarray 32 +mccann-erickson 4 +pensions 32 +consumer-products 32 +horns 32 +bondholders 32 +plugged 32 +earner 32 +investment 102 +uni.a 12 +smallest 32 +ordinary 32 +ffod 4 +connecting 32 +snack 32 +iron-bending 32 +norman 14 +telco 14 +hmos 4 +repurchases 32 +kilowatt-hour 32 +advertise 32 +outfits 32 +chopin 4 +choreographers 32 +oliver 14 +emirates 4 +bestowed 32 +brink 32 +prize 36 +assuredly 32 +modification 32 +campanies 32 +beckoning 32 +princeton 12 +managing 32 +rebutted 32 +soaring 32 +veteran 32 +loudly 32 +tarrytown 4 +green 44 +flagging 32 +greek 6 +intricate 32 +georgia 6 +unprotected 32 +attain 32 +impromptu 32 +naive 32 +francs 32 +greene 4 +rigid 32 +requiring 32 +circulatory 32 +context 32 +million-dollar-a-year 32 +france 14 +greens 36 +browns 4 +accent 32 +pictures 36 +greer 4 +totals 40 +cosby 12 +peabody 12 +sapiens 32 +wafer 32 +program 34 +swelling 32 +cohesive 32 +prison 36 +recycling 32 +size 32 +quitting 32 +hot-strip 32 +troika 32 +strengthened 32 +hanff 4 +tavris 4 +unissued 32 +mental 32 +oscher 4 +fearsome 32 +arguello 4 +pre-game 32 +would 102 +packing 32 +schoenberg 4 +butler 12 +considering 34 +threshold 32 +persuasion 4 +lessons 32 +cordis 14 +unwind 32 +evades 32 +mascot 32 +joked 32 +telecom 14 +french 14 +thorns 4 +pre-selected 32 +constance 12 +jackman 4 +logical 32 +pressing 32 +competent 32 +bluhm 12 +scenario 32 +sold 100 +sprees 32 +incredible 32 +charities 32 +rigorous 32 +auto-receivables 64 +regains 32 +gradual 32 +dark-skinned 32 +consultations 32 +endurance 32 +s.a.y. 8 +drug-delivery 32 +japanese-style 4 +platinum 34 +insignificant 36 +moderate-income 32 +whatsoever 32 +sweaty 32 +interviewing 32 +raged 4 +myth 32 +household 38 +drawbacks 32 +bluhdorn 4 +twisted 32 +nicotine-stained 32 +conventions 32 +shoots 32 +place 36 +data 46 +pre-boesky 32 +lenses 32 +pre-reagan 32 +unnamed 32 +weaken 32 +experience 32 +dqu 8 +weaker 32 +kleinwort 6 +interest-rate 32 +horizon 32 +sole 32 +tweedledum 4 +commuted 32 +automatic-focus 32 +tension 32 +plows 32 +climbed 36 +poaching 32 +disregard 32 +ginger-haired 32 +flimsy 34 +moorman 8 +acknowledging 40 +aids-related 4 +kremlins 32 +invent 32 +sleeping 36 +koryagin 12 +low-profile 32 +niche 36 +climber 32 +moralists 32 +mcqueen 12 +efforts 102 +ribs 32 +overdraft 32 +swenson 8 +persistently 32 +appointed 32 +plasminogen 32 +cato 4 +harvey 12 +imported 32 +ammonium 32 +constructive 32 +coaxing 32 +progresses 32 +neurosurgical 32 +birds 32 +nazis 4 +offspring 32 +television 102 +donoghue 4 +weldon 8 +cliche 32 +documentation 32 +points 32 +dettmar 4 +half-dozen 32 +bor 8 +prefers 32 +underscores 32 +tranquilizer 32 +boy 32 +proving 34 +diplomacy 32 +rollbacks 32 +tomasson 12 +bob 38 +adult 32 +bon 4 +fuel 36 +microchips 40 +bragg 12 +traditions 32 +nigger 32 +supplant 32 +hope 36 +hutton 14 +probation 32 +adaptation 32 +sdi 4 +co-produced 32 +overreaction 32 +gillis 4 +friedman 12 +archaeologists 32 +quadrupled 40 +gamble 36 +intentional 32 +enemy 36 +where 38 +evenly 32 +emotionally 32 +paltry 32 +experimenting 32 +notification 32 +recapture 32 +underscored 32 +milling 36 +wanb 8 +finch 4 +tuesday 4 +wang 14 +efac 4 +anti-consumer 32 +ryan 4 +forbes 12 +subpeona 32 +banana-republic 32 +want 36 +lacroix 12 +skeptical 32 +weather 32 +single-a-1 32 +probable 32 +single-a-3 32 +generously 32 +exclusive 32 +striving 32 +variously 32 +practically 32 +hunters 36 +tire-worker 32 +aerospace 108 +passengers 32 +impression 32 +spate 32 +learns 32 +industrialized 32 +viruses 32 +juvenile 36 +tien 4 +four-year 32 +holyoke 4 +mexicans 6 +frydenlund 12 +co-founder 32 +payment 36 +weapon 32 +fairer 32 +boomlet 32 +top-grade 32 +currency-stabilization 32 +amendment 36 +number-crunching 32 +direct-sales 32 +sketch 32 +newspaper 32 +pricked 32 +culbro 4 +hands 32 +been 36 +volatile 32 +solvents 32 +refute 32 +incensed 32 +handy 40 +giving 40 +rate 108 +remove 32 +simple 96 +valid 32 +compensation 32 +simply 32 +usual 36 +funeral 36 +backer 32 +carving 32 +ambient 4 +costumes 32 +war-vintage 4 +write-in 32 +redemptions 4 +fared 32 +yugoslavia 4 +geographic 32 +chance 32 +gamse 4 +tabor 12 +self-evaluation 32 +double-a 32 +webb 12 +microchip 32 +spinach 32 +tdy 12 +displays 32 +reelection 32 +items 32 +resurgence 32 +shielding 32 +charity-ball 32 +rubric 32 +meanwhile 46 +installment 32 +rhi 4 +dls 8 +nasty 34 +mx 4 +singing 36 +prostitution 32 +clarity 32 +loan 100 +ml 8 +mecca 32 +close-knit 32 +pecora 4 +u.s.-canadian 4 +luv 8 +bioscience 36 +accepting 32 +load 46 +vast 32 +delfzijl 4 +frx 4 +mug 32 +construction 44 +restricted 32 +carlucci 4 +reduce 36 +epton 4 +remark 32 +peggy 4 +graphics 36 +instance 32 +clemenza 4 +echoed 32 +non-ibm 32 +hospitalization 32 +boogie 32 +cowbells 32 +requirement 36 +jeff 6 +roadways 32 +coca-cola 14 +mishima 4 +men 36 +graphic 6 +spoiler 32 +enteprises 4 +m2 4 +m3 6 +m1 4 +m. 12 +short-term 38 +debt-backed 32 +ludcke 8 +gypsum 36 +manna 32 +admiral 36 +perform 32 +blundered 32 +fillings 32 +songs 32 +dosage 32 +associated 38 +nashville 14 +truckloads 32 +wound 32 +reorganized 96 +ohio 4 +ranches 32 +sends 32 +hanging 34 +europe 14 +reading 38 +alden 12 +conventional-mortgage 32 +profound 32 +success 32 +medium-duty 32 +parts 100 +thoughout 32 +periodic 32 +five-country 32 +something-for-everyone 32 +salvaging 32 +sumo 4 +scrambling 32 +gleam 32 +long-distance 98 +resembles 32 +vandenburg 4 +unsolicited 32 +seafood 32 +envelopes 32 +color 36 +contraceptive 32 +respond 32 +anyhow 32 +sings 32 +ampersand 4 +extinguishment 32 +farm 46 +imperial 36 +salad 32 +terrace 4 +fare 32 +prides 32 +russell 6 +farming 32 +ahe 12 +memorably 32 +accuses 32 +howes 4 +monitor 36 +brazil 14 +flamingo 4 +cyprus 14 +artillery 32 +waited 32 +memorable 32 +reed 12 +surmises 32 +operational 32 +architectures 32 +pr 4 +accused 32 +contrary 32 +shave 32 +no-tax 32 +replaced 32 +annually 34 +swing 40 +r.i. 4 +private-ownership 32 +toughen 36 +celanese 4 +schlender 8 +blends 32 +tougher 32 +unaffiliated 32 +vira 4 +claudio 4 +expansion 32 +alma 36 +cyclops 14 +moore 12 +saxton 12 +anna 4 +revolving 32 +hostage 32 +fringe 32 +exacerbate 32 +specialists 32 +yellows 32 +watches 32 +capitalized 32 +greeted 32 +stands 32 +pettee 12 +signed 96 +longer 36 +el-barajneh 32 +habits 32 +socialists 4 +misused 32 +smuggled 32 +dreamed 32 +reptiles 32 +appointees 32 +watched 32 +mollusks 32 +reducing 36 +supervise 32 +disrupting 32 +tax-favored 32 +ireland 14 +liabilities 32 +oskar 4 +amenities 32 +afternoons 32 +beginners 4 +fail 36 +box-office 32 +unambiguous 32 +wounded 32 +comptroller 44 +trays 32 +lingus 4 +scrutinizes 32 +below 36 +incompetent 32 +yells 32 +mhp 8 +isbell 4 +hardgoods 4 +interprets 32 +caught 32 +attractively 32 +accosted 32 +insisted 32 +mhc 12 +wolverine 4 +trailing 32 +outpaced 32 +coursed 32 +forming 32 +inability 32 +vergennes 4 +suzdal 4 +miami 14 +steady 32 +compromising 32 +shore-grown 32 +sullivan 12 +chemical-physics 32 +ethnicity 32 +boardroom 4 +hull 32 +standard 46 +predicted 32 +well-informed 32 +rivals 36 +stutters 32 +choreography 32 +income 36 +parks 32 +gerlach 8 +oslo 10 +agriculture 36 +fairfield 12 +telex 32 +premium 32 +infringed 32 +franchised 32 +life-insurance 32 +espionage 32 +bur 8 +belgian 4 +contending 32 +heinike 4 +sharky 32 +bellwether 96 +fining 32 +violate 32 +ambiguities 32 +deflator 32 +paragraphing 4 +forgiven 32 +schrader 12 +amazement 32 +p. 4 +eugenia 4 +ltv 4 +particularly 34 +industrial-systems 32 +film-making 32 +recoup 32 +embarrass 32 +semester 32 +dramatized 32 +co-managing 32 +imports 102 +shine 32 +swung 40 +so-called 32 +pre-recorded 32 +infected 32 +icx 8 +icy 32 +laundering 32 +supply-side 32 +bailing 32 +scrutinize 36 +transmission 32 +leisure 40 +dramatizes 32 +bay-based 4 +camouflage 32 +icn 14 +upon 32 +previous 34 +truth 32 +bearish 32 +off 36 +pianist 2 +swallow 32 +plenty 32 +leaked 32 +campus 36 +remaining 32 +hype 32 +delayed 32 +lt. 4 +grousing 32 +hunter 36 +write-downs 32 +nano 4 +processor 32 +sedona 4 +opportunities 32 +neared 32 +frontrunners 32 +wrath 32 +laurie 4 +poison-pill 32 +commandos 32 +duthie 4 +drug-industry 32 +engine 36 +conversion 32 +bargain-hunting 32 +strained 32 +dependency 32 +sun-baked 32 +boczek 4 +promote 36 +little 46 +juan 4 +berrill 4 +home-dish 32 +ruled 32 +policies 36 +deadpan 32 +inflicted 32 +affable 32 +carlough 8 +ruler 32 +rules 36 +seventh 34 +melt-through 32 +tapping 32 +aircruisers 6 +gulf 46 +borrowing 32 +stings 32 +schuster 4 +protection 36 +prime-3 4 +prime-1 4 +refinanced 32 +insulated 32 +kneale 4 +those 46 +family-life 32 +conversation 32 +aesthetic 32 +weaver 12 +ah 2 +personal 32 +decorated 32 +boys 32 +sleep 36 +rustler 4 +grace 46 +reneged 32 +abalone-lover 32 +broker-adviser 32 +strengths 32 +halls 32 +re-elected 32 +plaintiffs 32 +discretionary 32 +vfc 8 +substantive 32 +decentralize 32 +australasia 4 +pen 32 +periods 32 +aspect 32 +granting 32 +ride 36 +bury 32 +polish 36 +imminent 32 +incredulous 32 +cooperate 32 +trust 100 +pep 40 +statistics 44 +w.va. 4 +danvers 4 +feasible 32 +refining 32 +odor 32 +rats 32 +frost 32 +securties 4 +f-20 4 +frost-retarding 32 +kamin 4 +deeds 32 +charles 14 +japan 14 +classic 36 +dissident 32 +pre-approved 32 +guarantee 32 +airline 40 +disproportionately 32 +loves 32 +playing 40 +losing 32 +food-processing 32 +live 38 +sustain 32 +incessant 32 +backup 32 +visiting 32 +theme 36 +exempts 32 +incontrovertible 32 +transworld 6 +wps 8 +filling 96 +prudent 32 +abandoning 32 +implications 32 +shackled 32 +loophole 32 +treading 32 +innkeeper 32 +fig 32 +victimized 32 +entrenched 32 +helicopter 32 +staunchly 32 +cujo 4 +fin 4 +jog 32 +camouflaging 32 +fit 32 +venal 32 +abound 36 +ocean 40 +confidence 36 +fis 8 +fir 36 +complex 36 +space-launch 32 +wants 96 +pastore 4 +fix 32 +movies 108 +little-known 32 +cheap-labor 32 +cbot 12 +fourth-quarter 110 +litigation 32 +refreshing 32 +relman 12 +up&l 6 +year-round 32 +austin 6 +suitcase 32 +mideast 4 +cboe 12 +chips 100 +dioxide 32 +u.s.-italian 4 +treated 32 +stringers 32 +funneled 32 +bestowal 32 +dreams 36 +circulated 32 +recalculated 32 +privy 32 +easier-to-use 32 +mid-teens 32 +oncor 2 +theoretical 32 +translates 32 +acceleration 40 +centre 4 +enchant 32 +margin 32 +much 102 +academicians 32 +medicine 36 +challenge 32 +react 36 +housing-finance 32 +admit 36 +appearances 32 +rebuttal 32 +shaib 4 +distortions 32 +bombed 32 +riled 32 +volume 46 +great 46 +alienating 32 +interest-only 32 +tightly 32 +territory 32 +mirror 36 +chart 32 +standards 36 +toughened 4 +hell 36 +objective 32 +motorist 32 +natchez 4 +intemperate 32 +advising 32 +held 44 +udf 4 +brewers 32 +redress 32 +ticketed 32 +reverses 32 +coloreds 32 +two 110 +tremendously 32 +help 36 +fargo 4 +journal/europe 4 +lemon 32 +ingersoll 4 +fledgling 32 +substances 32 +boveri 4 +rebels 36 +antics 32 +tfb 8 +big-time 32 +lovastatin 34 +halcion 4 +swell 32 +competence 32 +bashful 32 +bromberg 12 +upturn 32 +abreast 40 +budweiser 4 +t.pwf 4 +afflicted 32 +reached 38 +someday 32 +delaying 32 +trusts 32 +influenced 32 +overdrafts 32 +citizen 36 +directors 110 +squish 32 +magic 36 +large-screen 32 +eased 34 +reads 32 +indeed 42 +middlemen 32 +insider 46 +generate 32 +listened 32 +disposed 32 +determination 32 +arentsen 8 +express-parcel 32 +save 36 +builder 32 +wyden 4 +guns 32 +helpless 32 +campeau 4 +gunn 12 +settlements 36 +portions 36 +midst 36 +seemed 32 +all-natural 32 +recruiter 32 +monoclonal 32 +marketplace 32 +telegram 32 +raking 32 +czyrek 12 +columbia-based 4 +rejects 36 +workman 36 +three-hour 32 +due 108 +fine 38 +stacks 32 +sentimental 32 +ala.-based 4 +dun 12 +softwood 96 +grisdela 8 +bowl 4 +pga 8 +consumers 38 +elders 36 +legislators 32 +freezing 32 +walter 14 +steam 32 +pgn 8 +housing 102 +baby-boom 32 +calamari 32 +refuted 32 +financing 44 +reimbursement 32 +odds-makers 32 +steak 4 +deleted 32 +d 44 +quickie 32 +langdon 4 +fierce 32 +enhanced 32 +takeover-trading 32 +population 100 +unabashedly 32 +supplement 32 +levin 14 +marketer 32 +intimately 32 +equally 34 +digger 4 +disadvantage 32 +monica 4 +jacqmin 8 +peterson 4 +jean-pierre 4 +warplanes 32 +broad-based 32 +burdines 4 +t.pow 12 +starts 36 +lyric 32 +corn 36 +weekday 32 +injected 32 +three-cent 32 +lifting 34 +suit 44 +dependence 96 +core 32 +processed 32 +hauck 4 +j.p. 14 +machine-tool 32 +critic 32 +lingo 32 +paths 32 +slots 32 +high-level 32 +dank 32 +molecule 32 +steel-production 32 +vowing 32 +passenger 32 +corp 4 +indexed 32 +painful 34 +carey 4 +cause 32 +carew 8 +did 38 +weinberg 8 +reorganizations 32 +r.k. 4 +across 36 +indexes 36 +helping 32 +mcgraw-edison 4 +fifth 38 +snowstorm 32 +cared 32 +isgur 4 +jersey 4 +rohstoff 4 +kills 32 +ferns 32 +well-managed 32 +watson 12 +streeter 4 +floury 32 +medicines 32 +renovation 32 +scores 38 +scorer 32 +substitute 32 +tomatoes 32 +alicia 4 +monarch 14 +convincing 32 +municipalities 32 +movie 36 +scored 32 +seattle 12 +temper 32 +result 32 +corrugated 32 +creep 32 +creer 4 +lens 32 +enhances 36 +biotechnology 36 +occupied 34 +ordinance 32 +cqx 4 +stint 32 +doubted 32 +ramshackle 32 +delicately 32 +non-family 32 +energy 46 +urgently 32 +dutton 12 +archly 32 +creek 4 +goose 32 +defections 32 +improves 32 +backlash 32 +stanton 4 +splashy 32 +specimens 32 +texcel 10 +auto 102 +tendency 32 +scripting 32 +in-state 32 +polystyrene 32 +arc 8 +rte 10 +relocate 32 +employees 38 +blue-eyed 32 +improved 32 +eyeing 32 +reviving 32 +one-quarter 32 +entregrowth 6 +deteriorate 32 +mastermind 32 +narration 32 +ranging 32 +flooding 32 +reappeared 32 +malfitano 12 +forsythe 12 +swirly 32 +accordance 32 +maladies 32 +whr 8 +share-trading 32 +mature 32 +first-ever 32 +up-and-coming 32 +specialization 32 +senate 14 +pretty 32 +electric 110 +programs 36 +solids 32 +fined 32 +angolan 6 +showed 36 +ramada 12 +unseated 32 +yen-dollar 32 +constituencies 32 +frontier 36 +counts 96 +applause 32 +watch 38 +straits 4 +thou 4 +bare 2 +fines 32 +syntech 14 +introduction 38 +ceiling 36 +oreffice 8 +rye 4 +light-years 32 +westin 6 +ovens 32 +shares 46 +giveaway 32 +laura 4 +large-denomination 32 +small-time 32 +provisional 32 +copyrights 32 +individuals 34 +vs. 32 +toes 32 +safe 32 +shared 32 +congregations 32 +rubel 8 +discourage 32 +peking 8 +fiefdom 32 +diversifications 32 +unraveling 32 +luxury 32 +retrench 32 +aircraft 100 +bistro 32 +rubes 4 +search 44 +dive 32 +mercurial 32 +endorsing 32 +scotland 4 +wrested 32 +madonna-meets-the-duchess-of-windsor 4 +lachenbruch 4 +judd 4 +problems 40 +hynes 12 +eurodollar 14 +vortmann 8 +x-%chg 32 +retooled 32 +tinged 32 +illegality 32 +redesignation 32 +polaroid 14 +soul 32 +refusal 32 +silently 32 +motivated 32 +tailored 32 +arrives 32 +herwitz 4 +sour 32 +dimensionless 32 +soup 36 +aaron 4 +muller 12 +hear 32 +post-it 4 +lawmakers 34 +dense 32 +basing 36 +truck-assembly 32 +daisy 4 +boldly 32 +delays 40 +termed 32 +brokerage 98 +christian 4 +controversies 32 +comic 32 +kuan 4 +usair 14 +cline 8 +crankshaft 32 +shamrock 14 +compensate 32 +salamon 4 +minicomputers 32 +contradictory 32 +shedding 32 +provincial 32 +lear-siegler 4 +cooker 32 +handkerchief 32 +rel 12 +located 32 +explain 32 +genenchem 4 +controllers 32 +reactivated 32 +boards 32 +untraveled 32 +devastating 32 +renamed 32 +microscopic 32 +swedish 14 +cheese 32 +newsman 32 +inexpensive 32 +rescue 32 +royce 4 +seidman 12 +pathology 32 +mechanicsburg 8 +torrid 32 +inescapable 32 +northeast 36 +shattered 32 +emerson 14 +honeywell 6 +assure 32 +anglican 4 +springfield 4 +panasonic 4 +chamberlain 12 +midcon 4 +friend 32 +less-powerful 32 +appraisal 36 +void 32 +strides 32 +large 36 +fruits 32 +holiday-shortened 32 +non-voting 32 +overheated 32 +ricupero 4 +emporia 12 +unfriendly 40 +advances 38 +estimates 96 +breaded 32 +seattle-based 4 +fugitive 32 +estimated 34 +advanced 46 +furthering 32 +wellington 8 +litan 8 +captured 32 +educators 32 +hydraulic 32 +countries 36 +westinghouse 4 +manages 32 +manager 96 +genicom 6 +detectors 32 +needn 32 +environments 32 +formula 32 +inspectors 32 +replenished 4 +tiaa-cref 4 +diminutive 32 +element 32 +midday 32 +contractor 32 +fantastic 32 +public-works 32 +negotiator 32 +preface 32 +throes 32 +marines 4 +privatization 32 +salute 32 +rodeo 36 +james 14 +associations 32 +spielberg 12 +limbo 32 +exercising 32 +chalmers 4 +hollis 8 +placement 36 +appeasing 32 +smiths 4 +fanfare 32 +wry 32 +roosevelt 4 +butcher 36 +punjab 4 +iroquois 4 +billy 4 +humphrey 4 +foolproof 32 +incorrect 32 +gadhafi 12 +mess 32 +housewife 32 +income-producing 32 +language 32 +textron 10 +newly 32 +pervading 32 +toiling 32 +westamerica 14 +post 36 +pair 32 +kwon 8 +disagreeable 32 +subsides 32 +gangster 32 +foreseeable 32 +exiting 32 +hides 32 +scrupulous 32 +myself 32 +pose 36 +spook 32 +delicacy 32 +toxic-waste 32 +graceful 32 +oversaw 32 +pasadena 12 +phenomenal 32 +satirist 32 +gallery 36 +erase 32 +parent 100 +morella 4 +liquidation 32 +severance 32 +casually 32 +conduits 32 +shortening 32 +fallacies 32 +practices 36 +filming 32 +lady 36 +tags 32 +dictatorial 32 +breakers 32 +calif. 4 +dubroc 4 +sponsor 32 +tunnel 32 +occurring 32 +afterward 32 +verdict 32 +breakfast 36 +damages 32 +danse 32 +tenancy 32 +positioned 32 +massaged 32 +course 32 +who 108 +fortress 32 +content 32 +adamant 32 +constituting 32 +yuppie 36 +industrial-talc 32 +erich 8 +enforces 32 +practicing 32 +bookkeeping 32 +fired 32 +overcall 32 +commissars 32 +fraudulent 32 +goal 36 +loynd 8 +unit-trust 32 +supervisor 32 +striking 34 +variation 32 +goat 32 +macedo 4 +enforced 32 +promised 32 +symbols 32 +defuse 32 +psychiatrists 32 +courier-journal 8 +therapy 32 +sandwich 32 +schwartz 4 +hinton 4 +guyford 8 +ian 4 +suffering 32 +wrongful-discharge 32 +hubs 32 +redoute 4 +contingency 32 +presidente 4 +calculated 32 +thin 32 +chiles 12 +semiconductor-manufacturing 32 +sick 12 +bucks 32 +this 110 +wrongdoers 32 +wilfred 4 +bulging 32 +glasnost 2 +baritone 32 +hoover-dempsey 4 +emergence 32 +responses 32 +baltimore-washington 8 +flag 32 +recommendations 32 +institutional 102 +fca 4 +union-busting 32 +fires 64 +schroder 4 +crazy 38 +rudin 4 +cologne 4 +flak 32 +mom-and-pop 32 +getting 38 +flat 36 +provoking 32 +barring 36 +craze 32 +intuitively 32 +optional 32 +crickets 32 +target-company 32 +establishes 32 +defrauded 32 +transaction 36 +threatening 32 +feeling 32 +blossoms 32 +southwestern 32 +unjustified 32 +freeman 12 +alexandria 4 +beginnings 32 +polonsky 4 +affiliate 32 +nonpublic 32 +unlikely 32 +cherry 8 +kotlowitz 4 +flamboyant 32 +scoring 32 +passages 32 +all-knowing 32 +t.fcy 4 +protests 32 +ashore 32 +loewi 4 +character 32 +neutralist 32 +silversmiths 32 +impedes 32 +chillicothe 4 +wage-price 32 +bovine 32 +pa. 4 +chromed 32 +plus 36 +insurer 36 +ambiguous 32 +non-financial 32 +maybe 38 +turnout 34 +delta 14 +joints 32 +muscle 32 +sure-fire 32 +blunt 36 +nursery 4 +air-cargo 32 +spoiling 32 +taxpayers 36 +lt 8 +overregulation 32 +trident 4 +bright 32 +drastic 32 +usable 32 +hazardous 32 +atico 14 +begin 96 +chaotic 32 +le 34 +different 40 +specially 32 +multibillion-dollar 32 +deregulating 36 +steering 32 +provider 32 +lo 32 +abbreviation 32 +waste-water 32 +staley 8 +oiler 32 +pac 4 +prodigious 32 +mammoth 36 +kaplan 12 +assisting 32 +horse-racing 32 +doldrums 36 +dicey 32 +theory 32 +car-assembly 96 +big-college 32 +pat 4 +pas 4 +par 32 +funny 32 +pap 4 +question 32 +cook 4 +pleasurable 32 +pay 36 +supermerchant 32 +dissemination 32 +thrilled 32 +poland 6 +trading 46 +misunderstood 4 +coupled 42 +generators 36 +ambulatory 32 +currency-exchange 32 +thriller 32 +vegetable 32 +now-dormant 32 +merchant-banking 32 +various 34 +eye 32 +lawsuits 38 +seneca 4 +superannuation 4 +purposes 32 +reimposition 32 +unleashing 32 +bodies 32 +rouged 32 +f-100 4 +grieux 4 +deliberate 32 +passing 32 +quirky 32 +looming 32 +baldrige 4 +drums 32 +meritless 32 +cnn 4 +compulsory 32 +collectively 32 +falconbridge 4 +runoff 32 +yelled 32 +hormone-treated 32 +bros 4 +lindley 4 +laureate 32 +victory 32 +checking 32 +match 32 +action-forcing 32 +well-capitalized 32 +recent 42 +sanford 12 +arrested 38 +hand-wringing 32 +burry 8 +frantic 32 +residents 32 +fun 36 +pared 4 +residential 34 +neronian 4 +rko 4 +capture 32 +deadlines 32 +clients 36 +fourteen 2 +testified 32 +redeem 36 +pre-trial 32 +hunt 44 +have 100 +simultaneously 32 +testifies 32 +baked 32 +sagging 32 +iraqis 4 +one-cent-a-share 32 +prevost 4 +deux 4 +mestizo 32 +rail-car 32 +rican 4 +breasts 32 +abington 4 +outdo 32 +generals 32 +staffer 32 +sumitomo 4 +savvy 32 +still 42 +gracefully 32 +contributing 34 +rather 38 +negatives 32 +rewritten 32 +public-sector 32 +agency 46 +nicest 32 +players 36 +wabc-tv 4 +inconclusive 32 +expected 36 +oresman 8 +obliquely 32 +innovation 32 +csx 14 +northrup 4 +getty 12 +calny 14 +dryden 8 +stimulants 32 +purcell 4 +near-infrared-spectroscopy 32 +brings 32 +descendant 32 +rifadin 4 +forth 32 +treats 32 +f.j. 4 +dirks 4 +cen 8 +treaty 36 +weekly-average 32 +roughly 32 +demonstration 32 +expense-reduction 32 +mcgaw 4 +montera 4 +maneuver 32 +rethink 32 +malted 32 +overshot 32 +mulroney 12 +prolong 32 +educate 32 +wars 36 +realities 32 +entrance 32 +discoloring 32 +wary 40 +of 126 +mcgegan 4 +enlightened 32 +ward 44 +water 36 +research 102 +clemens 8 +hedging 32 +warm 32 +warn 32 +montero 4 +home-mortgage 32 +contracted 40 +baer 4 +mamelodi 4 +reproductive 32 +pastel 32 +males 32 +pledging 8 +asian-based 4 +descending 32 +entrepeneurial 32 +walker 4 +poindexter 12 +computer 38 +on 110 +zealously 32 +portion 32 +seized 32 +plastic 32 +nashua 12 +indisputable 32 +uncomfortably 32 +coordinated 32 +promotes 32 +promoter 32 +soldering 36 +exceptional 32 +sell 36 +scrawled 32 +uncomfortable 32 +michael 14 +stockyards 4 +gorki 4 +confections 32 +keynes 8 +attack 40 +attach 32 +sgic 4 +intentionally 32 +alexanders 4 +prohibited 32 +plunges 4 +ashton 4 +bridesmaid 32 +under 110 +constructed 32 +fire 36 +suspense 32 +pool 32 +nabisco 4 +useful 32 +plunged 36 +involving 44 +atlanta 14 +belding 4 +tact 32 +review 44 +lessened 32 +chases 32 +rosenfeld 4 +proliferating 32 +tent-meeting 32 +establishments 32 +response 32 +went 96 +discotheques 32 +vehicle-leasing 40 +private 34 +skimp 32 +preventive 36 +flurry 32 +floyd 6 +sir 46 +chased 32 +cruise 36 +distributing 32 +wyomissing 8 +change 36 +wallace 12 +convertibles 4 +educational 36 +yacht 4 +six-to 32 +sayad 4 +arnold 14 +publicizing 32 +weathered 32 +levittowns 4 +swamp 32 +practical 32 +customer 32 +tortuously 32 +crematories 32 +julius 6 +anthropologists 32 +reagan-proposed 4 +downsizing 32 +less-upholstered 32 +disgrace 40 +arrival 32 +nonferrous 32 +public-broadcasting 32 +speak 32 +tripled 32 +contemporary 32 +dilute 32 +genres 32 +maintains 36 +spear 32 +theatricality 32 +thicker 32 +distinguish 32 +vow 32 +spoke 32 +seems 32 +ky.-based 4 +once-thriving 32 +economists 46 +independent 34 +employee-benefits 32 +curacao-registered 4 +buchanan 12 +ailing 36 +ef-18a 4 +payoffs 32 +closet 32 +washington 14 +lipman 4 +filthy 4 +fine-tuned 32 +tomihiro 4 +aryan 4 +kong-based 4 +representative 36 +dubbed 32 +upham 4 +missions 32 +execute 32 +leakage 32 +neighbor 32 +renters 32 +discriminatory 32 +general-purpose 32 +atlasair 4 +pharmacy 4 +nine 38 +smoke 32 +colony 32 +nassau 4 +controversial 32 +external 32 +leanest 32 +protest 36 +unannounced 32 +covert 36 +worldwide 36 +confesses 32 +pacemaker 96 +pullman 12 +ecology 4 +likens 32 +lawsuit 32 +prognosticators 32 +brown-forman 4 +palestine 4 +conclusive 32 +distiller 32 +stereos 32 +hampshire 4 +lock 32 +missouri 4 +consciences 32 +reaction 32 +project 36 +c.v. 4 +counterpoint 32 +dependent 32 +roux 12 +macintyre 4 +clyde 4 +etched 32 +keep 36 +fresno 4 +choosing 32 +atom 36 +arson 32 +installing 32 +tycoons 32 +directors-and-officers 32 +possessed 32 +nsc-directed 4 +upscale 32 +c. 6 +co-head 32 +symmetrical 32 +thursday/sunday 4 +garcia 8 +municipal 36 +actors 32 +channell 12 +likenot 32 +perspective 36 +yuppies 32 +botlek 4 +two-year 32 +apartheid 32 +laying 32 +debacle 32 +major-league 32 +graft-vs.-host 32 +alumni 32 +cropping 32 +midrange 32 +richard 14 +left-wing 32 +intensive 32 +causes 32 +cq 8 +worker 36 +suskind 12 +e-6a 4 +call 34 +neatly 32 +cz 8 +mid-1960s 32 +berth 32 +co-artistic 32 +oriental 4 +exotic 32 +worked 32 +ms. 14 +believing 32 +parry 8 +agenda 32 +cl 8 +well-received 32 +filled 32 +revision 32 +setting 32 +majorities 32 +complications 32 +compounded 32 +thiokol 4 +molders 6 +diving 34 +pmsc 4 +activator 32 +following 42 +door-to-door-delivery 32 +rekindle 32 +deterrent 32 +jurors 32 +i`ve 4 +wpob 4 +nasa 2 +downey 4 +much-larger 32 +partners 36 +inhabit 32 +pandora 4 +caused 32 +p.a.m. 4 +henry 14 +marred 32 +golden 44 +arbitrage 36 +inflict 32 +acquiescent 32 +orben 4 +ginning 32 +tuxedos 32 +pre-dated 32 +bedford 12 +deteriorated 32 +fortifying 32 +midgets 32 +b.a.it 8 +hagan 8 +pessimism 32 +nonexistent 32 +bottlers 32 +death 38 +checkers 4 +transportations 4 +arrange 32 +simi 4 +portland 14 +fiber 32 +baucus 12 +flindt 4 +recorded 32 +alasdair 4 +black-and-white 32 +gutzwiller 8 +ratio 32 +ogorodnikov 4 +counting 34 +arriving 32 +elimination 32 +underwrite 32 +drinks 32 +determine 32 +curtailment 32 +recorder 32 +money-market 4 +israelis 4 +osha 4 +glazer 12 +cash 38 +high-tech 96 +consensus 32 +lurked 32 +mitsubishi 4 +cycle 32 +weston 4 +drain 32 +stirred 32 +winegardner 12 +wonders 32 +bollinger 10 +concerned 32 +anti-japanese 32 +vanoff 4 +purchasers 34 +toga 32 +cultural 32 +shipbuilding 36 +philosophy 32 +masse 32 +financial-aid 32 +hayden 4 +priced 98 +societal 32 +elsinore 2 +continuous 32 +doorstep 32 +shirt 32 +ski 32 +miniseries 32 +malvern 4 +trained 34 +sporadic 32 +themselves 32 +valentine 12 +unsold 32 +goings-on 32 +disproportionate 32 +salvo 32 +raiders 32 +viewers 38 +blame 34 +corresponds 32 +eastbound 32 +enga 4 +bombs 32 +gameshow 8 +notified 96 +price-slashing 32 +things 34 +repeatedly 32 +robins 14 +tentatively 96 +linkup 6 +unknowable 32 +creditors 36 +iran 6 +kolber 8 +communications-based 32 +hammered 32 +gets 44 +succession 32 +angle 32 +cameras 38 +low-sulfur 32 +deandome 4 +service-company 32 +record-keeping 32 +caw 4 +leads 96 +snowy 32 +jarring 32 +bayh 4 +iraq 6 +untenable 32 +crows 32 +serves 32 +regular 40 +pre-payment 32 +fremantle 4 +norris 4 +minute 32 +jamie 2 +motives 32 +aids-treatment 4 +deny 32 +bradstreet 4 +elmwood 8 +ak-47 4 +tra 4 +non-oil 36 +out-of-court 32 +bs 8 +heir 32 +screen 36 +bt 4 +two-thirds 32 +separation 32 +by 126 +nondurable-goods 32 +benched 32 +economist 40 +tumbling 32 +mile 36 +bb 4 +ba 12 +bg 4 +be 108 +satisfaction 32 +bk 8 +mill 36 +leased 32 +interstate 46 +bn 8 +milk 32 +hve 8 +clever 32 +monarchs 32 +plumbing 32 +sticker 32 +friction 32 +pro-rata 32 +est 12 +segundo 4 +mckanic 4 +co-op 32 +flexi-van 4 +sending 36 +anti-climactic 32 +vatican 4 +optic 32 +partly 34 +controversy 32 +regrouping 32 +brio 8 +orbiting 32 +supporters 96 +shafts 32 +take 102 +per-minute 32 +slight 32 +minds 32 +sandinista 4 +rim 4 +rio 12 +car-parts 32 +vastness 32 +undetermined 32 +mcmxxv 4 +radio-television 4 +abalone 38 +confirming 32 +kerley 8 +beaver 4 +standstill 32 +distribute 32 +raburn 4 +arms-sales 32 +city-council 32 +crummy 32 +accidental 32 +space 36 +panicky 32 +bethlehem 12 +credit-research 32 +prime 38 +reimposed 32 +slash 32 +exhibitions 32 +pipeline 32 +woodville 8 +splintered 32 +monopoles 34 +representations 32 +mid-march 32 +best-managed 32 +movements 32 +third-largest 32 +binding 32 +private-property 32 +dislocated 32 +awarded 32 +everyday 32 +hoyt 4 +universities 96 +mortgage 36 +natan 4 +palates 32 +drilling 36 +additive 32 +incremental 32 +boozer 32 +driven 32 +puat 4 +federalism 32 +argue 32 +enrile 4 +mouths 32 +pennzoil 14 +they 46 +portable 44 +regulate 32 +doors 32 +minichain 32 +females 34 +archaic 32 +gloom 4 +stalked 32 +eight-month-old 32 +them 32 +then 126 +setbacks 32 +shoes 32 +orderly 32 +maghdousheh 4 +blond 34 +director-generalship 32 +culver 4 +protectionism 32 +merged 32 +positive 32 +trifle 32 +prophets 32 +underpaid 32 +chevrefeuille 4 +clarinetist 32 +capability 32 +lobbyists 32 +negligible 32 +persist 32 +perversely 32 +yardstick 32 +sacco 4 +classics 32 +deserve 32 +guest 32 +bacha 12 +muscular 32 +foldessy 8 +development 36 +freezes 32 +assistants 32 +cardholder 4 +imagery 32 +introduce 36 +andre 6 +stopping 34 +thick 32 +brackets 32 +asics 4 +arrangement 32 +dominion 14 +desks 32 +imposition 96 +slope 4 +escrow 32 +renault 8 +credibility 32 +superintendents 32 +brilliant 32 +zink 12 +measured 32 +blessing 32 +sent 32 +diego-based 4 +keating 12 +darkly 32 +doctor 32 +coins 32 +apple 6 +relish 32 +organizational 32 +speculates 32 +confection 32 +haunting 32 +mistake 32 +send 32 +pre-agreement 32 +uranium 32 +substitutes 32 +compulsion 32 +cathy 4 +rebellion 32 +trustee 32 +moderately 32 +esther 4 +kaye 2 +details 34 +motors 36 +low-margin 32 +knowledgeable 32 +occidental 2 +increasingly 38 +engage 32 +infectious 36 +twist 32 +jewel 32 +ivory-tower 2 +liberal 36 +distinctly 32 +enjoined 32 +irritating 32 +backdrop 32 +elementary 32 +entire 32 +towing 32 +database 32 +farce 32 +coordinate 32 +hubert 4 +cattle-on-feed 32 +tends 32 +sen. 6 +karen 4 +tests 46 +spinoff 36 +soundness 32 +benton 8 +seven-page 32 +bored 32 +low-light 32 +morton 14 +looks 44 +whittaker 6 +jawbone 32 +innovative 32 +hunkered 32 +horrified 32 +invested 32 +movement 36 +gutsy 32 +investigators 46 +elgie 4 +unforgivable 32 +escalating 32 +dimona 4 +resale 4 +quicker 32 +terse 32 +sara 8 +exterior 32 +amalgam 32 +nomination 40 +debts 36 +chisholm 12 +godiva 4 +substituted 32 +risk-taking 32 +ci 8 +iosif 4 +walhalla 4 +selas 12 +saliva 36 +dolls 32 +ardently 32 +diaper 32 +negotiations 32 +over-the-counter 32 +stakes 36 +dolly 4 +dreaded 32 +created 34 +defend 36 +accountant 32 +anticipating 34 +wilmette 4 +perceptible 32 +fhp 4 +shelter 32 +extracting 32 +aired 32 +alleging 32 +four-way 32 +detailing 32 +subdued 32 +airs 32 +popularize 32 +shopping 36 +relatively 32 +bowing 32 +cosmetic 32 +motels 32 +vied 32 +baseless 32 +brash 32 +porter 4 +redefine 32 +embraced 32 +gatherings 32 +b.f. 4 +fallacy 32 +grain 32 +asbestos-related 32 +gourmets 36 +pcs 4 +rectify 32 +cro-magnons 4 +embittered 32 +reinterpretation 32 +stockholder 32 +funded 32 +governments 32 +legitimize 32 +mordant 32 +appeared 32 +franklin 12 +ambivalence 32 +pave 32 +infants 32 +thrifts 40 +surfacing 32 +niches 32 +routine 32 +routing 32 +ribaminol 34 +refined 32 +turn 32 +victims 36 +essays 32 +issuance 32 +earings 32 +hostile 40 +turf 32 +landmarks 32 +launch 32 +financial-futures 32 +repeated 34 +early 106 +concentrates 32 +picked 32 +overexposure 32 +properly 32 +caramels 32 +likely 36 +simian 32 +lebanon 4 +restore 32 +spear-throwing 32 +lust 32 +depth 32 +mentor 4 +concentrated 32 +germ-warfare 32 +chess 32 +read 44 +chest 32 +ern 4 +surge 36 +bachelor 32 +real 46 +refrain 32 +rows 32 +innkeepers 32 +ya 32 +oestreich 12 +n.d. 4 +reap 32 +liggio 4 +investigation 100 +firmed 32 +anti-sandinista 32 +cane 36 +dail 4 +voting 36 +trudeau 4 +admirers 32 +scintillation 32 +inmates 32 +relinquish 32 +crack 32 +erg 4 +vilify 32 +higgins 4 +gladly 32 +technologic 4 +mothers 32 +intensity 32 +seven-state 32 +blocked 32 +maximizing 32 +teri 6 +unacceptable 32 +trend 32 +bombers 32 +repulsed 32 +micheal 2 +subscription 32 +dorfman 8 +oh-god-if-i-pull-this-one-off-i 4 +lest 32 +less 38 +cocolat 4 +numbering 32 +non-technical 32 +tourist-drawing 32 +post-colonial 32 +gesture 32 +developed-country 32 +organizes 32 +organizer 32 +lesa 4 +strip-searched 32 +quotes 32 +resolution 34 +renewed 32 +gambler 32 +lines 44 +first-rate 32 +four-wheel-drive 32 +gratitude 34 +massoud 4 +gambled 4 +free-wheeling 32 +executes 32 +quoted 32 +targeted 32 +wasteful 32 +fiery 32 +cops 32 +survey 36 +abuses 32 +parkway 4 +exam-preparation 32 +successes 36 +attendants 32 +windfalls 32 +brace 4 +personal-income 32 +mind 32 +bcl 8 +hoffmann 4 +health-products 32 +bcw 8 +bcv 8 +constituents 32 +duty 100 +cephalosporin 32 +cambridge 4 +bcy 4 +info 4 +brushed 32 +moderate 32 +x 12 +cinematic 32 +hobbies 32 +airing 32 +default 32 +hambrecht 4 +conservancy 32 +alix 12 +five-point 32 +terror 2 +south 44 +breeds 32 +bailed 32 +atuwi 4 +quarterlies 32 +procedural 32 +heirs 32 +psychological 32 +distinctive 32 +likes 32 +england-based 4 +alive 32 +teneff 12 +liked 32 +one-man 32 +fixed-income 2 +unfilled 32 +outerspace 32 +stock-index 32 +ediger 8 +criminal-sentencing 32 +lumber 102 +dismissals 32 +obsessive 32 +primarily 32 +benito 4 +ships 32 +econometric-forecasting 32 +occupation 32 +downturns 32 +luftwaffe 4 +kearney 12 +macmillan 14 +deployed 32 +achievement 36 +fertility 32 +photovoltaic 32 +bolling 4 +actually 38 +baseball 32 +strife 32 +reports 110 +magazines 36 +darwinism 4 +bolsters 32 +verge 32 +manuverings 32 +dial 32 +conspiring 32 +refuses 36 +throw 32 +bailey 4 +factions 36 +processes 32 +checks 36 +rabbits 4 +enex 10 +inhalable 32 +fending 32 +rah 12 +stalling 32 +fleets 32 +handle 32 +mailings 32 +join 36 +eastern 46 +unhappy 40 +accelerate 32 +witching 32 +reference 36 +belove 4 +disparities 32 +redford 4 +marshall 2 +toyoy 4 +frederick 14 +main 36 +fallout 32 +mail 36 +dollar-holders 32 +mair 8 +invaders 32 +nutrition 32 +myg 8 +outgrowths 32 +marshals 96 +payout 44 +comprehend 32 +precipitating 32 +collections 32 +antipathy 32 +cost-effective 32 +testifying 2 +wonderful 32 +quietly 32 +tbs 8 +philhellene 32 +provocative 32 +npt 8 +teachers 46 +honesty 32 +wildlife 4 +typically 34 +punishing 32 +gilgore 12 +capital-intensive 32 +thrombolytic 32 +scattered 32 +wide-body 32 +import 32 +squads 32 +sunny 32 +dillard 4 +obstruction 36 +ieoc 6 +shell 32 +dangerously 32 +free-trade 32 +sluggish 34 +all-cash 32 +asked 98 +molds 32 +downtown 32 +function 36 +heaven 32 +slack-jawed 32 +deal-making 32 +blood-clot 32 +housewives 32 +galactic 32 +normal 36 +presently 32 +batteries 32 +svb 4 +nevada-las 4 +significant 32 +briefcases 32 +shies 32 +cocktail 32 +tenderness 32 +redeemable 32 +unwieldy 32 +hog 34 +contacted 32 +based 46 +cherished 32 +teicher 4 +february 4 +extraparliamentary 32 +bases 32 +acquisition-minded 32 +immediately 32 +rides 32 +takeover 44 +midtown 32 +endorse 32 +notations 32 +hovers 32 +alluding 32 +sachs 4 +fool 36 +relating 32 +advisers 36 +ic 14 +sachy 8 +white 46 +food 46 +noncaloric 32 +squashed 32 +racking 32 +earnings 46 +impressive 32 +wriv 4 +warring 4 +dinner 44 +karachi 4 +drafting 32 +swinging 32 +frankfurt 12 +protections 32 +lachica 4 +lovable 32 +isaacs 8 +evident 32 +largest-selling 32 +eliminated 32 +condom 32 +camino 4 +individually 32 +december 14 +locate 32 +worsened 32 +building 38 +strife-torn 32 +negotiators 32 +composition 32 +samsung 4 +modify 32 +retailing 40 +truly 32 +photocopier 32 +year-end 34 +consumer 46 +manufacturers 110 +market-by-market 32 +owe 32 +benchmark 32 +superior 36 +production-quota 32 +three-judge 32 +containing 32 +consumed 32 +rover 6 +warrant 96 +abuse 32 +gobain 4 +broadcasting 38 +overstylized 32 +oblivious 32 +higher 38 +americano 4 +two-week 32 +pugh 8 +dalkon 4 +imsi 4 +atkinson 4 +ambj 8 +iq 4 +airbus 6 +rated 32 +differing 32 +profession 32 +alleviate 32 +americans 4 +otter 32 +starring 32 +grass-roots 32 +throwing 32 +covey 32 +drams 4 +crzy 8 +cholesterol-lowering 32 +forestalls 4 +cover 36 +guideline 32 +announces 32 +develop 32 +erroneous 32 +sesit 8 +drama 32 +wessel 4 +irresponsible 32 +champ 32 +basics 32 +unionizing 32 +festering 32 +profit-taking 36 +ether 32 +everybody 38 +t3100 4 +bailly 4 +shiraz 4 +soonest 32 +radioactivity 32 +inaccuracies 32 +houses 32 +crucial 36 +archibald 4 +deducting 32 +stride 32 +readable 32 +mason 14 +disappointment 32 +namely 2 +largest 100 +housed 32 +cameron 4 +opposing 32 +circulating 32 +gorbachev 14 +startled 32 +cptc 4 +videotape 32 +blair 12 +agreed-upon 32 +consolidations 32 +agreeing 32 +tribute 32 +justin 4 +terrence 4 +antonio 4 +antonin 4 +government-owned 32 +three-member 32 +blacklisting 32 +difficulties 32 +accountability 32 +bothering 32 +advent 32 +leggett 8 +uncriticized 32 +re-regulating 32 +anastasio 4 +substantial 32 +mcgraw-hill 6 +notify 32 +appearing 32 +fate 32 +classmate 32 +brighter 36 +partial 32 +reliability 32 +entities 32 +emotions 32 +financiere 14 +sneak 32 +home-equity 34 +companions 32 +bechtel 4 +answered 32 +vern 4 +stalin 4 +discomforts 32 +keeping 38 +kapor 12 +fold 32 +pullouts 32 +purer 32 +drivers 32 +perron 4 +anti-managua 32 +unemployment 46 +netx 4 +reevaluate 32 +ness 4 +very 32 +christensen 14 +coronation 36 +uncover 32 +alberto 4 +untaxed 32 +logicon 4 +rakoff 8 +headline 32 +fund-raisers 32 +especially 34 +salt 44 +debra 4 +spreadsheets 36 +roland 4 +clevite 12 +fulfill 32 +thorny 32 +plo 4 +subway 32 +beast 32 +tightened 32 +hilton 6 +sale 44 +resource 36 +downturn 32 +reassessing 32 +popularity 32 +guides 32 +conference 36 +speaks 32 +greg 4 +forum 46 +elite 36 +unfunded 32 +guided 32 +communicate 32 +could 108 +alltime 32 +saddle 36 +historical 32 +patricia 6 +grew 40 +orion 14 +activities 36 +conceivably 32 +committed 32 +committee 38 +motion-picture 32 +bundesbank 4 +negotiates 32 +tark 4 +referees 32 +mets 8 +wrote 36 +listening 32 +ruling 44 +lefler 8 +manufacturing 108 +upkeep 32 +miller 14 +week-old 32 +pmk 8 +findings 32 +advertisers 32 +largesse 32 +apropos 2 +pmn 8 +yuri 4 +surely 34 +stuart 6 +stricter 32 +lousy 32 +caseload 32 +quist 4 +flexible 32 +unearthed 32 +trijets 32 +lead/acid 32 +dell 4 +faltering 32 +depths 32 +mutually 32 +physics 36 +blenders 32 +fairchild 4 +better 34 +pwj 4 +render 32 +upper 44 +kissinger 4 +divisive 32 +near-great 32 +tomahawk 4 +unconditional 32 +elderly 32 +reimbursements 32 +version 32 +hovering 32 +u.n. 4 +casino-hotel 32 +hoopla 32 +harmon 4 +velvet 4 +meal 32 +ploy 32 +geraldine 4 +hpc 4 +continuing-education 32 +dilutive 32 +talented 32 +twenty-five 4 +cleocin 4 +icing 32 +reaganites 4 +annual 32 +trial 36 +hobart 2 +leaving 38 +francisco 4 +goldin 4 +kanter 12 +textile 32 +against 46 +allege 32 +toll-free 34 +shoo-in 32 +recouped 32 +technicon 4 +more-focused 32 +dismayed 32 +arv 8 +endless 32 +fernao 4 +marshaling 32 +hutcheson 4 +out-of-state 36 +cupid 2 +dramatically 32 +ron 12 +irish-american 4 +rok 8 +venues 32 +thenceforward 32 +row 36 +home-shopping 32 +bermingham 4 +womanish 32 +wool 32 +midlevel 32 +relationship 32 +roy 6 +klopfenstein 4 +hilarious 32 +portables 32 +infant 32 +presplit 32 +henley 14 +hawk 4 +persons 32 +depending 34 +follow-on 32 +discredit 32 +wells 44 +magnavox 6 +calculation 32 +open-air 32 +policy-coordination 32 +candlelight 32 +prillaman 12 +sums 32 +ktcc 8 +acy 8 +montreal-based 4 +act 36 +currency 110 +exploration 36 +january 14 +allotted 32 +ashton-tate# 8 +merger-advisory 32 +company-wide 32 +richmond 4 +ace 32 +outnumbering 32 +hazardous-waste-management 32 +bbdo 4 +completes 44 +imaging 32 +acc 4 +bay 36 +bax 12 +razzak 4 +impose 36 +backfire 32 +involve 32 +crusading 32 +slvn 8 +bar 36 +bat 34 +square-toed 32 +engineered 32 +milan 6 +holland 4 +just-in-time 32 +national 46 +efficiency 32 +ban 36 +teams 32 +bab 12 +bad 36 +bag 32 +husband 32 +econometric 4 +euphemisms 32 +judged 32 +downing 32 +tidal 32 +affection 32 +eluded 32 +judges 32 +amitai 8 +tenn. 4 +connections 32 +chocolatiers 32 +gaming 4 +chastening 32 +superconducting 4 +fitness 32 +communicating 32 +tube 36 +foxborough 4 +zap 32 +rendition 32 +wausau 4 +mailer 4 +lopped 32 +unfinished 32 +dockets 32 +desk 32 +contradict 32 +fanned 32 +ottawa-based 4 +cell 32 +cue 32 +per-unit 32 +several 46 +favor 32 +hide 32 +denunzio 12 +cando 4 +completed 32 +cup 36 +braces 32 +franchisee 32 +cut 100 +hamburgers 32 +overlook 32 +adventure 32 +letting 32 +preposterous 2 +proxy 36 +trapped 32 +contains 32 +publisher 32 +narrowing 36 +loosened 32 +admen 34 +keel 36 +keen 32 +elusive 32 +cases 36 +woodruff 8 +secured 32 +authorize 32 +cancellation 40 +adjusted 98 +frates 8 +casey 14 +bang-them-over-the-head 32 +affair 36 +penny-stock 32 +aside 36 +zany 32 +careers 38 +little-noticed 32 +jewish 6 +openings 32 +adventurers 32 +invest 32 +mckerrow 4 +lemonade 32 +exaggeration 32 +maestro 32 +reputable 2 +rtn 12 +pharmaceuticals 44 +paris-dakar 4 +nolde 4 +asbestos-like 32 +coating 32 +serving 32 +disintegrate 32 +eating 32 +microsystems 4 +bolster 36 +grill 32 +nuala 4 +senior-college 32 +gate-side 32 +scholarships 32 +misled 32 +subtle 32 +fearful 32 +derivative-action 32 +communist 38 +oil-price 32 +reforms 32 +elephant 32 +court 108 +hercules 4 +kimmelman 4 +personnel 32 +levesque 2 +destructive 32 +taking 32 +noyce 4 +pilliod 8 +fooling 32 +delmas 14 +dividends 44 +shortchange 32 +echelons 32 +fast-growing 32 +captures 32 +less-favored 32 +borrowings 34 +genrad 4 +issuing 32 +pedro 4 +mollusk 32 +genral 8 +d&k 14 +bookings 32 +battery-processing 32 +component 32 +coppee 4 +multitude 32 +dark 32 +urgent 32 +exquisite 32 +terence 4 +listings 32 +mitzvahs 32 +lake 36 +repackaging 32 +pleasant 32 +make 108 +lawrence 14 +aggregate 32 +kicked 32 +manner 32 +diming 32 +boston 14 +tortillas 32 +fayva 4 +studies 44 +favored-nation 32 +signing 32 +explicit 32 +carley 8 +manned 32 +unix 4 +breaches 32 +crimes 32 +unit 108 +brasilia 4 +proteon 4 +studied 32 +ultimately 34 +then-mayor 32 +superhot 32 +kurlak 12 +trains 32 +or 102 +documents 34 +promise 32 +accompanying 32 +renowned 32 +tilt 32 +caveats 32 +stressful 32 +foothold 32 +portrait 32 +nail 36 +gross 32 +oc 4 +om 8 +honors 32 +oh 14 +more-open 32 +current 102 +retirement 36 +exception 32 +beau 32 +optics 32 +bear 38 +look 38 +influence 32 +holds 104 +asset-management 32 +guide 36 +titled 32 +more-modest 32 +roundtable 4 +assert 32 +fend 32 +titles 32 +extraordinarily 32 +saga 4 +courtney 4 +organizations 32 +fidelity 14 +myers 12 +strikes 32 +relationships 32 +abandons 32 +malveaux 12 +no-strike 32 +ex-officers 4 +hudson 12 +presentations 32 +pontiac 14 +camden 2 +largely 32 +candy 36 +disastrous 32 +lansing 12 +special-operations 32 +publishing 46 +funds 46 +year-to-year 32 +significance 32 +colleges 32 +regrets 32 +genetically 32 +city 46 +gym 36 +visas 96 +parable 32 +retains 32 +connected 32 +gigantic 32 +irvington-on-hudson 2 +overtime 32 +belongs 32 +limited 36 +davidoff 12 +gulyas 4 +scrymgeour 12 +lingering 32 +plummet 32 +weaknesses 32 +forwarded 32 +nhrd 8 +interest-sensitive 32 +integrating 32 +tightening 32 +acutely 32 +trombonist 32 +evil 32 +flopped 32 +documentary 32 +forwarder 32 +erupt 32 +shurkin 4 +ruesselsheim 4 +colorado-brewed 4 +vindicated 32 +unlucky 32 +battles 32 +north-south 32 +baffling 32 +lng 4 +became 96 +father-in-law 32 +courter 12 +lnc 4 +left-leaning 32 +insensitivity 32 +ballooning 40 +phase-down 32 +transportable 32 +processini 4 +antibiotic 32 +processing 32 +promotional 96 +two-year-old 32 +mouthpiece 32 +poses 32 +easiest 32 +mishaps 32 +upgradings 32 +royko 4 +proportion 32 +providing 36 +australia 14 +penchant 32 +equitable 38 +dropping 32 +intimidated 32 +uncounted 32 +puppeteers 32 +lisa 4 +s.s. 4 +falcone 4 +certainly 34 +marginal 32 +empress 32 +phosphate 4 +unscrupulous 32 +genius 32 +inside-information 32 +leans 32 +fluctuations 32 +executed 32 +counsel 96 +rhetoric 32 +releasing 32 +bar-illan 12 +desist 32 +consequences 32 +preferences 32 +moline 4 +laughed 32 +asthmatics 32 +theatre 4 +proposing 32 +gibson 12 +precedent 32 +broadway 4 +cutting 32 +rosalind 2 +applicants 32 +thriving 32 +accumulated 32 +pentagon 14 +screened 32 +outlet 32 +maine 4 +sounded 32 +commodity 46 +seals 32 +aerosol 32 +horoscopes 32 +subsidiary 100 +oversight 32 +grind 32 +msft 8 +downhill 32 +pty 4 +midnight-to-5-a.m. 32 +full-financing 32 +hoe 32 +utility 36 +eliminates 32 +concurred 32 +funaro 12 +disaffection 32 +weigh 32 +agios 4 +hop 32 +secure 32 +slightly 36 +hot 34 +how 46 +hilarity 32 +attorneys 42 +tokyo 14 +fortney 8 +rebellious 32 +commercial/investment 32 +governance 32 +tapped 32 +recapitalization 36 +diuretic 32 +griffith 4 +petronius 4 +gunshots 32 +rallied 32 +formally 32 +artist 32 +maneuverings 32 +resorting 32 +bbf 8 +lagged 32 +sponsoring 32 +deferring 32 +resigns 40 +studios 36 +bkne 8 +clears 12 +affluent 32 +armonk 4 +early-warning 32 +shorter 32 +maryland 4 +meat 100 +probed 4 +dwellers 32 +avoid 36 +seeing 34 +battery 32 +mean 32 +shorted 32 +likewise 34 +obsession 32 +party 36 +mead 4 +shorten 32 +protein 32 +deerfield 12 +deja 32 +soviet-backed 4 +unocal 6 +posters 32 +high-powered 32 +attention 32 +collapsing 32 +sectoral 32 +longs 32 +evade 32 +examples 34 +andy 4 +lending 32 +restructuring 44 +box 96 +write-offs 32 +weiss 4 +shade 32 +bog 32 +wilkis 12 +hammer 36 +hrs 4 +sophisticated 38 +shocking 32 +d.w. 4 +absorbed 32 +american 14 +california 12 +forecasting 36 +americas 4 +landing 32 +hrd 4 +indemnify 32 +keels 32 +condemning 32 +insights 32 +whirl 32 +deere 6 +pre-split 32 +lefty 4 +privatized 32 +fdic 6 +outsiders 32 +resolutions 32 +bargains 32 +tower 44 +tarnished 32 +daley 12 +underwater 32 +contamination 32 +homo 4 +petrol 32 +scandinavian 4 +boeing 14 +head-to-head 32 +unspoken 32 +home 46 +elevators 32 +assiduously 32 +bingham 4 +kilns 32 +plane 32 +alleged 32 +dartmouth 4 +institute 36 +among 46 +knox 4 +predominantly 32 +masayoshi 4 +elect 32 +reichstuhl 4 +bala-cynwyd 4 +foreshadowed 32 +complexion 32 +codes 32 +plant 108 +pioneer 46 +brew 32 +creators 32 +cells 32 +plans 110 +posed 32 +bilion 32 +sandbagged 32 +ill.-based 4 +arbs 32 +trash 36 +thousands 38 +garrett 14 +elkes 8 +recommending 32 +appraised 32 +florida 12 +haggarty 4 +confair 12 +enviromental 32 +horwitz 4 +lends 32 +individual 32 +ponderous 32 +dangerous 40 +vying 32 +courtier 32 +well-trained 32 +posting 32 +fatigue 32 +janeiro 4 +radically 32 +accusatory 32 +tsuyoshi 4 +shopkeeper 32 +zwerin 12 +careful 32 +shrieks 32 +unusual 32 +towers 32 +eagleton 12 +foresees 32 +fever 36 +lasts 32 +vouchsafed 32 +binlc 8 +traditionally 34 +on-call 32 +principle 32 +refunds 32 +propose 44 +replacement 32 +proportionate 32 +correctly 32 +saying 36 +disapproved 32 +severely 32 +dealers 34 +roberto 4 +melville 8 +roberts 12 +tacoma 8 +through 42 +cheerleaders 32 +doom-and-gloom 32 +hipps 4 +prime-time 32 +fdx 12 +wired 32 +exposure 32 +electoral 32 +than 100 +equation 32 +entertainer 32 +scuttled 32 +sikh 6 +bloods 32 +regained 32 +sabotage 32 +thinker 32 +shalala 8 +organ 32 +double-a-3 32 +double-a-2 32 +encouraged 36 +irvine 14 +irving 6 +coal-management 32 +warfare 32 +unfairly 32 +cameroon 4 +red 36 +wonder 36 +facets 32 +goldman 14 +wave 32 +sodium-borohydride 32 +flesh 32 +abbott 14 +permitted 32 +bikers 32 +silibis 4 +cancelling 32 +rash 32 +notre 4 +doubled 36 +italian 14 +judaism 4 +irksome 32 +blasted 32 +mendham 4 +standoff 32 +breached 32 +islands 36 +cwm 8 +outraged 32 +imagination 32 +henceforth 32 +sport 32 +triumphant 32 +kiplinger 4 +aggravated 32 +sour-cream 32 +arida 12 +antimissile 32 +cent 32 +aurora 4 +balanchinism 4 +idles 8 +transfusions 32 +spartacus 4 +vanish 32 +i.m.s. 4 +wherever 32 +washboard 32 +licenser 32 +licenses 32 +blind 32 +originate 32 +a.g. 4 +identified 32 +sight 32 +shareholder-rights 32 +accept 32 +philips 14 +dickstein 4 +purports 32 +reveal 32 +evaluation 32 +quo 32 +probably 96 +ret 4 +mccarthy 12 +rule-making 32 +point-guard 2 +contraction 36 +information-providing 32 +performances 34 +nutsiness 32 +predecessors 32 +conflicts 32 +alfa 4 +retool 32 +absurd 32 +buys 36 +contradictions 32 +flush 32 +brownsville 4 +motifs 32 +ilan 4 +magically 32 +politics 32 +escalation 32 +primitive 32 +ominous 32 +johns 12 +profile 32 +calif.-based 4 +calling 34 +absence 32 +jeffrey 6 +settlement 44 +shown 32 +gm-csf 4 +gashed 32 +cheerleader 32 +rectified 32 +mobile 32 +newcomer 32 +beverages 32 +contrast 32 +confident 32 +fact 32 +conditioned 32 +snapshot 32 +babble 32 +ringed 32 +aggression 32 +back-office 32 +inspector 32 +array 32 +escalates 32 +kriftcher 8 +blonde-laden 32 +injuring 32 +diploma 32 +designation 32 +permeate 32 +allegiance 32 +bunch 32 +ronk 8 +txel 8 +nakasone 4 +mcniff 8 +lengths 36 +moto 14 +milford 12 +rudolph 14 +city-state 32 +infrequently 36 +knowing 36 +sworn 32 +garbage 32 +barometers 32 +attempting 32 +tlr 4 +holstein 4 +logic 36 +bridesmaids 32 +space-based 32 +slimmer 32 +sensibly 32 +australians 4 +backlog 36 +scenes 32 +president 110 +far-flung 32 +merchandising 32 +entity 32 +one-year 32 +ounce 32 +starship 4 +often-ignored 32 +kathryn 4 +hideout 32 +talents 32 +caine 4 +feedback 32 +ways 36 +replied 32 +implementation 32 +tobacco 44 +follow 34 +standardizes 32 +linkenauger 8 +ghostly 32 +stomp 32 +highest-volume 32 +touchstone 32 +tough-talking 32 +containers 32 +brandon 4 +revocation 32 +seven-nation 32 +denies 32 +hedge 32 +micro-marketing 32 +indefinite 32 +elevator 32 +techniques 36 +ballerina-like 32 +constitutional 32 +e. 4 +squabble 32 +spending 34 +denied 32 +many 46 +orem 4 +ill 36 +personally 32 +quickened 32 +taint 32 +usually 38 +stevens 8 +denying 32 +menuetto 4 +contempt 32 +jordanian 4 +magnetism 32 +unnecessary 32 +bond-trading 32 +shepherd 12 +tended 32 +rosy 36 +sofaer 8 +interviews 32 +rose 44 +distorted 32 +slyly 32 +quotas 38 +dowd 4 +package 36 +tender 44 +connecticut-based 4 +heron 6 +gentle 32 +dame 4 +motor 44 +tylenol 4 +locke 4 +berry 4 +rothman 4 +miscast 32 +position 96 +damn 32 +k 4 +ed 14 +roebuck 4 +wielders 32 +ec 12 +state-funded 32 +en 36 +el 6 +confusing 32 +ek 12 +t.dhc 4 +fevers 32 +rate-increase 32 +donated 32 +gunshot 32 +uchida 4 +consists 32 +iacocca 12 +new-hire 32 +voluntary 32 +packs 32 +provincially 32 +path 32 +tend 32 +haul 32 +isaac 4 +ratios 32 +normick 4 +challenges 32 +hugel 12 +experimenter 32 +inhibit 32 +buttery 32 +rollover 4 +hopelessness 32 +preparedness 8 +foreign-currency 32 +harvesting 32 +renewal 32 +closely 102 +aai 2 +deflation 32 +reintroduced 32 +skim 32 +chm 4 +conservatorship 32 +illegally 96 +kilowatt-hours 32 +walid 4 +tickets 36 +fantasy-at-home 32 +session 40 +chancellor 36 +suppressed 32 +schlumberger 14 +amtrak 4 +aquitaine 4 +subsidies 44 +joneses 4 +medrich 12 +depart 32 +slates 4 +chemicals 40 +royalty 4 +idle 32 +queen 44 +transcriptions 32 +headdress 32 +consideration 32 +behalf 32 +stettin 4 +maury 4 +hyatt 4 +greener 4 +barringer 4 +squeaked 32 +arsenal 38 +elections 32 +skis 32 +felonies 32 +skokie 8 +artel 10 +silicon 36 +losses 100 +discard 32 +kawasaki 6 +petrofina 4 +nutshell 32 +standing-room-only 32 +beets 32 +rebounding 32 +paste 32 +minstar 8 +sheets 32 +teamwork 36 +lovers 36 +zaentz 12 +charleston 14 +race 38 +tax-shelter 32 +pound 32 +stocks 110 +fabric 32 +anti-competitive 32 +reining 32 +pasta 32 +frets 32 +b-1b 4 +rack 32 +year-ago 46 +century 44 +hit 44 +good-natured 32 +meager 32 +hip 36 +trump 14 +overestimated 32 +handicapped 32 +announced 96 +cigars 32 +premark 14 +gas-turbine 32 +marble-floored 32 +silvercrest 14 +walesa 4 +weeded 32 +uneasy 32 +simpler 32 +daily 100 +that 126 +gundy 4 +watkins 12 +expires 32 +tonalities 32 +tape 32 +hindsight 32 +invalidated 32 +penn 12 +differed 32 +pumps 32 +refinery-run 32 +siemens 6 +dmgif 8 +wrong 36 +explode 32 +modifications 32 +expired 32 +seeking 36 +principally 32 +pent 32 +ring-shaped 32 +emphasis 32 +succeed 32 +tragically 32 +going-private 32 +tendencies 32 +performers 32 +disguise 32 +dynamic 32 +casino 36 +craig 12 +sia 12 +contenders 32 +spit 32 +permission 32 +usbk 8 +palmolive 4 +usher 32 +circumstance 32 +unveiled 32 +concerning 32 +expressivity 32 +beautiful 36 +clearances 32 +optimism 32 +break 32 +bread 32 +maligned 32 +wisely 32 +strategy 36 +tagged 32 +acker 12 +telerate 12 +opinion 38 +fares 36 +jyll 4 +breau 8 +tweak 32 +sopranos 32 +romantic 34 +less-costly 36 +flipped 32 +threatened 32 +ratepayer 32 +acting 44 +availed 32 +ago 44 +aga 4 +age 36 +whom 32 +adopts 12 +staffing 32 +wichita 12 +village 32 +creditwatch 4 +howard 14 +destinations 32 +promising 32 +bride 36 +earth-stuff 32 +deutsche 36 +anglo-irish 4 +planted 32 +add-vantage 6 +fischer 4 +commission 44 +dash 32 +extinction 32 +law-abiding 32 +embrace 32 +cool 32 +commodities 44 +implantable 32 +keyt 4 +tool 36 +blockbusters 32 +bruce 14 +controlling 32 +lessor 32 +non-consumer-related 32 +interfering 32 +home-improvement 32 +darby 4 +chase 46 +jennifer 2 +kinderhill 4 +exam 32 +lesson 32 +become 32 +mnst 4 +flop 32 +logistical 32 +parking 32 +russian 4 +sabotaging 32 +innocence 32 +get-up 32 +retire 100 +contesting 32 +strikingly 32 +bimonthly 32 +landry 4 +weatherly 12 +appointing 32 +divulging 32 +traveled 32 +fills 32 +swore 32 +flagrant 32 +graveyard 32 +acolytes 32 +buyers 96 +charmer 32 +prosecutor 32 +jnj 8 +stemple 12 +shattuck 4 +carefully 32 +mooney 4 +edging 32 +clung 32 +ecdysiast 32 +ditto 2 +wheeling-pittsburgh 2 +piano 32 +distraction 32 +junk 32 +felix 2 +mattingly 12 +courts 102 +circuits 32 +deep-rooted 32 +defective 32 +nav 8 +whenever 34 +barish 4 +hurt 36 +twain 32 +correct 32 +food-service 32 +s-corporation 6 +germalists 32 +guarantees 32 +last-ranked 32 +west 46 +gradually 36 +his 46 +o 12 +easter-egg 4 +has-been 32 +accounted 32 +guaranteed 36 +fields 44 +outrageous 36 +high-volume 32 +information-age 32 +treasury-department 32 +usage 2 +thermo 8 +condition 32 +guarding 32 +meters 32 +t3100s 4 +direct 32 +tactics 32 +switch 36 +caribbean 4 +asta 4 +yelena 4 +blue-and-yellow 32 +devoted 32 +obstacle 32 +lawyers 46 +dynasty 4 +athletics 32 +curious 32 +imperatives 32 +mcdowall 12 +ohbayashi 4 +work-force 32 +democracy 36 +transfers 96 +bradlees 4 +award-winning 32 +execution 32 +a.m.e. 2 +blows 32 +bigelow 4 +overboard 32 +comers 32 +philippine 6 +decent 32 +convention 36 +admission 32 +brueghel 4 +dayton 12 +faster 40 +opinions 32 +destined 32 +keizai 4 +conducted 32 +cratered 32 +rozen 4 +recalls 32 +kai 4 +meeting 36 +middle-level 32 +safety-equipment 32 +cost-conscious 32 +acid 32 +appropriate 32 +kab 8 +approve 44 +boosterism 32 +preacher 32 +methyl 32 +misunderstandings 32 +armstrong 14 +masx 4 +oversee 32 +unfortunately 34 +thereby 32 +misgivings 32 +entertain 32 +hertzberg 4 +dashed 32 +accordingly 34 +pox 32 +precede 32 +hyde 12 +professorial 32 +battle 36 +frommer 12 +warburg 10 +sources 46 +within 34 +improve 32 +louisiana 12 +call-ups 32 +expert 32 +licensed 32 +ver 4 +heard 44 +dilson 4 +deloitte 4 +bennes 6 +pocket 36 +gritty 32 +senior 100 +automated 32 +platform 32 +geneva 4 +boorstin 4 +loan-rescheduling 32 +cars 36 +incur 32 +staffers 36 +socially 32 +trumpets 4 +controlled 96 +re-announced 32 +commentator 32 +arizona 14 +atrc 4 +shipowners 32 +third-party 32 +closed-end 32 +balletomanes 32 +role 108 +brennan 8 +harvard-educated 4 +roll 32 +clark 12 +caesars 14 +winning 36 +defense-oriented 32 +robbins 14 +poured 32 +third-place 32 +lessen 32 +move 44 +stapleton 4 +banks 110 +passenger-car 32 +collomb 12 +reseach 32 +tnt 6 +strict 34 +single-a-2 32 +mo 4 +m.b.a.s 4 +solidly 32 +reductions 32 +manning 8 +barker 4 +intro 32 +ours 32 +fiat 12 +mid-1987 32 +distillers 4 +hasn 98 +mid-1988 32 +tnm 4 +intact 32 +duties 36 +philippines 4 +rebuilding 32 +nonbinding 32 +compromised 32 +veto 32 +mitzi 4 +rekindling 32 +sheriff 36 +pacemakers 32 +meshed 4 +murdock 12 +murdoch 8 +pinnacle 4 +township 32 +money 46 +por 4 +haskins 4 +exhaust 32 +guillermo 2 +tacked 32 +allergy 36 +marius 4 +establish 32 +undercharging 32 +flourished 32 +critiques 32 +rearranging 32 +finale 32 +manley 12 +urges 36 +sane 32 +sand 32 +sang 32 +sanf 4 +accountemps 2 +donaldson 6 +syrian-lebanese 4 +unanimously 32 +urged 32 +bluefield 4 +gupta 4 +you 38 +sank 32 +bancorp 4 +baine 4 +killed 32 +trico 4 +riling 32 +trick 32 +forks 4 +puccini 4 +dollar 108 +agreed 96 +dealing-room 32 +strident 32 +trade-deficit 32 +perfectly 32 +r.t. 2 +stronger 38 +linear 32 +stomping 32 +laughs 32 +no 110 +story 36 +nl 4 +b-1 12 +ortner 4 +streamlined 32 +lack 32 +tackle 32 +claim 32 +wolfe 4 +turnover 32 +p 8 +bamford 12 +sequestered 32 +boot 32 +book 36 +egon 4 +reveals 32 +vli 14 +paddio 4 +categories 32 +boom 38 +restrict 32 +syne 4 +decorator 32 +count 36 +mountlake 8 +shows 36 +spadaro 8 +troopers 32 +bulkier 32 +inspired 32 +idealized 32 +hiding 32 +nowhere 34 +tele 8 +telc 8 +hypotheses 32 +typical 32 +inspires 32 +deep-seated 32 +pare 36 +nessen 4 +high-bypass 32 +manageable 32 +arrow 14 +stops 32 +our 38 +pezim 12 +beutel 4 +dormant 2 +appeal 36 +truck-trailer 32 +cozy 32 +sought 44 +enjoins 4 +appear 32 +asset 46 +charlotte 4 +deborah 2 +fade 32 +eminent 32 +computerizing 32 +darman 12 +miles 32 +bet 32 +serenade 4 +bev 4 +sister 32 +insufficient 32 +turtle 32 +journeyed 32 +ovarian 32 +provide 32 +tempting 32 +monopolies 32 +rolls-royce 4 +prestowitz 4 +valuations 32 +walks 32 +voltage 4 +inordinately 32 +colton 4 +bel 4 +dung 4 +title 32 +villain 32 +tested 32 +foundered 32 +proceedings 32 +vittorio 2 +turks 4 +garments 32 +murky 32 +routines 32 +federally 32 +all-too-familiar 32 +motor-hotel 32 +dining 32 +gloomy 32 +health-threatening 32 +g.f. 2 +pattern 36 +coelho 4 +sprinted 32 +heterogeneity 32 +pds 4 +spectacular 32 +species 32 +dinners 32 +flirtation 32 +protracted 32 +wishner 4 +nationalist 32 +ferdinand 4 +talkers 32 +lunchmates 32 +lenient 32 +zen 4 +jill 4 +cross-subsidization 32 +high-profile 32 +zee 4 +tight-lipped 32 +near-term 32 +charming 36 +reserves 38 +spruce 32 +beezley 4 +humming 32 +stew 4 +stiff 32 +step 32 +raced 32 +cit 4 +up-to-date 32 +medical-diagnostic 32 +nosedived 32 +spots 32 +barton 12 +cil 4 +lapses 32 +cih 4 +accommodate 32 +stem 32 +high-yield 34 +pre-world 32 +predecessor 32 +sauteed 32 +free-lance 32 +appetizer 32 +mention 32 +roomier 32 +reaching 32 +minimized 32 +failed 36 +celebrity 36 +nationwide 36 +syrians 4 +football-field 32 +unpopular 32 +zeros 32 +nonetheless 34 +jaques 12 +low-key 32 +greenback 32 +magnuson-moss 4 +true 34 +reincorporation 32 +truk 8 +gutfeld 4 +treasurer 36 +paulson 12 +palatable 32 +warehouses 32 +braniff 4 +edp 12 +pre-nuptial 32 +vitality 32 +calming 32 +starving 32 +ndunduma 4 +simons 8 +rate-economic 32 +taiwanese 10 +prank 32 +warehoused 32 +self-fulfilling 40 +macintosh 4 +yasuhiro 4 +eproms 4 +extendable 32 +authoritative 32 +pill 32 +identify 36 +unconnected 32 +wet 32 +campbelltown 4 +newton 8 +vineyards 32 +couched 32 +moderates 40 +wen 8 +deployment 32 +escalated 32 +financings 32 +wed 32 +wears 32 +ridiculously 32 +pursuit 32 +web 32 +rotterdam 4 +chucking 32 +grant 46 +wondered 32 +market-auction 32 +blunder 32 +testing 96 +penney 8 +commonly 32 +easing 32 +vie 32 +flashier 32 +grand 36 +vic 8 +penned 32 +inflow 32 +deisz 4 +vin 4 +remain 32 +centauri 4 +capital 46 +kohl 4 +inspections 32 +island 36 +missile 108 +suggests 32 +dwindled 32 +region 32 +cycles 32 +draws 32 +hospitals 96 +exclusivity 32 +alters 4 +cash-strapped 32 +show-business 32 +manipulated 32 +convictions 36 +glenview 12 +painfully 32 +heads 96 +olmstead 4 +frankly 32 +subsidiaries 36 +veterans 36 +recitation 32 +mutual-fund 40 +current-dollar 32 +personnel-related 32 +benny 4 +german-supplied 2 +enclaves 32 +across-the-board 32 +a 126 +preserve 32 +readers 32 +bonding 32 +gone 36 +benson 4 +one-shot 32 +softness 32 +red-faced 32 +telling 32 +cut-rate 32 +stress 32 +cautioned 32 +trop 4 +trot 32 +culminating 32 +surviving 32 +troy 40 +somoza 4 +amsterdam-based 4 +behaving 32 +eurobond 4 +conclusion 32 +nikkei 4 +carlyle 12 +lubensky 8 +wagoneer 4 +equals 32 +agents 32 +prohibitive 32 +author 32 +attracting 32 +counselor 32 +interrupt 32 +decoder 32 +pratt 14 +couriers 32 +teikoku 4 +warranties 32 +extra-curricular 32 +smelting 32 +commercially 32 +spokesmen 34 +youthful 32 +reservation 32 +yew 4 +snaps 32 +fried-chicken 32 +equipped 32 +culminates 32 +alaskan 4 +shoot 32 +pride 32 +perks 32 +legally 32 +working 34 +muddling-through 32 +chazov 4 +chef 32 +forest 36 +equalized 32 +charm 32 +other 110 +addressing 34 +health-insurance 32 +crude 102 +safeguards 32 +appreciable 32 +promotion 32 +hostages 96 +films 32 +leblond 4 +u.s. 14 +jmb 4 +quantities 32 +quaintness 32 +tutelage 32 +reshuffled 32 +afrikaans-language 4 +hamm 8 +outlined 32 +thanks 32 +peopled 32 +curran 4 +glassmaker 32 +fare-restructuring 32 +battling 32 +stock-trading 32 +conceding 32 +seesaw 4 +taft 14 +asserted 32 +far 102 +peoples 32 +outlines 32 +overstepped 32 +staging 32 +four-alarm 32 +false 36 +seat-of-the-pants 32 +duplication 32 +billions 32 +handled 32 +personifies 32 +storm 36 +fan 32 +soybean 34 +emulated 32 +insensitive 32 +personified 32 +yield 36 +acceptability 32 +thwarted 32 +worthy 36 +unconcerned 32 +colleagues 34 +urging 32 +vote-buying 32 +accessibility 32 +decoupled 32 +toussie 12 +marginally 32 +roche 4 +butt 32 +salon 32 +reflection 32 +harper 4 +dollar-stocks 4 +opened 32 +aussies 4 +seven-day 32 +clings 32 +reject 36 +entering 32 +unloaded 32 +pantheon 4 +gimmick 32 +fingers 32 +depends 32 +oldsmobile 8 +mystic 32 +sysm 8 +env 4 +car-market 32 +grateful 32 +allude 32 +obligated 32 +tough 46 +shunned 32 +pending 34 +implement 32 +swartz 4 +laundrette 4 +ene 4 +end 36 +multiple 32 +barbella 8 +yeutter 12 +claiborne 8 +most 46 +proprietor 32 +plead 32 +recognizing 10 +spotlight 32 +identification 32 +nobody 38 +mortars 32 +actress 36 +privatize 4 +limousines 32 +driving 36 +saks 4 +demise 32 +defining 32 +confinement 32 +spacious 32 +pleas 32 +downgraded 96 +architect 40 +felon 32 +bittersweet 32 +presumption 32 +farms 36 +franchisees 36 +spinoffs 32 +selected 32 +lacking 32 +man-to-man 32 +rebates 32 +hamilton 4 +gruntal 4 +downgrades 32 +pneumonia 32 +commercial 46 +unproductive 32 +discreet 32 +expiration 32 +pittsburgh-based 4 +next 110 +pha 4 +shamberg 12 +pale 32 +sugary 32 +vacillation 64 +formidable 32 +palo 8 +schierl 8 +zccbs 4 +orally 32 +meaningless 32 +economically 32 +brazilian 14 +ottawa 12 +pals 32 +byrne 12 +code 36 +realized 32 +maxsavers 12 +angels 36 +sparked 32 +clny 4 +showgirl 32 +mystery 36 +proven 32 +restructurings 32 +lillie 8 +intermingling 32 +toledo 4 +proves 32 +realizes 32 +norand 4 +emission 32 +stony 2 +sides 36 +prevalence 32 +streeters 4 +ideally 34 +conduct 32 +acrid 32 +participation 32 +organs 32 +hainan 4 +steelmaking 96 +back-and-forthing 32 +forelock 32 +approximately 34 +mcalpine 4 +debtholders 32 +spillman 8 +rapidly 32 +internationally 32 +dissuade 32 +attendant 32 +prompt 32 +ranky 4 +jr. 4 +tracts 32 +empty 32 +interpublic 6 +n.m. 4 +afl-cio 4 +illness 32 +mindful 32 +alaska 6 +rushing 36 +harbert 4 +witnesses 32 +sanctions 100 +motivations 32 +tim 6 +larry 14 +awaiting 36 +cassettes 32 +name 36 +recitatives 32 +roll-out 32 +assumed 96 +prospect 32 +user 32 +uses 32 +outfitting 32 +touches 32 +selectively 32 +sherwood 6 +assumes 32 +pope 4 +trustee-like 32 +memphis 12 +touched 32 +used 44 +marvin 6 +t.ims 4 +shoe 36 +anti-nazi 32 +blockbuster 46 +islamic 4 +concerns 106 +comprising 32 +oligopoly 32 +anders 4 +jra 4 +rehabilitation 32 +lots 36 +show 36 +grumbling 32 +mccormick 10 +shop 36 +crocker 4 +fleecer 4 +layout 32 +grim 32 +marmon 4 +matthew 4 +arrangements 32 +eyes 32 +add 36 +clumsy 32 +radar 100 +ada 4 +bullish 32 +yang 8 +terminated 36 +spend 32 +low-cost 32 +pivotal 36 +yank 32 +briefs 2 +constant 96 +reeling 32 +contents 32 +transcend 32 +guillotine 32 +alluringly 32 +hussein 4 +september 4 +liberalized 32 +herbs 32 +wages 38 +attendance 32 +potted 32 +larceny 32 +cargo 96 +greater 32 +trees 32 +past 38 +pass 32 +milhollin 4 +provident 4 +dissenting 32 +peasant-style 32 +nonprofit 32 +rewards 32 +t.spz 4 +guiliani 8 +prized 8 +directly 40 +high-risk 32 +high-rise 32 +wiping 32 +travelers 36 +sections 32 +erosion 32 +hampton 4 +alto 4 +nipny 4 +zero-coupon 32 +agricultural 98 +neighborhoods 32 +happy 32 +lockheed 6 +swanson 12 +straight 36 +non-whites 32 +isaly 12 +plump 32 +cooke 4 +plugging 32 +every 102 +prerequisite 32 +shareholder-solicitation 32 +speculate 32 +boston-based 4 +terrific 32 +chocolate 36 +nobility 32 +dime 12 +features 32 +mold 32 +destabilize 32 +belonged 32 +enmity 32 +chocolaty 32 +crowded 32 +equal 32 +ills 32 +featured 32 +dims 4 +holder 44 +trainees 32 +expect 36 +jean-jacques 2 +abrupt 32 +auditing 32 +seidler 4 +called 38 +broadest 32 +customs 44 +oath 4 +check-kiting 32 +youth 32 +sits 32 +jam 4 +quality 36 +swedes 4 +rolls 4 +semiconductors 38 +repented 32 +lifetime 32 +uncontrived 32 +foreign-made 32 +caisse 6 +buzzword 32 +trustees 36 +blend 32 +were 106 +shift 32 +site 36 +holidays 32 +strassner 8 +grains 2 +infocorp 4 +mark 46 +korner 4 +divisiveness 32 +triumphing 32 +marc 4 +wheels 32 +police 38 +suicidal 32 +accomplish 32 +poised 32 +mary 4 +inundated 32 +offsetting 34 +leaks 32 +mart 32 +mars 4 +prominent 32 +naturally 34 +spokeman 32 +masks 32 +niagara 14 +kraft 14 +mississippi 6 +defends 32 +structured 32 +helgi 4 +gleaming 32 +lci 4 +higher-priced 32 +bottom 36 +narrowly 32 +kirchner 4 +desktops 32 +structures 32 +lce 4 +roses 34 +meinertzhagen 4 +justly 32 +ambulances 4 +betting 32 +murray 6 +connecting-flight 32 +stretch-out 32 +guilder 32 +strains 32 +leveled 32 +terminating 32 +reproach 32 +commercials 32 +alluded 32 +refusing 32 +ross 12 +governors 38 +full-fledged 32 +mountains 36 +warrick 4 +proceeding 32 +brussels 12 +beneficiaries 32 +reality 32 +pillar 32 +apawamis 4 +reconsider 36 +unavailable 32 +butane-powered 32 +designs 32 +industrial-policy 32 +mid-1970s 32 +suspicious 32 +ingenuity 96 +shades 32 +yawata 4 +surrounded 32 +neither 34 +nitro 12 +electrical 100 +taxpapers 32 +fein 4 +focusing 32 +washingtonian 4 +lerner 8 +rosen 4 +tokkin 32 +housewares 32 +badly 32 +then-preeminent 32 +application 32 +comedy 32 +service 46 +attending 32 +noises 32 +concentrations 32 +minimal 32 +fialka 8 +chic 32 +comdata 14 +restaurant 32 +knot 32 +know 36 +bette 2 +graves 12 +levies 32 +intense 36 +stream 32 +nonstop 32 +reversals 32 +go-between 32 +cash-rich 32 +thymidine 32 +automobiles 32 +fisher 6 +disney 12 +carpet 32 +necessary 32 +levied 32 +discounted 32 +nonresidential 32 +oasis 32 +pension 36 +champlain 4 +gold 110 +golf 32 +arbitrary 32 +pulled 32 +blytheville 4 +rapids 4 +pulley 32 +solid-waste 32 +screwdriver 32 +absorb 32 +posts 44 +acknowledgment 32 +chestnuts 32 +omnicom 14 +adoption 32 +barrel 36 +hollow-cheeked 32 +barren 32 +wisdom 32 +indicator 36 +missed 34 +officer 98 +kimberly-clark 4 +barred 32 +women 38 +magnavision 4 +what 46 +night 36 +misses 32 +lucrative 32 +ridden 32 +democratic-controlled 4 +crager 8 +celso 4 +parliamentary 32 +curiously 32 +champagne 32 +silenced 32 +graduate 36 +offices 100 +concludes 36 +billboard 32 +lacked 32 +november 4 +tungsten 38 +pressuring 32 +snarl 32 +werner 4 +brainstorming 32 +eagle 4 +lilliputian 4 +outdated 32 +snickered 32 +sis 4 +bonar 12 +colo.-based 4 +railway 36 +ricans 4 +mores 32 +agrees 44 +hicksville 8 +drove 32 +leonard 6 +unaffected 32 +ownership 32 +gambling 38 +single-a/a-1 32 +revealing 32 +couples 32 +weekdays 32 +succumbing 32 +explained 32 +cannes 4 +congress 46 +mona 4 +overtaken 32 +dice 32 +dick 4 +maple 32 +blackmail 32 +herring 32 +investigator 32 +retainer 32 +spanish 12 +mont 4 +goals 96 +arabia 4 +labor-force 32 +shutting 36 +tourney 32 +telemann 4 +inseparable 32 +buildup 32 +real-estate 96 +providence 12 +small 36 +invention 32 +ira 4 +beneficiary 32 +zurich 4 +hitting 32 +tvx 4 +rockets 32 +funniest 32 +re-transmit 32 +inflating 32 +changes 46 +collection 36 +naturalization 4 +build 96 +punk 32 +renominations 8 +network 44 +tully 4 +complimented 32 +unknown 34 +conn. 4 +heading 32 +stretch 32 +surcharges 32 +glutted 32 +gut 32 +transfer 32 +sector 36 +designate 32 +fleeting 32 +lie-detector 32 +cleanse 32 +midland 12 +gun 32 +recipient 32 +ramsey 4 +unfathomable 32 +pre-schoolers 32 +origination 32 +refinements 32 +spillover 34 +berri 4 +churning 32 +midterm 32 +style 32 +rapid 32 +soderblom 12 +lew 4 +troubled 36 +leu 4 +let 46 +les 12 +ugliest 32 +landro 4 +ore. 4 +leo 6 +prosecution 32 +nadzick 4 +theoretically 2 +abandon 32 +self-control 32 +leg 36 +triggered 32 +real-world 32 +led 96 +cookie-cutter 32 +frustration 32 +perpetrated 32 +submits 32 +labant 8 +ipos 4 +armtek 4 +chairman 110 +black-led 32 +transmitted 32 +sparingly 32 +agricultural-debt 32 +swofford 4 +minority 32 +quebecor/british 4 +kbh 4 +disk-drive 40 +maui 4 +shipments 36 +translated 32 +hold 32 +relic 32 +expanding 96 +unprofitable 32 +gorda 4 +prettiness 32 +somerville 8 +ethnic 32 +catch 36 +syndicate 32 +surrounding 32 +departed 32 +enterra 4 +supplication 32 +quicksands 32 +cheer 32 +wood-paneled 32 +employing 32 +intercontinental 32 +year-earlier 38 +enacting 4 +times 46 +summoned 96 +landslide 32 +mocatta 4 +smells 32 +authors 32 +producing 32 +expenditures 32 +shogun 4 +breathes 32 +decks 32 +vein 32 +risk 36 +chiefs 44 +rise 44 +kissing 32 +ex-management 32 +repercussions 32 +sea-otter 32 +supremacy 32 +skywest 14 +because 110 +outset 32 +distressing 32 +aluminum 36 +immunized 32 +divested 32 +affirming 32 +hate 32 +concurs 32 +okla. 4 +bendix/martin 6 +whirlpool 10 +republicans 4 +judiciary 36 +drabkin 12 +icahn 12 +delegate 32 +cbe 8 +penalty 36 +rt.a 12 +morally 32 +moving 36 +fontana 4 +types 36 +brown 46 +latched 32 +life-of-contract 32 +daughter 32 +activist 32 +birth-control 32 +bank-dallas 4 +english-language 4 +president-elect 4 +ventures 36 +honda 12 +british-based 4 +echoing 32 +unbearable 32 +andrea 4 +camps 36 +hancock 8 +kerchief 32 +kilos 32 +mineral 32 +colo. 4 +counterbid 32 +half-million 32 +louis-based 8 +faithful 32 +shortcut 32 +superstation 32 +closed 44 +undisclosed 32 +easily 32 +renting 32 +walls 32 +resolves 32 +revolt 32 +antonio-based 4 +vlsi 4 +iceland 4 +explosion 36 +take-home 32 +suites 4 +minot 4 +minor 38 +trouble-shooter 32 +injuries 32 +mazanec 8 +schedules 32 +indexation 32 +stupefaction 32 +tonic 32 +maytag 14 +divestments 32 +detente 32 +suited 32 +argument 32 +spiraling 32 +collapsed 32 +insider-trading 36 +sprinting 32 +technicare-related 4 +clearly 38 +automobile 32 +zayre 8 +taco 14 +reactor 32 +ineligible 32 +qualities 32 +bourbon 32 +adolph 6 +emoluments 32 +strictly 32 +division 100 +sidelines 32 +smash 32 +va.-based 4 +lambasted 32 +unconventional 32 +conservative 36 +winger 4 +knives 32 +opc 4 +scheduled 32 +fastbacs 4 +shilling 12 +yale 4 +reorganize 4 +accompanied 34 +constrained 32 +acidic 32 +pointless 32 +renominating 32 +winged 32 +severed 32 +cancer 36 +finance 38 +duquesne 14 +single-a-minus 32 +ignorance 32 +possession 32 +trekked 32 +editorials 32 +dave 4 +accommodative 32 +formality 32 +gluing 32 +cancel 32 +barney 12 +tour 36 +state-supported 32 +egyptian-born 4 +spotty 32 +evasion 32 +activated 32 +authorizing 32 +barnes 12 +winston-salem 4 +counteroffer 32 +infection 32 +scrimp 32 +calero 12 +heating 34 +resolved 32 +talismans 32 +entrepreneurs 32 +free-energy 32 +heil 4 +railroad 36 +point 36 +volumes 32 +prefer 32 +correspondingly 32 +carting 32 +marian 2 +musician 4 +byuwi 4 +despite 46 +head-on 32 +stabilize 36 +expansionist 32 +air-defense 32 +opposite 32 +obtaining 32 +abroad 36 +windows 36 +legislatures 32 +state-of-emergency 32 +prevented 32 +mechanism 32 +recapturing 32 +performance 32 +anti-khomeini 32 +flowing 32 +midwinter 32 +enjoys 36 +indignation 32 +foreign-aid 32 +numbers 34 +blast 32 +undermine 32 +kick 32 +whittled 32 +public-debt 32 +allowed 32 +non-russian 32 +hentoff 12 +submit 32 +krock 8 +kanawha 4 +aberrations 32 +blase 32 +peace-of-mind 32 +twenty 6 +inequitable 32 +exploiting 2 +dunlop 8 +marco 4 +malpractice 32 +simplicity 32 +heat-processing-systems 32 +enable 32 +mckenzie 12 +march 46 +w-4 4 +low-fare 32 +treating 32 +maurice 6 +vermont 4 +dien 4 +albn 8 +transit 32 +credit-card 42 +flaxen-haired 32 +syndicator 32 +shorter-maturities 32 +cable 46 +speeded 32 +managua 4 +proverbial 32 +quantity 32 +disposition 32 +third-quarter 32 +photographs 36 +rostrum 32 +conform 32 +immune 32 +extradition 32 +illiterate 32 +grooves 32 +relation 32 +consider 34 +limited-service 32 +cultivating 32 +solving 32 +mellifluous 32 +albert 14 +forecast 36 +classical 32 +motherhood 32 +systemic 32 +luke 4 +pink-marble 32 +assists 32 +unc 4 +maxsaver 6 +vcr 4 +ipg 4 +cln 12 +pick-up 32 +consult 32 +metric 32 +denationalization 36 +tennis 36 +timed 32 +coupon 40 +javett 8 +defined 32 +assist 32 +phaedra 4 +dietrich 8 +balance-of-power 32 +relates 32 +grabbed 64 +defines 32 +chlorthalidone 32 +jenner 8 +disqualify 32 +antibiotics 32 +stamping 32 +panama 4 +homicide 32 +superpowers 32 +duncan 4 +reversal 36 +modestly 32 +newborn 32 +imbalances 32 +def 4 +harrison 6 +handed 32 +write-off 32 +mutter 32 +participated 32 +squirming 32 +resumed 32 +polyethylene 36 +trustworthiness 32 +recording 36 +des 44 +pointing 34 +anchorman 32 +shallow 32 +wertheim 6 +proportionately 32 +toxicity 32 +mauro 4 +allergens 32 +particular 32 +community 38 +armenians 4 +chop 8 +girlfriend 32 +investments 44 +spouse 32 +ironic 32 +chimicles 8 +dogma 36 +branch 32 +curbed 4 +criticized 32 +presumed 32 +underwithheld 32 +surnames 32 +aro 4 +weekly 36 +frest 12 +carmelo 4 +nge 4 +relatives 32 +olympics 6 +vt. 4 +raft 32 +eventually 106 +mysterious 32 +killers 32 +potpourri 32 +these 46 +technicians 2 +capacity 108 +kanabayashi 4 +fresh 36 +marxists 4 +forty-eight 4 +resuming 36 +ripples 32 +quarry 32 +pollsters 32 +chesapeake 4 +instrument 32 +w.w. 4 +orbn 8 +interact 32 +wasting 32 +scr 4 +g.d. 10 +better-conceived 32 +loan-loss 32 +two-count 32 +amanda 4 +simplest 32 +thatcherite 4 +inadequacy 32 +petrodollars 32 +puerto 4 +demographic 2 +definitively 32 +policyholders 32 +saving 32 +defensive 32 +cruise-missile 32 +harvard 4 +vncp 8 +sliding 32 +gay 32 +aphrodisiac 32 +hl 12 +throughout 32 +flowers 32 +bonanza 4 +transferring 32 +exempt 36 +ingelheim 4 +bern 8 +undertaking 32 +violation 32 +saluted 32 +agins 4 +reasoning 32 +segmentation 32 +given 42 +barbie 4 +brraap 32 +closures 32 +highlight 32 +galley 4 +janesville 4 +explainable 32 +cypm 12 +alex 14 +travel 46 +cornell 4 +greenwich 4 +jpi 8 +v 4 +mildest 32 +hoskins 12 +weeks 32 +stumble 4 +love 36 +missiles 36 +accrued 32 +academics 32 +bureaucrat 4 +imposing 36 +five 102 +schoolchildren 32 +arab-israeli 4 +finder 32 +action 110 +curbing 32 +shunning 32 +krauss 4 +consolidate 32 +repetitive 32 +decliners 40 +hers 32 +football 36 +office 36 +surfaces 32 +midsummer 32 +multi-year 32 +ordered 32 +whips 32 +here 106 +medium 32 +persistent 32 +evanston 4 +wealthy 32 +batchelor 12 +hero 32 +developer 32 +banners 32 +strike 36 +txt 8 +txu 8 +relinquished 32 +stamford 12 +contacting 32 +declares 46 +simplistic 32 +drift 32 +down-home 32 +gannett 4 +stall 32 +undue 32 +hundred 32 +grumman 6 +icg 4 +callan 8 +encouraging 32 +ipo 4 +higher-quality 32 +txn 12 +creole 4 +pull 32 +paychecks 32 +cracks 36 +sizeable 32 +pza 4 +defenses 32 +loyalty 36 +blueprint 32 +bilandic 4 +single-a-minus/a-2 64 +maritime-union 2 +examine 32 +invisible 36 +gwf 8 +tattletale 4 +masses 32 +okada 12 +vehicles 36 +hunting 32 +subpeonas 32 +housing-industry 32 +caters 32 +stanleytown 8 +hooray 2 +unassailable 32 +registered 32 +capitalizing 32 +overwrought 32 +feverishly 32 +conspiracy 32 +pressed 34 +connecticut 4 +cholesterol 36 +nev. 4 +recognize 32 +shiny 32 +inconvenient 32 +adds 34 +interested 32 +fought 32 +anomaly 32 +penalize 32 +coldly 32 +supreme 46 +receipts 36 +elegance 36 +argued 34 +are 110 +reiterate 32 +released 32 +sensitivity 32 +prolonged 32 +now-canceled 32 +argues 32 +rough 32 +bloedel 4 +party-plan 32 +assemblies 32 +bloated 32 +insatiable 32 +debt-negotiating 32 +nonessential 32 +senators 34 +zanzotto 12 +anomalies 32 +francois 12 +concussed 32 +farm-credit 32 +cattivera 4 +schiff 4 +amateur 32 +atoms 32 +recalculation 32 +society 36 +basra 4 +three-division 32 +carter-wallace 2 +illiquidity 32 +dyess 4 +brunette 32 +meats 4 +hid 32 +multinationals 32 +shelved 32 +tally 32 +spur 32 +babyboomers 32 +anonymous 32 +neglect 32 +beaches 32 +disheartening 32 +follow-through 32 +gsu 8 +mellon 4 +localities 4 +distinguished 32 +higher-salaried 32 +refunding 32 +desire 32 +net 110 +duzan 8 +microcomputers 32 +distinguishes 32 +revelation 32 +a-from 64 +judicial 32 +pointed 32 +hdl 8 +deter 32 +nec 6 +parfet 8 +ending 36 +ned 6 +laboratory 32 +eastmet 12 +indianapolis 12 +fantasy 36 +ceuta 4 +ohio-based 4 +abortion 32 +sustainable 32 +brass 36 +officially 36 +piece 32 +carryover 32 +minnesota 14 +poorly 32 +modest 32 +bse 4 +mitchell 12 +evidence 34 +nodes 32 +strategies 36 +bust 32 +hawks 4 +taped 32 +acquisitions 38 +nursing 32 +denominations 32 +wab 8 +deflect 32 +shifts 32 +glowing 32 +way 38 +consisting 96 +chauffeur-driven 32 +sale-and-leaseback 32 +tapes 32 +peter 14 +inertial 32 +war 44 +appeasement 32 +then-usual 32 +magical 32 +missile-guidance 32 +initiative 36 +cheapest 32 +hezbollah 4 +rebuke 32 +apologies 32 +laws 100 +rban 4 +perpetually 32 +sachnoff 8 +fellow 34 +long-suffering 32 +noranda 4 +motivating 32 +harvestable 32 +knees 32 +kodo 2 +libraries 32 +experiment 32 +unsatisfactory 32 +lawn 32 +hoover 4 +irritate 32 +limelight 32 +garages 32 +ukman 4 +crews 36 +deed 32 +compound 32 +integrate 32 +deficits 32 +determinations 34 +high-gloss 32 +boustany 4 +bodan 4 +likened 32 +stories 32 +deep 32 +deepening 32 +peladeau 4 +extremely 32 +severence 32 +staying 32 +cuban 4 +noting 40 +reworking 32 +discipline 32 +velta 4 +possess 32 +cigarette-tax 32 +drunks 2 +iran-arms 4 +collider 4 +sable 4 +knappik 4 +physicist 32 +importers 10 +mer-national 6 +accredited 32 +gore 4 +reschedule 32 +tremendous 32 +mystique 32 +mas 8 +arvin 14 +shl 10 +westburne 14 +gutowski 4 +trends 36 +stretched 32 +she 46 +anyone 34 +homeless 32 +shy 32 +ongoing 32 +corp. 12 +towns 32 +mk 8 +rights 36 +philosophizes 32 +minneapolis 12 +plain 32 +cloaked 32 +sanction 32 +presidential 38 +varieties 32 +frame 4 +accessible 32 +recognized 32 +jewels 4 +wife 32 +sphere 32 +eaters 4 +flash 32 +enhancements 32 +courting 32 +balfour 4 +consulting 32 +prompted 32 +recognizes 32 +steamed 32 +du 46 +enclosed 32 +shock 32 +d.c.-based 4 +determined 32 +searing 32 +tumbles 4 +travel-rebates 32 +shenanigans 32 +tsuei 8 +lobby 32 +right-wing 32 +pan-hellenic 4 +specific 32 +tumbled 32 +appendix 32 +high-interest 32 +siegel 12 +fists 32 +cno 4 +calmat 6 +trimmer 32 +cnh 4 +delegates 36 +bargaining 32 +creative 36 +marketing 110 +averages 34 +gintel 12 +overnight 36 +characterization 32 +delegated 32 +arms 100 +scouting 32 +advantages 32 +army 36 +improper 36 +ruth 4 +fortunes 32 +farrakhan 4 +frills 32 +polygraph 32 +allied-signal 4 +predators 32 +signs 36 +maffei 4 +duke 4 +gyrations 32 +conceded 32 +assessed 32 +unanimous 32 +arw 8 +mares 32 +non-contract 32 +superficialities 32 +disturb 32 +longtime 32 +self-respecting 32 +whx 8 +hovered 32 +felt-tipped 32 +concedes 34 +glass 36 +lightning 32 +applauds 32 +maldutis 12 +boroughs 32 +shrank 32 +sponsored 32 +revising 4 +greeley 4 +gruesome 32 +kilroy 4 +cullen 4 +gould 4 +aug. 14 +allanna 4 +hall-walker 12 +wounds 32 +consistently 32 +ortega 4 +rightness 32 +dobbs-higginson 4 +fermilab 4 +familiar 32 +ae-1 4 +towards 32 +mirrors 36 +departures 32 +commitments 36 +blue-chip 32 +nabih 4 +operates 96 +dilorenzo 4 +horelick 12 +m-s-r 12 +netherlands 12 +lasting 32 +emigration 32 +company 110 +public-choice 32 +paternalistic 32 +car-rentals 32 +mikael 4 +operated 32 +kinnear 12 +crossing 32 +awesome 32 +relentless 32 +packed 32 +dissatisfaction 32 +one-on-one 32 +walcott 4 +jokes 32 +chronicler 32 +chronicles 32 +hands-off 32 +switching 32 +supplements 32 +marketers 32 +areas 36 +gypsy 32 +unfolded 32 +dignity 32 +l.f. 4 +indicating 32 +stricken 32 +exceptions 32 +convened 32 +becoming 32 +rallying 32 +hardly 36 +nice 36 +camcorder 32 +erased 4 +tuberculosis 32 +drafted 32 +intrinsically 32 +khalq 4 +cost-plus-fixed-fee 32 +akron 12 +omni 4 +trish 4 +undoing 32 +kelp 32 +well-schooled 32 +ssc 6 +mainly 32 +slow-moving 32 +everywhere 32 +address 32 +abducted 32 +come 36 +runup 32 +s-3a 4 +carthage 4 +integrated 32 +timely 32 +counted 32 +oil-industry 32 +integrity 32 +engineers 32 +counter 32 +officers 100 +lehman 14 +catches 34 +cheesecake 32 +prospects 36 +els 4 +sobbed 32 +exxon 2 +rental 32 +community-center 32 +wheezes 32 +retirees 32 +school 36 +ele 4 +astronomically 32 +elf 4 +eli 4 +foreign-exchange 40 +elm 4 +store-closing 32 +shrink 32 +fabrics 32 +destroy 32 +aboard 32 +mdr 4 +burroughs-wellcome 6 +deploy 32 +commercial-paper 32 +fits 32 +current-account 96 +airborne 36 +challenging 32 +mounts 32 +operate 32 +buddhism 4 +mdc 4 +insurgents 32 +solicitations 32 +entitled 32 +bloodcurdling 32 +higher-ups 32 +exchangeable 32 +demonstrates 32 +aryans 4 +fee 36 +fed 46 +embodied 32 +solutions 32 +poet 32 +third-generation 32 +semi-rut 32 +broderick 4 +houston-based 4 +platt 4 +peso 32 +financial-information 32 +franc-denominated 32 +piscataway 4 +livestock 2 +chorus 32 +struck 32 +drunk 32 +prosperity 32 +industrialists 96 +woods 44 +continent 32 +julie 4 +theories 38 +sounds 32 +dianna 4 +messy 32 +wis.-based 4 +woody 4 +date 40 +bulletin 4 +crowds 32 +horde 32 +erwin 2 +unemployed 32 +exacerbating 32 +yoder 4 +evolving 32 +timber 32 +once 46 +antilles 4 +beaten 32 +tied 36 +maine-based 4 +toilet 32 +plains 6 +already-scheduled 32 +phenomenally 32 +profit-making 32 +appliance 36 +ties 44 +tier 32 +ivory 36 +permitting 32 +quayle 4 +inductance 32 +solve 32 +developments 40 +blondes 32 +ore 32 +varig 4 +biased 32 +clash 32 +earn 32 +pepsi-cola 4 +fostering 4 +efficiently 32 +projectiles 32 +electronics 102 +ironically 10 +switzerland 14 +cbs/fox 14 +heartbeats 32 +eaves 12 +hookup 32 +ahc 4 +handling 36 +fumbling 32 +echoes 32 +cancels 8 +artwork 32 +underway 32 +courses 32 +push 36 +university 36 +jack-of-all-trades 32 +buckhorn 14 +uncontrollable 32 +appreciate 32 +l.a. 4 +counteract 32 +j.j. 6 +confessed 32 +two-by-four 32 +followers 32 +small-volume 32 +curtails 32 +athens-based 4 +g.k. 4 +metal-futures 32 +subjecting 32 +nearer 32 +analytical 4 +diameter 32 +bendix 6 +withhold 32 +focuses 32 +attributed 32 +harry 6 +doodles 4 +bottling 100 +environment 40 +association-college 4 +acute-care 32 +subscribers 32 +boesky-like 4 +buddha 4 +difference 32 +investor-protection 32 +town 36 +atlanta-based 4 +left 44 +german 14 +event 32 +emerged 32 +maritime 36 +treat 32 +decades 36 +incinerator 32 +withdraws 8 +murdered 32 +oscar-winning 4 +craven 4 +norse 4 +detroit-based 4 +reshufflings 32 +northbrook 12 +multiples 32 +whether 42 +mabey 12 +auction-rate 32 +betrayal 36 +cardiss 8 +exchange-market 32 +isle 4 +talky 32 +pollack 12 +knew 32 +zealand 4 +venter 4 +sperm 32 +second-largest 32 +dragged 32 +sells 44 +dis 8 +spontaneity 2 +restrictive 32 +paccar 6 +div 4 +kickback 32 +stage 32 +khj 4 +taxi 32 +coalition 32 +squeezing 32 +interpreted 32 +citicorp-issued 4 +dia 4 +dig 40 +die 32 +issue 36 +streamlining 32 +mouth 32 +curricula 32 +recovery 36 +consent 32 +escan 4 +gigs 32 +holed 64 +speculation 34 +stones 4 +successors 32 +disposable 32 +sweetening 32 +otters 36 +four-month-per-exam 32 +villa 4 +algerian 4 +haughey 12 +writer 32 +writes 32 +blount 12 +cadillac 8 +dotted 32 +listing 32 +y 4 +affirms 4 +dynamic-random-access 32 +lait 32 +four-month 32 +galinsky 4 +railroads 36 +ncr 4 +message 32 +sweetened 32 +mti 8 +boning 32 +unfreeze 32 +americus 14 +ravishing 32 +deadline 32 +indemnifying 32 +hartman 6 +maximum 32 +jewel-like 32 +benefited 32 +desperate 32 +researched 32 +breaks 32 +sudden 32 +lodged 32 +divestiture 32 +pop 32 +talks 44 +influencing 32 +reinterpreting 32 +fizzle 32 +able 32 +aviation 36 +seminars 32 +chevette 4 +junkyard 32 +herzog 4 +md 4 +liquidate 32 +transvaal 4 +broadside 32 +cattle 38 +approached 96 +transactions 32 +liquidated 32 +musical 44 +heavy-water 32 +agree 36 +eyerman 12 +hinge 32 +incorporate 32 +delicious 32 +approvals 32 +cost-control 32 +depend 32 +biochemist 32 +canyon 6 +pares 32 +quotable 4 +market-moving 32 +timid 32 +slaughter 32 +selecting 32 +generale 4 +uncovered 32 +premier 36 +chairwoman 32 +multimate 4 +lottery 36 +according 38 +per 32 +munitions 32 +demands 96 +chemotherapy 32 +mclellan 12 +home-state 32 +acoustic 4 +eligibility 32 +relaxing 32 +slack 32 +managerial 32 +disdained 32 +repackage 32 +wedgestone 10 +phrased 32 +pledges 32 +amadeus 4 +market-share 32 +worldly 32 +jtl 4 +concerted 32 +wrangler 4 +reluctance 32 +pet 36 +pledged 32 +period 36 +firm 44 +loss-sharing 32 +mcdougall 12 +inordinate 32 +compaq 14 +jacques 6 +scientist 32 +microphones 64 +feeding 32 +attractive 32 +sixth 38 +panic 12 +merhige 12 +majority 32 +encapsulating 32 +rankings 32 +rating 32 +spiritual 32 +policy-makers 32 +makeup 32 +rift 32 +shareowner 4 +transport 36 +babcock 4 +ailments 32 +supermarkets 4 +henderson 12 +spins 32 +savaiko 4 +unequal 32 +effectiveness 32 +barris 8 +succeeding 34 +resende 4 +admitting 32 +delivered 32 +succumbed 32 +outage 32 +sep. 2 +wiesbaden 8 +shipment 32 +work 38 +magnets 32 +grist 32 +worn 32 +worm 32 +negev 4 +flows 32 +memories 36 +lethal 32 +marijuana 32 +wore 32 +word 36 +perma 4 +relies 32 +paradise 4 +adjoin 32 +argyll 6 +red-blood-cell 32 +stamina-testing 32 +tabak 4 +toughest 32 +converse 4 +illuminating 4 +acquitted 32 +politically 32 +nbl 4 +hearts 32 +hart-dyke 4 +toaster 32 +diligent 32 +melloan 4 +dusty 32 +hearth 32 +mcdonough 4 +microcomputer 12 +dome 2 +swarms 32 +bureau 36 +approving 32 +moran 4 +moral 40 +silos 32 +statement 32 +interference 32 +glugs 32 +wyoming 4 +bundle 32 +peddling 32 +designated 32 +pursuing 36 +trusted 32 +slopes 32 +irwin 4 +executive 108 +janice 4 +reachable 32 +debtor 32 +damascus 4 +designates 32 +airlines 46 +comedian 38 +legitimately 32 +stormed 32 +proudly 32 +measure 36 +assassination 32 +fuller 14 +monopole-hunting 32 +vacationers 32 +eurosecurities 4 +rented 32 +nominated 32 +detergent 32 +pension-plan 32 +library 4 +young 46 +airliner 32 +danger 32 +stinko 32 +artifice 32 +confronted 32 +gelbard 8 +projections 32 +deals-curbing 32 +deterrence 32 +libyans 4 +oversupply 32 +sterling 36 +memorabilia 32 +nanometrics 10 +certificates 96 +power 46 +pleasure 32 +shkif 8 +mirroring 8 +ellis 4 +exploring 32 +rail 100 +angered 32 +moribund 32 +german-based 4 +tenth-largest 32 +asserts 32 +music 44 +self-destruct 32 +intermediaries 32 +contractors 32 +spirits 32 +create 32 +franchising 32 +younger 32 +ptrk 8 +percentages 32 +lotion 32 +zero 32 +outlays 40 +immunities 4 +mettam 8 +anymore 36 +nakagama 4 +pink 32 +durable 40 +city-based 4 +if 46 +unwilling 32 +id 4 +ground 32 +no-growth 32 +ii 4 +in 110 +parlayed 32 +gate 36 +is 110 +encountered 32 +fortune 36 +iv 4 +watchdog 36 +non-grocery 32 +subpoenaed 32 +deprived 32 +chatted 32 +warships 32 +yoko 2 +futile 32 +euromark 12 +welcomes 32 +onboard 32 +happens 32 +tensions 32 +batus 4 +lamented 32 +technology-based 32 +hodges 4 +fielding 32 +etzioni 4 +tricone 32 +welcomed 36 +inquiring 32 +steelworkers 36 +piety 8 +suh 32 +forecasters 32 +obstructing 32 +sum 40 +royalties 32 +llsi 4 +droves 32 +shut-off 32 +encompassing 32 +atlantis 14 +hewlett-packard 14 +devised 32 +encounters 36 +stanford 12 +mohammad 4 +collect 32 +tribe 32 +devises 32 +atlantic 14 +veterinary 4 +spurring 32 +fight 36 +recognition 32 +wood 36 +unwanted 32 +interestingly 2 +hotsy-totsy 32 +franchiser 32 +franchises 32 +loughman 4 +cypress 6 +barratt 12 +always 32 +frozen 32 +pickup 36 +gargles 32 +grille 32 +warden 32 +job-service 2 +luck 36 +common 110 +disbelief 32 +campsite 32 +luce 4 +touch 36 +employes 32 +brooklyn 4 +generally 36 +feline 32 +arisen 32 +confidentiality 32 +monessen 4 +fbt 4 +mailed 32 +direction 32 +defect 32 +appropriations 4 +autos 44 +extradited 32 +score 32 +reimposing 32 +offenses 32 +painewebber 6 +constructors 12 +awacs 4 +disrupt 32 +inaction 32 +invading 32 +spearheaded 32 +scorn 32 +puckett 8 +forthcoming 32 +fernando 4 +legislating 32 +confronting 32 +field 36 +mired 32 +resourcefulness 32 +manzi 8 +tullock 12 +endorsed 32 +off-peak 32 +gains 38 +decontamination 32 +tourists 32 +flow 36 +frothy 32 +heftier 32 +raymond 6 +picture 36 +weakest 32 +importing 32 +beings 32 +effectively 32 +listens 32 +burenga 8 +substantially 32 +anger 36 +small-scale 32 +misinterpretation 32 +guinness 14 +graduation 36 +cost-savings 32 +shrunken 32 +koss 4 +briefings 32 +fair-skinned 32 +mazankowski 4 +implicates 8 +audited 36 +hambros 2 +climate 32 +jordan 12 +reward 32 +musty 32 +pact 44 +purchased 32 +essence 32 +undeservedness 32 +childless 32 +malcolm 6 +mogul 32 +directs 32 +cftc 12 +petroleumish 32 +buccaneers 32 +purchaser 32 +synthesized 32 +speaking 32 +neidl 4 +clad 32 +cement 36 +portraits 32 +recovered 32 +any 46 +kfvpr 4 +catala-roca 4 +favored 36 +face 44 +tells 36 +product 32 +beyond 34 +ann 14 +ebbing 32 +cohorts 32 +reestablishing 32 +jennings 12 +polls 42 +functions 32 +ana 4 +old 108 +deduced 32 +dwarf 32 +urquhart 4 +assn 4 +recapitalized 32 +jews 4 +stick 32 +throwback 32 +walking 34 +armies 32 +flown 32 +writeoffs 32 +down 38 +trail 32 +stepchildren 32 +amdur 4 +gibbs 12 +alternative 32 +clan 36 +shouldn 96 +temperatures 32 +ducklings 32 +does 98 +credit 46 +parliament 36 +lederle 4 +handleman 10 +answer 36 +brother 32 +smashers 32 +honolulu 8 +bizet 4 +nine-year 32 +found 100 +racially 32 +breeding 32 +ensnare 32 +customers 110 +coliseum 32 +stern 12 +entails 32 +overproduced 32 +revolution 36 +sovereign 36 +distressed 32 +oyster 32 +fitzgerald 4 +trout 4 +minimizing 32 +trials 32 +appearance 32 +deadlock 32 +owning 32 +commander 32 +u.s.-assigned 4 +option 44 +televisions 32 +worksheet 32 +toward 36 +identity 32 +bouncers 34 +bradford 4 +filtration-systems 32 +describing 34 +jozef 4 +rejoined 32 +shamir 14 +amounting 32 +leak-rate 32 +boesky 12 +sword 32 +uncompromising 32 +tolls 4 +budget 110 +metal 36 +machinists 36 +campaign 38 +montana 4 +nucleoside 32 +ministers 32 +ensue 32 +auel 4 +horizons 36 +budged 32 +rejected 32 +stimulates 32 +suspicion 32 +patterned 32 +plunging 32 +midler 4 +anti-drug 32 +upper-income 32 +coatings 32 +paydown 32 +tartar 4 +re-election 32 +illnesses 32 +half 38 +resignations 32 +jack 14 +hapless 32 +hears 32 +morbid 32 +injunctions 32 +willis 4 +heart 36 +degree 32 +composer 32 +afoot 32 +farmer 36 +human 36 +atv 4 +salivating 32 +diversified 100 +campground 32 +wheat 34 +doubts 36 +jaruzelski 4 +prat 4 +extraordinary 32 +sylvester 4 +composed 32 +life-sized 32 +weapons 96 +globe-trot 32 +amerika 4 +register 36 +patently 32 +dc-9s 4 +olympic 4 +enjoy 32 +removed 32 +tribune 4 +archbishop 4 +gene-splicing 32 +panitz 12 +oakland-based 4 +headquarters 36 +owes 32 +emeritus 32 +andrew 6 +grappled 32 +goodrich 12 +corona 4 +engineering 100 +directorate 32 +installed 32 +spies 32 +exploitation 32 +massive 34 +kingdom 4 +mrs. 14 +constitute 32 +deploys 32 +cane-sugar 32 +morality 32 +bartlesville 8 +london-based 4 +bernard 6 +hometown 32 +equaling 32 +havre 4 +fat 32 +symptoms 32 +whiner 32 +alloys 32 +big-name 32 +fao 4 +steeley 12 +aristar 4 +blindfold 32 +vacancies 32 +seasonal 32 +faa 12 +quebec 14 +fab 4 +anne 4 +audit 32 +farmland 32 +floated 32 +liberalize 32 +subsequently 34 +ncaa 4 +del 14 +pritzker 12 +backstage 32 +merger 100 +jewishness 4 +harbor 36 +floats 32 +implicit 32 +viable 32 +aroused 32 +audio 32 +labor-relations 32 +vista 4 +weinberger 14 +tortured 32 +consistency 32 +massachusetts 4 +borrowers 32 +abusive 32 +revolutionaries 32 +book-to-bill 32 +saint 14 +crowned 32 +cincinnati 4 +stupidity 32 +legal 44 +permissive 32 +epileptics 32 +snared 32 +owed 32 +recruit 32 +post-teledyne 2 +racqueteers 8 +scullin 4 +defrauding 32 +prospekt 32 +choreographic 32 +fabrication 32 +jury 36 +unhappiness 32 +workout 32 +fame 32 +wryly 32 +vehemently 32 +considerations 32 +currently-available 32 +furnace 32 +jeremy 2 +gas-fired 32 +ald 4 +nauman 4 +one 46 +reorganization 40 +begun 38 +all 46 +tiring 32 +annoucements 32 +jumping 32 +gardner 4 +ono 4 +rdc 4 +alloy 32 +kallshian 4 +amstrad 14 +eagerness 32 +carbon 32 +eloquence 32 +piping 32 +july 6 +predicament 32 +cancellations 32 +budgeted 32 +fall 36 +persian 4 +deductible 32 +vino 32 +boycott 32 +achieve 32 +malmstrom 4 +passage 32 +enactment 32 +contentious 32 +cookies 32 +mall 32 +ahead 40 +hikes 32 +silva 12 +sikhism 4 +single-a 32 +early-loss 32 +viewership 2 +oversized 32 +theresienstadt 4 +so 106 +enzyme 32 +replicate 32 +coastal 4 +trost 4 +pac-man 4 +combines 36 +happen 32 +welch 8 +underwriter 32 +eight-tenths 32 +gap 36 +combined 34 +teen 32 +chu 8 +rep. 6 +conductor 32 +flawed 32 +midnight 32 +scalia 12 +witkowicz 4 +camera 32 +steps 36 +dies 32 +susquehanna 14 +diet 32 +instinct 32 +attended 32 +h. 6 +conviction 32 +tax-deferred 32 +rivalry 34 +offset 40 +delves 32 +seek 36 +died 38 +dismiss 32 +eprom 4 +burnham 4 +physical 32 +coincidentally 32 +flammable 32 +itt 6 +uno 4 +its 46 +ansberry 4 +investigated 36 +fgsv 4 +unplaced 32 +avenue 36 +private-sector 32 +und 32 +communities 36 +pleaded 96 +texas 14 +breach-of-contract 32 +itc 4 +sarney 12 +enriching 32 +flourishing 36 +rooms 32 +investigates 4 +he 46 +professions 32 +redistributing 32 +high-volume-dependent 32 +ha 8 +rile 32 +souring 32 +inititiated 32 +cocoa 38 +hi 4 +greatly 32 +scion 8 +ht 4 +maze 4 +dials 32 +lease 32 +spawned 32 +arlington 4 +mimic 32 +nightmare 36 +kika 8 +a&m 4 +affect 36 +kike 32 +johnnie 4 +profitable 34 +shrinks 32 +briefed 32 +unionized 32 +appointments 32 +decentralizing 32 +obscured 32 +midyear 32 +scratch 8 +genesee 4 +discrimination 32 +transformed 32 +der 36 +gsx 8 +alleges 44 +releases 32 +alternatives 32 +comrades 32 +mcgibbon 4 +brock 14 +radar-jamming 32 +baja 4 +numerical 32 +weathermen 32 +ignores 32 +unemployment-insurance 32 +epitaph 32 +technicare 4 +tales 36 +commissions 34 +cook-off 32 +petition 32 +adopt 32 +announcing 32 +guiding 32 +opportunity 32 +complacency 32 +bypwi 4 +brewer 32 +epiphanies 32 +new-product 32 +propulsion 32 +tongue-twisting 32 +helm 32 +testimony 38 +smugly 32 +academe 32 +quash 32 +working-class 32 +academy 4 +modernization 32 +donate 32 +maher 4 +wesson 4 +fear 32 +illicit 32 +totaling 40 +land 36 +lane 36 +framed 32 +nsc 12 +original 32 +drafts 32 +government-related 32 +nitze 12 +shannon 4 +slump 36 +lengthy 32 +armour 4 +one-half 32 +brocade 32 +hoops 32 +pieces 32 +nat 4 +increments 32 +selection 32 +arrest 32 +rethinking 32 +lyon 12 +emerges 36 +quick 46 +fleet-replenishment 32 +creations 4 +nad 4 +nag 32 +eagerly 32 +respectable 32 +pieced 32 +threat 32 +tax-related 32 +naj 4 +robusta 4 +quota 32 +defeat 32 +shultz 14 +insystec 4 +ask 34 +smoothly 32 +criticisms 32 +coercive 32 +complicated 32 +hookups 32 +airspace 32 +hopes 36 +bloodletting 32 +stamped 32 +state-of-the-art 32 +patrol 36 +ast 4 +ill-timed 32 +joined 32 +limitation 32 +dealer-manager 32 +expressions 32 +afterwards 32 +chronar 8 +softened 32 +harmony 36 +morocco 4 +finanza 4 +punitive-damage 32 +cheap 36 +roscoe 4 +sensation 32 +scope 32 +cheat 32 +burrowing 32 +mid-afternoon 32 +unwritten 32 +faster-than-expected 32 +russians 4 +exclusively 32 +readiness 32 +twins 32 +bagged 32 +sadness 32 +airplanes 36 +asian 4 +body 32 +interco 4 +decor 32 +whitman 12 +underpayment 32 +bemoaned 32 +worcester 4 +becker 4 +production 38 +titan 4 +pilkington 4 +sweat 32 +hanover 4 +hard-line 32 +tackles 32 +quasar 4 +collaborate 32 +decof 4 +celebrations 4 +expenditure 32 +lieberman 8 +cont 8 +stewart 12 +child-care 40 +marxist 4 +wholly 32 +establishing 36 +suitcases 32 +replicated 32 +j.r. 2 +comprise 32 +cone 4 +depressed 32 +steward 32 +reprint 32 +revive 36 +wellcome 14 +m&m/mars 4 +hiring 40 +fallen 32 +brazenly 32 +absb 4 +forceful 32 +unilateral 32 +retrospective 4 +espn 6 +mini-recession 32 +jurisdiction 32 +broke 32 +worth 36 +worthwhile 32 +ladenburg 4 +flirts 4 +govil 4 +well 38 +kay 4 +influx 32 +goading 32 +n.y.-based 4 +wci 8 +dec. 14 +hobbled 32 +successfully 32 +uc-santa 2 +c.i.t. 4 +cough 32 +perceived 32 +lies 32 +bqr 8 +improperly 36 +landscape 36 +smuggle 32 +unpublished 32 +grudgingly 32 +detrimental 32 +atswi 4 +skinny 32 +aimed 32 +narrowed 36 +dominates 32 +melodrama 32 +teaching 32 +borden 14 +dwindling 32 +eagan 4 +nordic 4 +placing 32 +claimed 32 +romilly 2 +border 36 +information-services 32 +h.f. 4 +wade 36 +dominated 44 +speculated 32 +jourlet 4 +squash 34 +unpaid 32 +witter 4 +bends 32 +share 36 +chief 46 +flow-of-funds 32 +securities 110 +computer-guided 2 +surpass 8 +bounties 32 +johannesburg 4 +one-megabit 32 +copenhagen 8 +smiles 32 +anmc 6 +laroche 8 +sports 36 +transcribed 32 +burton 4 +proud 40 +computerized 32 +valve-stem 32 +faulty 32 +aide 36 +cbs 14 +minuscule 32 +mixes 32 +spectrum 32 +gruneich 4 +clifford 4 +curve 4 +eyebrows 32 +concealed 32 +woes 36 +courtesy 32 +sizable 32 +choice 32 +feisty 32 +coordinating 36 +delighted 32 +lecturer 32 +bullet 4 +telegraph 36 +late-afternoon 32 +sharper 32 +denes 4 +stockholders 32 +wyss 8 +winkler 4 +workstation 32 +marie 4 +austere 32 +combine 32 +resilience 32 +helium 32 +maria 4 +last 110 +preeminence 32 +stepped 32 +pro 32 +unsecured 34 +photographers 32 +wild 44 +minority-owned 32 +blood-analysis 32 +specializes 32 +variations 36 +cease 32 +cost-effectiveness 32 +abitibi-price 6 +phyllis 8 +overhaul 36 +prod 32 +studying 32 +mass 36 +amount 32 +maynard 4 +laurdan 4 +garden-variety 32 +turboprop 32 +fives 32 +specialized 34 +another 110 +bermon 12 +surrogate 32 +tax-withholding 32 +restrain 32 +kyotaru 12 +drug-company 32 +growth 38 +insisting 32 +z-holiday 16 +concise 32 +kin-deep 32 +elaborate 32 +obsessed 32 +invulnerable 32 +circumventing 32 +noted 32 +shriners 4 +walked 32 +above-market 32 +u.s.-made 4 +exporting 36 +suddenness 32 +noticed 32 +start-up 32 +gade 4 +gadd 12 +lyrics 32 +magazine 44 +dread 32 +simulated 32 +impropriety 32 +journals 36 +prop 32 +surface-to-surface 32 +dream 36 +week-r 4 +double-edged 32 +notices 32 +ordnance 32 +mondschein 12 +wish 32 +cassette 32 +psychotic 32 +n.v. 14 +compounds 32 +truffle 32 +swx 8 +kept 32 +inventories 34 +financial-service 32 +scribbled 32 +palmetto 4 +activists 32 +interchangeable 32 +afternoon 32 +streptokinase 32 +overcharging 32 +prizes 4 +ready 36 +mesh 32 +overpaying 32 +houston 12 +productions 36 +abrogated 32 +boulder 4 +accepted 42 +heels 36 +respectability 32 +shored 32 +stock-manipulation 32 +whitehead 12 +talbots 4 +scarce 32 +tananbaum 12 +nonrecurring 32 +widens 32 +versatility 32 +programmers 32 +stoddard 14 +burk 4 +sensitive 32 +inter-city 4 +clean-coal 32 +deadly 32 +importance 32 +sporting 32 +wis. 4 +rave 32 +mask 32 +extras 4 +farm-workers 32 +energetic 32 +undervaluation 32 +t-1000s 4 +edward 14 +nature 32 +boumedienne 4 +sw. 4 +prohibit 32 +weepy 32 +tentative 40 +awarding 32 +leeds 4 +assuaging 32 +roman 4 +cecola 8 +separating 32 +postal 32 +wetherby 4 +liability 32 +colorful 32 +reoccur 32 +masco 14 +dozen 32 +dismal 32 +raving 32 +turbo-fan 32 +lungs 32 +inflows 32 +mueller 4 +renee 4 +three-month 32 +living 32 +built 96 +photo-identification 32 +iii 4 +dense-pac 14 +divorced 32 +vote 36 +renew 32 +social 38 +corroborating 32 +envelope 32 +surgery 32 +deplorable 32 +bradstock 4 +department-store 32 +heartbeat 32 +department 44 +incestuous 32 +debate 32 +praises 32 +breakup 36 +illusory 32 +vivid 32 +praised 32 +steven 6 +farmworker 4 +marks 44 +nelson 12 +wilson 14 +appeals-court 32 +steve 4 +eight-year 32 +mannequins 32 +sallie 4 +british 14 +apia 8 +issue-oriented 32 +schoonover 4 +systemwide 32 +sponsorship 34 +floating-rate 32 +distressingly 32 +linger 32 +coalesced 32 +capital-rich 32 +hysteria 32 +colored 32 +teck 4 +year-long 32 +tech 36 +history 36 +cutoff 32 +structurally 32 +geranium 32 +kookaburra 6 +consequently 2 +played 32 +robn 8 +government 110 +justice 46 +cds 4 +monrovia 4 +tarkanian 6 +cdn 8 +sthf 8 +ambulance-chasing 32 +circuit 40 +fortunate 32 +truitt 4 +environmental 46 +acquisition 44 +player 32 +wtbs 6 +excellent 32 +sovereignty 32 +afric 12 +tortuous 32 +baalbek 4 +heavy 96 +receiving 32 +duet 32 +assessor 4 +looking 34 +smiling 32 +lilac 4 +authored 32 +intensifies 4 +associating 32 +joel 6 +mandatory 32 +a.h. 14 +lopping 32 +n.c.-based 4 +basie 4 +cope 32 +basic 32 +featuring 32 +freeing 32 +surging 32 +backbone 32 +stake 36 +talmud 4 +popcorn 32 +recounts 32 +insiders 32 +resells 32 +restaurants 32 +comair 4 +cogeneration 32 +basis 32 +bureaucrats 32 +bensalem 4 +redesigned 32 +travers 8 +assad 4 +revue 4 +document 32 +wheel 36 +negotiating 42 +tolerate 36 +overallotments 32 +share-buying 32 +oscar 4 +slickers 4 +pereslavl-zalessky 4 +possessions 32 +redeemed 32 +anc 4 +four-share 32 +pinkish 32 +messrs. 6 +curacao 4 +cooperating 32 +summary 36 +gardena 4 +sheet 36 +dinar 32 +expands 32 +erupted 32 +rand 4 +totally 32 +hbo 6 +attracted 32 +founded 34 +affiliated 32 +short-lived 4 +purity 32 +incidence 32 +ranzino 4 +betrayed 32 +dad 38 +nation 36 +founder 40 +galbraith 12 +olson 12 +home-buying 32 +orange 14 +allocation 2 +four-nation 32 +bourbon-pecan 32 +remarked 32 +enron 4 +inflammations 32 +panhandle 2 +catastrophic-illness 32 +fiddler 32 +harass 32 +copy 32 +stymied 32 +distinct 32 +draped 2 +dancer 32 +dances 32 +week-e 8 +grenade 32 +minimize 32 +hormone 32 +fairy-tale 32 +likelihood 32 +squares 32 +grows 36 +track 44 +einstein 12 +reconcile 32 +futures 46 +danced 32 +misdiagnosis 32 +hammond 8 +ual-hertz-hilton 4 +judgments 32 +discredited 32 +workstations 40 +gibraltar 4 +expandability 32 +rife 32 +plays 32 +whole 32 +densely 32 +facilitated 32 +desirable 32 +hibernation 32 +mrn 4 +regencys 4 +israel 14 +alcohol 36 +rolf 4 +broker-loan 32 +ghana 4 +tired 32 +marrow 32 +bricker 8 +shun 32 +mackinsey 4 +plentiful 32 +carlow 4 +burgeoning 32 +tires 32 +civilization 36 +foreign-controlled 32 +edmar 4 +bottom-line 32 +polled 32 +desirability 32 +sentimentally 32 +shut 32 +mass-manufacture 32 +for 110 +fine-tuning 32 +mnd 4 +radicals 32 +mnh 8 +polemics 32 +erstwhile 32 +herpes 32 +squished 32 +packages 32 +representing 32 +indian 4 +warning 32 +foe 32 +patronized 32 +crewmen 32 +birinyi 12 +gowan 8 +reflex 32 +direct-mail 32 +colonize 32 +offhand 32 +proclaimed 32 +chl 4 +applies 32 +gtech 10 +p.m. 32 +union-backed 32 +fixed-interest 32 +textiles 40 +watered 32 +diverse 34 +sanitation 32 +ruin 32 +correlation 32 +ralph 6 +applied 40 +secretary 46 +epidemiologist 32 +lilly 4 +complains 32 +learned 32 +counterproductive 32 +claimants 32 +anthophyllite 32 +savings 36 +repeats 32 +crary 12 +imperishable 32 +anti-discrimination 32 +transcription 32 +disclosed 36 +rothschild 8 +sometimes 34 +assuming 32 +kickbacks 32 +universal 38 +reptile 32 +depreciated 32 +chb 8 +newer 32 +dibacco 8 +gra 4 +capsules 32 +interventions 32 +prayer 32 +bedeviled 32 +pity 32 +emphatically 32 +abductors 32 +powell 4 +innocently 32 +depreciates 32 +trendless 36 +bail 32 +blow-by-blow 32 +meier 4 +like 102 +donohue 14 +skills 32 +panamanian 4 +carol 4 +request 36 +principled 32 +bwv 4 +jazz 46 +mesa 14 +begged 32 +indicated 96 +librarian 32 +products 100 +boyer 4 +delicate 36 +sreg 8 +honing 32 +waft 32 +boost 36 +greenslet 12 +long-range 32 +angeles 4 +mid-1980 32 +indicates 32 +convertible 36 +resistance 36 +muranyi 4 +big-selling 32 +reacted 32 +commissioners 32 +dealt 36 +skeleton 4 +exercises 32 +clinical 46 +dead 36 +deaf 32 +respite 32 +paso 4 +denver 12 +clearer 32 +dean 46 +scrutinized 32 +holding 108 +dedham 4 +exercised 32 +system 46 +ndx 4 +campaigned 32 +portuguese 4 +services 44 +tijuana 4 +prepare 32 +underlines 32 +complexity 32 +levine 12 +kotzan 4 +locals 36 +strategic 36 +participate 32 +crane 12 +north-central 4 +dissipating 32 +millers 4 +dixie-narco 4 +drops 4 +marketed 32 +vaulted 32 +lucas 4 +efficiencies 32 +prentice-hall 4 +major-illness 4 +unrelated 32 +creeping 32 +christopher 4 +despair 32 +budgeteers 32 +sle 8 +violators 32 +farmers 96 +slb 8 +ankara 6 +fronts 32 +asbestos 38 +stymie 32 +logos 32 +increase 44 +orgolini 4 +rational 32 +sls 8 +principles 36 +humor 32 +sale-leaseback 32 +promptly 32 +sly 12 +disappointing 34 +formed 32 +yardeni 12 +flaws 32 +undertake 32 +conspired 32 +allocations 32 +m 4 +annualized 34 +wide-ranging 32 +wendy 14 +issued 96 +mortgage-related 32 +chapel 12 +joaquin 4 +country 102 +normally 32 +alfa-laval 6 +power-circuit 4 +longest 32 +senses 32 +family 38 +awful 32 +boss 44 +underscore 32 +reluctantly 32 +organization 36 +wise 32 +northeastern 6 +territories 32 +tail 4 +novelist 32 +italy 4 +ingredient 32 +denmark 6 +rehearsing 32 +hirsch 4 +tightness 32 +eventual 32 +proposition 32 +one-day 36 +recycled 32 +nasturtium 32 +expenses 32 +deterred 32 +renouncing 32 +disadvantages 32 +predictions 32 +rattle 32 +speeds 32 +punishment 32 +unpersuasive 32 +seagate 4 +best 36 +politicians 34 +me-too 32 +speedy 32 +demographics 32 +tenants 32 +thick-steel-plate 32 +saxophonist 32 +doling 32 +chesebrough 2 +gardening 32 +overlooked 32 +avoiding 32 +kerr 8 +sampling 36 +burn 32 +yoon 4 +pleading 32 +supermarket 36 +communism 32 +screaming 32 +igam 4 +beer-industry 32 +dazzling 32 +arrests 44 +clippings 32 +ministerial 32 +mezzo 2 +member 32 +solar 32 +widely 34 +fortunately 2 +decreed 32 +previously 34 +reunification 32 +foreman 8 +diminished 96 +chickasha 4 +tax-free 32 +converts 36 +justify 32 +oxygen 32 +askren 8 +additions 32 +amnesty 2 +proceeded 32 +pastry 32 +compromises 32 +crackdown 32 +defects 32 +uncle 36 +castle 36 +leading 42 +skagit/hanford 4 +extract 32 +wurtsmith 4 +entrusting 32 +vain 32 +coached 32 +conclude 32 +third 38 +returned 32 +diagnoses 32 +sunstyle 4 +proprietary 32 +stalking 32 +regimen 32 +four-day 32 +retorts 32 +cold 32 +pronounce 32 +near-quadrupling 32 +disinflation 32 +petzinger 4 +timetable 32 +mostly 38 +spears 12 +buttressed 32 +diagnosed 32 +n. 4 +regimes 32 +colt 6 +ship-to-stock 32 +shocked 32 +gruenberg 4 +frenzy 32 +met-coil 2 +courthouse 32 +twilight 32 +tishman 4 +salisbury 4 +annuity 36 +composing 32 +usx 12 +guenther 4 +rock 38 +occasions 32 +challengers 34 +usa 12 +r.a. 2 +envoy 32 +pre-school 32 +speculator 32 +kip 4 +earners 32 +harnessing 32 +col. 14 +remained 32 +frivolous 32 +cares 36 +provision 32 +decay 32 +homely 2 +impressed 32 +five-member 32 +un-american 4 +antwerp 4 +discovered 32 +massacre 36 +greek-turkish 4 +prepares 32 +demand 102 +bicycle 32 +nws 4 +injury 32 +deregulated 32 +measles 32 +deposit-taking 32 +conditions 32 +hansen 12 +subpoenas 32 +mid-1950s 32 +deferred-compensation 32 +quickly 36 +kan. 4 +thermal 32 +prescription 32 +avant-garde 32 +bmy 4 +tax-driven 32 +assent 32 +none 36 +prediction 32 +development-park 32 +regime 32 +wait 32 +sitting 34 +wouldn 38 +resents 32 +cfp 4 +consented 32 +wrestlers 32 +bonner 4 +signficant 32 +glitches 32 +double 32 +cries 32 +vonder 8 +originality 32 +amps 4 +separately 42 +mechanical 32 +names 44 +martine 4 +shipping 34 +ports 32 +diversions 4 +one-hour 32 +lebanese 6 +councils 32 +expropriation 32 +showing 32 +educating 32 +flourishes 32 +recital 32 +fuehrer 4 +omitted 100 +crushed 32 +tito 4 +jung/brannen 4 +unfolds 32 +stated 32 +stearns 12 +flexibility 32 +rule 36 +denounce 32 +hoffmann-la 4 +carrots 32 +heartland 36 +conjuring 32 +sankey 8 +volatility 32 +twice 36 +niskanen 4 +columbia 4 +stringent 32 +boulevard 6 +reinventing 32 +treasured 32 +violent 32 +ranking 32 +pretax 32 +failing 32 +coaching 32 +herman 4 +named 102 +detainee 32 +two-way 36 +fundamentalists 32 +urgent-care 32 +naysayers 32 +covertly 32 +desert 36 +guesses 32 +spectacle 40 +disembowel 32 +boardwalk 32 +syndicated 32 +unsealed 32 +rubicam 4 +sucked 32 +consolidating 32 +pulling 32 +robert 14 +compression 32 +resolving 32 +totaled 40 +miniscribe 6 +electrons 32 +syndicates 32 +addition 32 +regulating 32 +fowler 12 +center 36 +remarks 32 +worthless 32 +autumn 32 +nu 8 +payments 36 +s&p 14 +rally 36 +prevails 4 +gastropod 32 +sacrificed 32 +kb 4 +lehigh 6 +dorin 4 +lumbermen 36 +viacom 14 +dunce 32 +friends 38 +marietta 4 +breeders 32 +govett 4 +furnishing 32 +doomed 32 +heng 8 +crystal 32 +industrywide 32 +parcels 32 +luxembourg 4 +doilies 32 +austerity 32 +retention 32 +conglomerates 32 +touchstones 32 +fringes 32 +harassment 32 +sprint 4 +stemming 32 +pistol 32 +crates 32 +appalling 32 +teamed 32 +detention 32 +insulation 32 +chipmakers 36 +legions 32 +gridlock 32 +spring 36 +laughlin 4 +pzl 4 +disappointed 32 +strength 32 +autonomously 32 +vaux 4 +winchester 4 +abrahamson 12 +francesc 4 +purveyors 32 +tel 4 +lamboley 4 +special-interest 32 +burlington 4 +ill-considered 32 +sergeant 32 +device 36 +a-6e 4 +copper 36 +litigated 32 +omcm 4 +cuisine 32 +languages 32 +selections 4 +target 44 +calls 100 +prevailing 32 +kagan 4 +dealings 32 +composite 36 +epilepsy 36 +assitance 32 +cd-v. 32 +tick 32 +underfinanced 32 +introduces 32 +grasping 32 +communications 46 +hub 36 +experiences 32 +fruit 36 +divided 32 +east-west 36 +suitable 32 +abdication 32 +indict 32 +fascinating 32 +designed 32 +caesarean 4 +strong 46 +ingested 32 +inched 32 +districts 32 +demonstrations 32 +asian-americans 4 +supervised 32 +designer 32 +components 32 +mansfield 4 +mll 8 +supervises 32 +business 110 +e-flats 4 +inches 32 +mater 36 +transportation 46 +billion-plus 32 +altogether 40 +tcr 8 +glasses 32 +injustices 32 +fascinated 32 +disagree 32 +gtch 8 +calculate 32 +doll 4 +entertainers 32 +valuing 32 +avionics 32 +mnco 12 +scarcity 4 +boosted 96 +profit-margin 32 +contadora 4 +omega 4 +evoking 32 +harassed 32 +missile-defense 32 +scholarly 32 +gallon 32 +yield-driven 32 +sisb 4 +horses 36 +surrender 32 +reunify 32 +displeasure 32 +wgn 4 +slowdown 32 +emphasizing 32 +observing 32 +lend 32 +aided 36 +fling 32 +fair 36 +chambers 32 +monroe 4 +joseph 14 +aiden 2 +sharon 14 +celebrities 32 +b 44 +stability 32 +aides 38 +expressing 32 +brunei 14 +flint 36 +cathleen 2 +occurrence 32 +explanations 32 +citicorp 6 +suppose 32 +ecuador 4 +montgomery 12 +publications 36 +cpas 4 +seller 32 +microbes 32 +power-train 32 +computers 108 +lasser 12 +bollenbacher 4 +divers 32 +marine 38 +falsgraf 4 +airmach 4 +rockwell 14 +leinberger 12 +technical 36 +a.s. 4 +boon 32 +emery 4 +lower 46 +legislative 32 +stiffer 32 +eurodollars 8 +momentum 32 +newman 4 +incentives 32 +r. 14 +nazionale 4 +hotels 36 +wurtman 12 +tax-act 32 +toyed 32 +privately 32 +macy 12 +exhausted 32 +m.d.c. 4 +reveres 32 +noses 32 +cherokee 4 +billiard 32 +remedy 32 +one-way 32 +tear 32 +jerrold 4 +kitchen 32 +norrett 4 +hassenfeld 8 +chairmen 32 +fiercely 32 +devaluing 32 +crnr 4 +ridge 4 +prudential-bache 4 +springs 36 +recycle 32 +team 32 +buddy 32 +took 96 +howorth 12 +sinking-fund 32 +sins 32 +and/or 32 +dreary 32 +camper 32 +robotics 36 +populated 32 +semiannual 32 +middle-income 32 +mosquito 4 +winnings 38 +toyco 4 +contest 32 +wed. 10 +widespread 32 +capabilities 32 +large-scale 32 +barricaded 32 +family-planning 32 +respects 32 +ginnie 14 +receding 32 +unrated 32 +telq 8 +succeeds 96 +contributors 34 +feiner 8 +non-german 32 +isotope 32 +checkup 32 +subtracts 32 +seizures 36 +sne 8 +screams 32 +venezuela 4 +controls 100 +public-relations 32 +thinks 32 +w.r. 2 +part 46 +oversubscription 32 +scenarios 32 +outcome 32 +attorney 108 +rare 36 +fled 32 +jailed 32 +self-interest 32 +brakeman 32 +catered 32 +comprises 96 +amity 4 +wove 32 +t.pwa 8 +singer 38 +batschari 12 +modernizing 32 +conflict 32 +mailroom 32 +dole 12 +oecd 12 +reaping 32 +memorial 36 +auto-focus 40 +cassandras 4 +cray 4 +justifies 32 +flee 32 +subjourneymen 32 +spark 32 +overweight 32 +perpetuating 32 +hamel 4 +justified 32 +entices 32 +advance 36 +kingpin 32 +spare 32 +bluth 4 +theodore 6 +inestimable 32 +f. 4 +cliff 4 +junior 34 +distributors 36 +comedies 32 +understandings 32 +concede 32 +overwhelmingly 32 +tirelessly 32 +jointly 36 +efficient 32 +secret-payments 32 +tell 36 +rodgers 8 +wy 8 +kaul 4 +exists 32 +repairs 32 +battled 32 +personality 32 +liquidity 32 +seizure-prone 32 +refund 36 +pressured 32 +gears 32 +tianjin 4 +remanded 32 +readonly 32 +full-service 32 +disturbed 32 +receivables 32 +compete 32 +truce 32 +audio/video 12 +truck 36 +rudolfo 4 +pressures 40 +out 38 +kiev 4 +sa-7 4 +referee 32 +inherit 32 +rgc 8 +theater 36 +purchases 40 +greyerz 4 +compromise 32 +doubling 32 +ellen 6 +withstood 32 +kiel 4 +maclean 4 +premise 32 +traffic 36 +ring 44 +affidavits 32 +hours 32 +soybeans 36 +lowest-cost 32 +manifesto 32 +arrearages 32 +pioneering 32 +authoritatively 32 +quaintly 32 +unthinkable 32 +convertible-debt 32 +nose 32 +kendrick 4 +balk 32 +ball 44 +balm 32 +emerging 32 +kramer 14 +gmfanuc 10 +brewing 36 +questioned 32 +sneer 32 +targeting 32 +wider 36 +optimists 32 +shearson 14 +dedicated 32 +most-active 32 +boosting 32 +meeting-date 32 +removal 32 +proponent 32 +smaller 42 +opera 36 +temporarily 32 +portrayal 32 +down-and-out 32 +shrinking 32 +ruinous 32 +gilliam 4 +resubmit 32 +awe 32 +generosity 32 +fats 2 +blow 36 +guarini 8 +sonic 4 +censures 4 +recruiting 32 +road 36 +forbid 32 +syrian-backed 4 +souls 32 +headway 36 +dallas-based 4 +biologists 32 +publicist 32 +censured 32 +reprieve 32 +kahn 14 +described 32 +bed 32 +plutonium-producing 32 +baxter 14 +expansion-minded 32 +hewn 32 +aerobics 2 +facilitate 32 +replies 32 +recover 32 +tale 32 +revived 32 +raging 32 +hangars 40 +vault 32 +theatrical 32 +morrison 4 +rankles 32 +breathlessly 32 +armand 2 +image 32 +auditor 40 +trivial 32 +thermos 32 +udayan 4 +obscenity 32 +privee 36 +personal-recognizance 32 +redskin 4 +county 38 +trillion 32 +henkel 12 +wearing 32 +nightclub 32 +clinic 36 +freighter 32 +mordechai 4 +pulpit 32 +finally 34 +programmable 32 +business-type 32 +criticize 32 +bonuses 32 +cyl 8 +stud 36 +often-violent 32 +essay 32 +reuters 14 +renominated 32 +independently 32 +pocahontas 4 +leadership 32 +murphy 12 +advice 32 +comeback 36 +discriminate 32 +fourth-biggest 32 +relentlessly 32 +cm&m 4 +health-care 32 +subcommittee 36 +irancontra 4 +fractured 32 +bud 32 +brook 4 +victoria 4 +display 32 +foods 36 +alike 32 +wooded 32 +disbursed 32 +commrcl 8 +won 108 +woo 32 +properties 36 +sympathetic 32 +metallurgical 32 +although 46 +essential 32 +wooden 32 +buy 36 +govmt 12 +chicago 14 +schoolyard 32 +united 46 +higginbotham 4 +choose 32 +drifted 32 +light 36 +quick-delivery 8 +intermediate 36 +spotting 32 +concretely 32 +closing 32 +endearing 32 +whitney 4 +wachtell 4 +and 126 +resort 32 +spoofs 32 +stripping 32 +coalitions 32 +chair 32 +boosters 32 +bookseller 32 +intensified 32 +foundation 38 +marriage 32 +sakharov 4 +mujahedeen 4 +bank-holding 32 +yielded 32 +premiums 32 +escape 32 +weizhou 4 +lufthansa 6 +whose 36 +kalmus 12 +siege 32 +bank-affiliated 32 +merits 32 +parade 32 +merrill 14 +unify 36 +anglia 8 +loeb 4 +strawberry 32 +mind-set 32 +rotating 32 +raids 36 +lauderdale 12 +vending 32 +ex-military 32 +dune 32 +clothes 32 +bowman 32 +ousting 32 +allegedly 32 +medically 36 +receives 44 +neighbors 32 +moratorium 32 +bmws 4 +floppy 32 +retrovir 4 +halter 8 +continents 32 +allocating 32 +arraignment 32 +club 36 +govern 32 +japanese 14 +lytton 4 +unchanged 40 +uacia 8 +appears 36 +disgorge 32 +meetings 32 +ojay 8 +stipulation 32 +nrc 12 +however 46 +similar 32 +accumulating 32 +alphabet 32 +discount 44 +ruins 32 +ojai 4 +shape 32 +proclaim 32 +foremen 32 +linden 4 +court-sanctioned 32 +wrongful 32 +irresistible 32 +circulation 32 +ax 32 +stopped 32 +stricharchuk 4 +require 32 +ar 4 +as 110 +ap 4 +skirt 32 +fumes 32 +at 110 +au 34 +inclination 32 +gabriel 4 +procedures 32 +an 46 +tamper 32 +al 6 +outer 32 +ab 4 +ac 4 +one-third 32 +ag 12 +ad 34 +hybrid 32 +pl 4 +hypocrisy 32 +foote 4 +amateurs 32 +unspeakable 32 +unrest 32 +since 110 +harvests 32 +aut 4 +spurted 32 +diagnosis 32 +kudos 32 +sex 32 +order-inflow 32 +beautifully 32 +workforce 32 +privilege 32 +remarkable 32 +meatpacking 32 +outboard 42 +piercing 32 +laurels 32 +self-regulatory 32 +yitzhak 4 +slides 32 +multiple-unit 32 +negatively 32 +derive 32 +veered 32 +requested 32 +a-340 4 +uniform 32 +bargain 36 +arched 32 +father 36 +interior 34 +rein 32 +overdose 32 +confiscatory 32 +chooses 32 +plummeted 32 +bernhard 4 +ex-spouse 4 +khoo-controlled 4 +hectic 32 +lawn-care 32 +basil 32 +demanding 32 +pirrie 8 +offender 32 +right 34 +obviously 36 +obscenely 32 +collins 4 +philip 14 +lesuer 8 +knowledge 40 +businesses-newspaper 32 +onus 32 +crusade 32 +marcom 12 +bltb 8 +colline 4 +saig 8 +dispatched 32 +offended 32 +inns 4 +consisted 32 +treasury 46 +chevrolet 12 +oppose 32 +organized 32 +rifles 32 +follow-up 32 +proposes 44 +first-generation 32 +decrease 32 +million 100 +counterpart 96 +expectation 32 +l 4 +antony 4 +margins 36 +proposed 104 +disclosure 38 +obscure 32 +dirt 32 +calumny 32 +gerald 6 +montfrooy 4 +scheme 36 +businessses 32 +sec 14 +parker 4 +ascent 32 +detect 36 +dire 32 +regulatory 36 +fake 32 +atomic 36 +emulate 32 +regulators 38 +bitterness 32 +ignore 34 +combining 32 +parked 32 +floundered 32 +induce 32 +chains 36 +gen. 14 +steadfast 32 +odd 32 +flamingos 32 +resign 36 +atcor 12 +gates 46 +gunmen 32 +rochester 4 +redirecting 32 +refiners 64 +politburo 32 +mohawk 4 +imf 4 +particles 32 +fromer 8 +maxsaver-type 4 +smoking 32 +silly 2 +peaceful 32 +lugano 4 +joao 4 +joan 6 +dickerson 8 +sills 4 +assessment 36 +studio 34 +opposed 36 +reincorporate 32 +iron 36 +puget 12 +hard-to-please 32 +trampled 32 +opposes 32 +underwent 32 +washed 32 +goebbels 4 +sisters 4 +base 36 +doyle 12 +outperform 32 +chocolate-truffle 32 +gene 12 +guatemala 4 +immuno-modulator 32 +tunes 32 +gena 4 +comes 36 +pronouncements 32 +plausible 32 +creditworthy 32 +bass 12 +hiked 32 +philipp 4 +gdp 4 +tuned 32 +worrying 96 +nonverbal 32 +notch 32 +institutionalized 32 +options 36 +placebo 32 +unattainable 32 +handcuffs 32 +regret 32 +beginning 102 +readily 32 +crossed 32 +washes 32 +black 36 +exciting 32 +lancaster 4 +grandfather 32 +bringing 32 +co-author 32 +securing 32 +lunches 32 +awhile 32 +signaling 34 +satisfy 32 +runs 32 +worker-training 32 +proof 32 +bubbles 32 +philadelphia-based 4 +africa 4 +bought 100 +calculates 32 +noticing 32 +frankfurt-am-main 4 +neurological 32 +tangled 32 +outnumbered 32 +soria 4 +walder 8 +throws 32 +dispose 32 +soviet-turkish 4 +dual 4 +apcar 8 +kenneth 6 +muckrakers 32 +useless 36 +genes 32 +vowed 32 +travel-related 32 +elixirs 32 +financier 36 +tigrs 4 +korea 4 +cleaning 32 +programming 32 +exasperation 32 +unbroken 32 +lynch 4 +fences 32 +alexander 4 +lapsed 32 +kennett 4 +townships 32 +mass-produced 32 +boehringer 6 +salaried 32 +a-1-plus 4 +prisons 32 +shoving 32 +dormitory 32 +tax-exempt 32 +civil 44 +appalachia 4 +unpromising 32 +images 32 +campuses 32 +classified 32 +rotan 4 +turkeys 32 +trillions 32 +motorists 32 +ideal 34 +exceeded 32 +alpha 4 +zinberg 8 +pc 4 +empathy 32 +intractable 32 +involuntary 32 +editorial-features 32 +jesuit 4 +half-price 32 +psychiatric 36 +bloomingdale 4 +copyright 32 +bullion 2 +sarre 4 +purse-snatching 32 +camping 32 +industry/government/residents 32 +biden 12 +wayne-gossard 8 +upsetting 32 +races 32 +beverly 12 +cannot 32 +professional-management 32 +low-hanging 32 +flemming 4 +tractor 36 +companies 102 +well-financed 32 +revenge 32 +settings 32 +puffs 32 +rank 36 +soars 8 +hatch 12 +stockholm 12 +marsh 12 +proxies 32 +jon 6 +joachim-ernst 4 +channel 38 +dog 36 +biographies 32 +song 36 +takes 44 +don 46 +really 38 +southmark 14 +greats 32 +sons 4 +dot 32 +dow 14 +wallenberg 12 +faltered 32 +prohibiting 32 +bat-lovers 32 +rationing 32 +rooted 32 +taken 102 +westchester 4 +jobless 36 +catalog 32 +preliminary 32 +bans 32 +ordering 32 +hydromatic 32 +walton 12 +mrmt 8 +moody 14 +platforms 32 +cia 12 +kurds 4 +stumps 32 +bang 36 +band 32 +hunger 32 +inform 32 +problem-free 32 +pay-as-we-go 32 +restraint 32 +centerpiece 32 +incomes 32 +borrus 4 +no-smoking 32 +scotto 4 +their 38 +overtures 32 +lloyd 4 +kuwait 4 +wide-eyed 32 +conservatives 36 +bellevue 12 +reputations 32 +rising 34 +samuel 14 +wermiel 4 +reyna 8 +world-renowned 32 +cper 4 +interpret 32 +coups 32 +opera-comique 4 +won-lost 32 +cs1 4 +passive 32 +placements 32 +during 110 +ingenious 32 +bars 32 +bungling 32 +drugged 32 +twelve-meter 2 +achieved 32 +narrates 32 +bramham 4 +began 100 +fastest-growing 32 +taxable 32 +chafing 32 +fullerton 4 +amerada 4 +funding 36 +historic 32 +assignments 32 +labs 4 +gil 4 +fmc 4 +lebaron 4 +catalytic 32 +without 98 +budget-minded 32 +prestigious 32 +syracuse 4 +agreeable 32 +wallich 4 +inspect 32 +rutledge 8 +hypocritical 32 +daniel 14 +afinp 8 +nominee 32 +hitler 4 +harmfully 32 +inefficient 32 +aleman 12 +imperative 32 +hangout 32 +income-tax 32 +same 32 +wildest 32 +arms-sale 32 +olvr 8 +feet 32 +fees 38 +shaping 36 +francis 12 +unique 32 +antediluvian 32 +upbeat 32 +burdened 32 +ni 8 +hundreds 32 +separate 32 +anathema 32 +popular 36 +arbitrager 36 +passports 32 +ratification 32 +attract 36 +piper 4 +aplenty 32 +volcker 12 +transmissions 36 +pipes 32 +mornings 32 +speed 32 +extinguished 32 +co-producer 32 +reopening 36 +stemmed 32 +speculators 32 +ice 36 +continental 14 +princess 4 +broad 36 +aquifers 32 +skiing 32 +endeavor 32 +three-week 32 +klm 4 +kentucky 6 +handgun 32 +worry 36 +teacher-graduates 32 +salary 44 +bko 8 +arraigned 32 +ruffled 36 +contortionists 32 +rookie 32 +lion 32 +disclosing 32 +win 40 +year 46 +fleeing 32 +heritage 38 +sweepstakes 32 +supposedly 32 +sobriety 2 +african 4 +asarco 2 +shimbun 4 +illinois 6 +conjunction 32 +multibusiness 32 +noticeably 32 +lavenders 32 +sugar 46 +helen 4 +seizing 32 +amhowitz 8 +laf 4 +cty 8 +hawaii 4 +fetched 32 +revolted 32 +cooperative 32 +small-lot 40 +seward 12 +multinational 32 +suitor 36 +ailment 32 +attitude 32 +dropped 32 +lobbyist 32 +issuers 32 +disciple 32 +sectors 36 +ms-dos 4 +combination 32 +deposits 32 +mainstay 32 +measuring 32 +rulings 32 +resorted 32 +real-life 32 +trace 32 +never 38 +chang 4 +mediating 32 +goldman-kidder 4 +liable 32 +aggiornamento 32 +stafford 8 +j.b. 4 +mentz 4 +interesting 32 +ensuring 32 +chant 4 +relied 32 +moreover 42 +relief 34 +norwood 12 +unanimity 32 +boasted 32 +scuttle 32 +movers 4 +least 32 +georgine 8 +designers 32 +curiosity 32 +willems 4 +contained 32 +foreclosed 32 +recommend 32 +civilian 32 +lap 32 +cemetery 40 +anyway 32 +stature 32 +cities 38 +renominate 32 +abruptly 96 +franey 4 +dose 32 +mcgraw 4 +shoeshine 32 +sherwin-williams 4 +settling 34 +safeguard 32 +value 44 +datron 4 +vulnerability 32 +carter 12 +casting 32 +format 32 +headlines 34 +coke 4 +contras 4 +claude 8 +cartel 32 +aback 32 +thrift 36 +marckesano 12 +kingwood 8 +headlined 32 +houari 4 +rendered 32 +popularized 32 +sadly 32 +work-practice 32 +larouche 6 +starting 32 +reluctant 32 +detroit 12 +parking-lot 32 +leapfrogged 32 +overwhelms 32 +axes 32 +small-to-mid-sized 32 +fraud 36 +academic 32 +which 34 +underpricing 32 +one-stop 32 +fomon 12 +outspoken 32 +amusements 4 +stipulate 32 +corner 32 +hmt 12 +campesinas 32 +vows 40 +barrier 32 +hacienda 4 +segments 32 +atpwi 4 +mercantile 6 +derided 32 +sitcoms 32 +remains 100 +holliston 4 +flanked 32 +recommended 32 +examination 32 +metropolis 8 +respected 32 +first-time 32 +letter 44 +helene 4 +pollutants 32 +unintelligent 32 +expressed 32 +rumford 4 +amounts 32 +dramas 32 +finances 32 +selective 32 +differ 32 +expresses 36 +limerick 32 +evidently 2 +l-dopa 4 +repaired 32 +table 36 +meaningful 32 +vivaldi 4 +expelled 32 +backdrops 32 +maturities 32 +tips 32 +pakistani 4 +discusses 4 +faced 34 +principal 40 +serial 32 +superb 32 +brooks 4 +disappear 32 +intervene 32 +rogaine 4 +pragmatic 36 +cuckoo 4 +altered 8 +baby 36 +high-speed 32 +mkt 4 +rekindled 32 +ground-based 32 +notably 32 +bolder 32 +irish 6 +unjust 32 +hendry 12 +pointedly 32 +relevant 32 +reigning 32 +navy 46 +cocaine 32 +tilley 12 +mccarran-ferguson 4 +rioting 32 +general 46 +businessmen 34 +coincided 32 +pclb 8 +eldorado 6 +small-business 32 +hispanic 4 +simplifying 32 +delftaland 4 +skimpy 32 +loaned 32 +coincides 32 +view 36 +caterers 6 +hopkins 12 +arming 34 +added 38 +blanket 32 +degenerate 32 +connection 32 +bones 36 +performed 32 +pointe 32 +lenin 4 +self-dealing 32 +augustine 12 +downgrade 32 +cats 36 +tax-deductible 32 +dante 4 +lyndon 4 +blockade 36 +faces 36 +solved 32 +bronchial 32 +khoo-shearson 4 +wholeheartedly 32 +decorative 32 +untypical 32 +outweighed 32 +syndication 36 +unluckiest 32 +adams 12 +pioneered 32 +picks 36 +adjust 32 +milpitas 4 +latest-quarter 32 +parkinson 4 +ostensible 32 +pandemonium 32 +disk 40 +nominations 32 +heroes 32 +dish 34 +yoshihara 12 +earnest 32 +reader 32 +velasco 4 +czar 32 +immunex 10 +government-guaranteed 32 +plowed 32 +carrier 46 +abated 32 +disagreement 32 +searle 14 +kaiserslautern 12 +insist 32 +ormrod 4 +angiographic 32 +shake-ups 32 +singleton 12 +abolishing 32 +postwar 32 +chula 6 +ibm 14 +hatton 12 +person 32 +hangs 32 +long-misunderstood 32 +conceptual 32 +david 14 +michel 6 +gerstner 4 +uneventful 32 +ted 14 +ssax 12 +tea 64 +compensating 32 +ten 34 +davis 12 +penalties 36 +federal-assisted 32 +viewing 32 +steel-equipment 32 +filene 4 +saddened 32 +agaricus 32 +anytime 32 +rushes 32 +dulles 4 +ceased 32 +becomes 36 +listen 32 +seaman 32 +independent-production 32 +via 104 +listed 32 +iaea 4 +rebounded 32 +arms-control 96 +mother-of-pearl 32 +trajectories 32 +swaziland 4 +bubble 32 +famous 32 +reach 36 +steamship 36 +conditioning 32 +litton 6 +plastics 36 +requests 36 +supplementary 32 +interim 36 +withdrawing 32 +forget 34 +raytheon 10 +saul 4 +errickson 8 +norfolk 14 +sematech 4 +oppenheimer 12 +rushed 32 +psychologists 34 +vainly 32 +memotec 14 +awaited 32 +moscow 14 +phrase 32 +demurred 32 +euphoria 32 +euphoric 32 +thorp 12 +mayer 4 +draining 32 +retreating 32 +pools 32 +synergies 32 +loud 32 +uic 4 +rightfully 32 +maintain 32 +indirectly 32 +flourish 32 +incident 32 +shrugged 32 +stuffed 32 +restriction 32 +needs 32 +grease 32 +tarrant 2 +province 32 +committees 32 +colleen 2 +various-purpose 32 +colgate 12 +five-day 32 +pickets 32 +outstripped 32 +rico 4 +rich 36 +input 32 +requires 32 +rice 44 +firms 46 +haider 12 +finazzo 8 +rica 4 +vibrant 32 +mid-year 32 +required 32 +satisfactory 32 +unrestricted 32 +underlying 32 +responds 32 +forged 32 +sibling 32 +versions 32 +then-nsc 32 +polite 32 +interpretations 34 +siconolfi 4 +permissible 32 +paunches 32 +note 106 +entailed 32 +injunction 32 +stayed 32 +perseverance 32 +masterly 32 +establishment 32 +figure 32 +grips 32 +penetration 32 +telephone 38 +access 100 +all-seeing 32 +emotion 4 +flynn 8 +phillip 6 +germain 4 +overturned 32 +fishing 32 +decompression 32 +coloratura 32 +firestone 4 +type 32 +accuracy 32 +hemming 12 +stand 32 +near 36 +overthrow 32 +miss 38 +april 4 +one-for-one 32 +takeovers 36 +fox 44 +medical 110 +editing 32 +symbol 36 +rockwool 4 +babies 32 +bbc-brown 2 +differential 32 +psc 4 +maker 100 +makes 36 +weddings 32 +clear-cut 32 +honeysuckle 4 +iowa 4 +aet 8 +choleric 32 +vocabulary 32 +sweetener 40 +circumvent 32 +second-biggest 32 +conception 32 +aversion 32 +stunt 32 +people 38 +rhythm 32 +crybabies 32 +gift 32 +criteria 32 +remembrance 4 +theorist 32 +immune-deficiency 32 +vastola 8 +stung 32 +wildfire 32 +highs 32 +downside 32 +narrow 32 +syndrome 32 +treasures 32 +lykes 4 +sticks 32 +azt 6 +fastest 32 +need 32 +unconfirmed 32 +homeland 32 +ever-changing 32 +cows 32 +singlehandedly 32 +dragnet 32 +material-service 32 +cantata 4 +mcalister 4 +portsmouth 4 +convulse 32 +subscriber 32 +patch 4 +directive 32 +abject 32 +booked 32 +ingredients 32 +despaired 32 +jackie 4 +files 40 +emphasized 32 +sure 38 +tacky 32 +reynolds 14 +nwa 4 +charging 40 +framework 32 +tragic 32 +carver 32 +photograph 32 +unheroic 32 +ebbed 32 +sonja 4 +scholar 4 +customary 32 +furious 32 +interferred 32 +inventor 32 +devise 36 +robot 64 +cash-laden 32 +apt 32 +tennessee 4 +engines 32 +oscars 4 +affords 32 +reserve 38 +palace 36 +abrogation 32 +willfulness 32 +inspection 40 +bullock 4 +scream 32 +teledyne 14 +messages 32 +vbnd 4 +consultant 32 +hans 4 +sophistication 32 +self-taught 32 +maintaining 34 +arcana 32 +hand 36 +hang 32 +four-city 32 +plagued 32 +entreaties 32 +plush 32 +cookie 4 +sideshow 32 +furtherance 32 +rivers 4 +awoke 32 +anatolia 4 +affairs 36 +schubert 4 +aspire 32 +habit 32 +asbestosis 32 +calan 4 +giuliani 12 +prodding 32 +triple-a 32 +industrialist 32 +paralysis 32 +bills 36 +sometime 34 +drained 32 +chops 32 +staked 32 +denver-based 4 +referring 40 +depressing 32 +needles 32 +acceptable 32 +bacterium 32 +honor 34 +mortgages 32 +founding 32 +slap 32 +timbre 32 +inefficiencies 32 +crackpot 32 +universe 36 +mortgaged 32 +plethora 32 +personalities 32 +airport 36 +competing 42 +divests 32 +plum 32 +high-rate 32 +solely 32 +second-front-page 32 +mikva 4 +release 36 +financially 32 +extravagant 32 +chilled 32 +smasher 36 +vacuum 32 +malcontents 32 +realize 32 +vancouver 12 +semans 8 +incomparable 32 +pullout 32 +pemberton 4 +fyffe 4 +painstakingly 32 +notion 32 +enters 8 +triggering 32 +unacceptably 32 +ariz. 4 +threaten 32 +license 36 +skimming 32 +acronyms 32 +bats 32 +bundesrat 4 +threatens 32 +bother 32 +get 36 +stein 12 +athletic 32 +realtors 32 +conversing 32 +understate 32 +traced 32 +hiking 32 +discloses 32 +anti-missile 32 +well-turned-out 32 +zug 4 +mcdermott 4 +inventory/sales 8 +revenue 110 +sentenced 32 +vincent 4 +swaps 32 +yardsticks 32 +marlin 4 +fissures 32 +criminal 36 +winds 32 +rural 32 +five-ton 32 +doesn 98 +coil 32 +stances 32 +buyout 40 +sprawling 32 +evolved 32 +masterson 8 +vessels 32 +jagry 4 +meta 4 +bloomington 4 +faceless 32 +above 34 +male-pattern 32 +insecure 32 +u 12 +plaguing 32 +universally 32 +disparity 32 +unseen 32 +emanuel 2 +step-up 32 +effects 32 +house-backed 4 +occurred 32 +hover 32 +martin 14 +supportive 32 +enrollments 32 +renegotiated 32 +scandal 44 +anti-tank 32 +ritual 32 +subsequent 32 +ivanov 4 +grumbled 32 +presley 4 +tricks 32 +warren 14 +acted 32 +hosts 32 +edible 32 +amicable 32 +congressman 32 +tricky 32 +confrontation 32 +instruct 32 +heartening 32 +cs-1 6 +allergies 32 +bankruptcy-law 32 +stuffy 32 +thoughtful 8 +unglamorous 32 +solution 32 +auditors 32 +surprise 32 +afford 32 +influenza 32 +ambitious 32 +dc-9 8 +workaday 32 +more-expensive 32 +well-placed 32 +survived 32 +top-notch 32 +discussion 32 +surgical/critical 4 +visual 32 +lower-level 32 +forgo 32 +raves 32 +survives 32 +neil 6 +amal 4 +game 36 +smoot-hawley 4 +eco 4 +overt 32 +celebratory 32 +grosz 4 +patients 34 +pittsburgh 12 +surveyed 96 +notes 100 +animation 32 +patrick 14 +rock-and-roll 32 +specified 32 +suppress 32 +installments 32 +practice 32 +doubtless 32 +highly 32 +prolongs 32 +york 4 +u.s.-based 4 +aspartame 36 +slashed 32 +modeled 32 +drive 36 +veggies 32 +incorporating 32 +partner 96 +republican 4 +drahuschak 4 +distaste 32 +slashes 32 +quotation 32 +renaissance 36 +bribery 32 +constraints 32 +leveling 32 +hume 4 +pennsylvania 14 +zero-sum 32 +tobin 4 +niels 4 +harmless 32 +lenox 4 +taurus 4 +productivity-related 32 +cramming 32 +probes 32 +overstates 32 +bricks-and-mortar 32 +intellectuals 34 +cave 4 +damped 32 +miranda 4 +handcuffing 4 +todd 10 +forefront 32 +meantime 34 +corporations 98 +quarries 32 +redoubling 32 +natural-gas 32 +salespeople 32 +detained 32 +depression 4 +van 44 +cupertino 4 +days 36 +ousts 8 +anti-aircraft 32 +constantly 32 +piedmont 14 +occupational 36 +credible 32 +draft 32 +contagion 32 +deciding 32 +khan 4 +considers 96 +light-duty 32 +maturing 34 +concessions 32 +slipping 32 +well-suited 32 +sympathy 32 +variable 32 +pierre 12 +smelling 32 +chinese 4 +offending 32 +e.f. 6 +before 110 +incumbent 32 +realty 4 +depositors 32 +firefighters 32 +administrations 32 +foreign-relations 32 +taxi-bureau 32 +challenged 32 +awkward 32 +modulator 32 +factories 36 +joll 4 +forward 32 +vienna 12 +khoo-related 4 +challenger 32 +rodime 6 +intensifying 32 +mann 12 +auction-market 32 +deemed 32 +canda 12 +watchfully 32 +pitch 32 +posner-controlled 4 +marwick 4 +restructures 8 +assembly 96 +preferred 34 +satisfied 32 +assemble 36 +apparently 34 +overcapacity 32 +industrials 44 +inclusion 32 +seasons 32 +stimulus 32 +conclusions 32 +reinforce 32 +dissent 32 +faintest 32 +innovations 32 +nuk 4 +accumulate 32 +disciplines 32 +profit 46 +edgar 12 +favoring 32 +guard 36 +taverns 32 +assistant 36 +crash 32 +thinner 4 +arch-rival 32 +stock-held 32 +originally 40 +networks 32 +franchise 32 +probe 36 +shook 32 +neutrinos 32 +examined 32 +nike 4 +wondrous 32 +accompany 32 +innocuous 32 +dwarfed 32 +contract-suspension 32 +impulse 32 +examiner 32 +examines 32 +alumnus 32 +dissatisfied 32 +tavern 4 +brannock 12 +harvested 32 +regional 32 +rare-book 32 +twenty-first 4 +clare 4 +kinard 12 +hessians 4 +console 32 +diluted 32 +swallowing 32 +mathematics 32 +halmi 4 +acts 44 +misuse 32 +bracher 12 +ogilvy 14 +merchandise 96 +potential 32 +volga 4 +roundup 4 +dilutes 32 +soil 32 +ven 4 +unexpired 32 +squeeze 32 +ried 12 +easter 4 +contend 36 +robinson 12 +imperialism 32 +kilobytes 32 +swift 40 +behavior 32 +inner-city 32 +tipped 32 +hurry 32 +yvette 2 +angus 2 +accrual 32 +quite 38 +alice 14 +umbrella 32 +suffer 32 +bankruptcies 40 +banner 32 +parking-brake 32 +knifepoint 4 +feedlots 32 +case-by-case 32 +reits 4 +altar 32 +on-time 32 +banned 32 +leisure-time 32 +surfaced 32 +hard-nosed 32 +quits 4 +annihilation 32 +roddy 4 +first-class 32 +sylvan 14 +unruffled 32 +dr. 14 +mid-level 32 +professionsals 32 +correction 32 +perforce 32 +altering 32 +retaliatory 32 +memory-enhancing 32 +fibreboard 6 +rolled 32 +clause 32 +bancroft 14 +syrup 32 +imprisoned 32 +prevent 32 +strongly 32 +referendum 32 +t.td 8 +interferes 32 +corporation 32 +regulator 32 +davidson 4 +aims 32 +guitar 32 +instructing 32 +uneasiness 32 +car-rental 32 +divisions 32 +discussing 36 +adjudicated 32 +thirteen 2 +tourism 36 +oop 4 +remembers 32 +suisse 4 +brrs 4 +regulations 32 +hhs 6 +underestimates 32 +destroying 32 +inherited 32 +administrators 48 +narrowest 32 +psychologist 32 +piasio 4 +appoints 8 +enterprising 4 +agip 4 +three-man 32 +sumitomo-group 4 +european 14 +characterizes 32 +battipaglia 4 +lech 4 +taxes 44 +brobeck 12 +damaged 36 +viewpoint 40 +mulders 12 +end-of-year 32 +swissair 4 +over-the-air 32 +laing 12 +taxed 32 +agio 4 +unable 32 +post-cruzado 32 +humans 32 +millions 32 +weight 32 +zickler 4 +fateful 32 +goldwater 8 +minerals 36 +swim 32 +jay 6 +objections 32 +preeminent 32 +asinof 4 +morse 14 +clowning 32 +just 46 +commute 32 +daniels 4 +constitution 44 +merchant 32 +vernon 14 +alan 6 +insuring 2 +glue 32 +noncompt 32 +caldwell 4 +grapefruit 32 +appreciably 32 +reservists 32 +jan 4 +bells 36 +u.s.-london 8 +mit 4 +loans 44 +property 38 +highway 36 +customized 32 +largest-airline 32 +belly 32 +balanced 32 +excluding 42 +mix 32 +indirect 32 +amassing 32 +jenrette 4 +mid 32 +distrusted 32 +inadequate 32 +payne 12 +min 4 +overblown 32 +mim 4 +balances 32 +earth 36 +debtors 36 +langoni 12 +nichols 4 +ally 32 +workable 32 +garnishing 32 +crafty 32 +vendor 32 +rumor 32 +hoard 32 +printing 36 +hesston 14 +india 14 +carnation 4 +baker 14 +returning 32 +co-equal 32 +coors 6 +initiated 32 +follows 40 +embarrassing 32 +drew 44 +manhattan 4 +protesters 32 +classification 32 +payable 32 +hobhouse 4 +fatalities 4 +beverage 36 +dakota 12 +dreg 32 +heretofore 40 +roger 12 +inventors 32 +pyf 8 +undertaken 32 +chapter 36 +glut 32 +imaginative 32 +worries 36 +sculptor 32 +xp 6 +allied 14 +groupings 32 +frazzano 12 +longer-term 32 +peacetime 32 +similarly 42 +bizarre 32 +sluggishness 32 +librettist 32 +worried 32 +owned-and-operated 32 +infinet 6 +weekend 32 +authorized 32 +minutes 38 +generically 32 +manuel 6 +precious 42 +evading 32 +short-covering 32 +fancier 32 +instant 40 +eisenhardt 8 +pathways 32 +cautiously 32 +marcheschi 12 +intelligence 102 +bhc 8 +diebold 8 +ignoring 32 +frequently 32 +recyclables 32 +advocates 34 +census 12 +earmarked 32 +tx 12 +unsafe 32 +rabbit 36 +kingsborough 4 +emergency 32 +sharpened 32 +tt 8 +tv 12 +molding 32 +th 4 +r-revised 16 +awed 32 +tl 4 +to 126 +fighter 32 +tandem 4 +hammett 12 +expensive 32 +tight 32 +phil 4 +deduct 32 +bashers 4 +idiot 32 +sorting 32 +arthur 4 +biology 32 +field-goals-allowed 32 +presses 36 +when 110 +waste 32 +boasts 32 +exclusionary 32 +referrals 32 +asbestos-containing 32 +steptoe 4 +child 36 +chile 6 +aging 32 +high-income 32 +midwestern 32 +chill 4 +cartoons 4 +sprung 32 +hitherto 32 +swayed 32 +easy-to-use 32 +nonpartisan 32 +opens 32 +owners 100 +happening 32 +frankenstein 4 +first-phase 32 +deposed 32 +t. 4 +rebuffed 32 +suffers 32 +packaging 36 +columnist 32 +pounded 32 +suing 32 +folded 32 +allergist 32 +non-public 32 +derived 32 +firings 32 +aggressive 32 +suspected 32 +elbtf 4 +barriers 32 +semantical 32 +kupinski 4 +else 32 +raoul 4 +derives 32 +towels 32 +felony 32 +transforming 32 +treasuries 36 +felons 32 +sqn 8 +physicists 32 +mines 36 +peck 12 +contacts 32 +poliakoff 12 +strip 32 +texaco 14 +n.y. 4 +critics 34 +subtracting 32 +owens-illinois 4 +supply 36 +predatory 32 +snow 32 +autobiography 32 +streams 32 +lynne 6 +zaibatsu 32 +giacomo 4 +reebok 14 +august 6 +radio 36 +bsbx 12 +animated 32 +protestant 4 +rumored 32 +lytle 12 +gothic 4 +whizzing 32 +beech 6 +depreciation 36 +judith 4 +bdg 4 +situated 32 +researcher 32 +deficiency 32 +clonidine-hcl 32 +rescheduled 32 +northern 46 +eat 36 +ear 32 +wheaton 4 +eileen 4 +parish 4 +predictable 32 +eaf 4 +institutes 36 +vary 32 +criers 32 +handles 32 +explored 32 +booming 32 +bedroom 32 +devotion 32 +bashing 32 +literary 32 +hastily 32 +mtc 8 +sets 44 +seminary 32 +quest 38 +specifics 40 +gentles 4 +mcgann 4 +objectives 32 +thank-yous 32 +surround 32 +hence 34 +quiet 36 +storrs 4 +super 4 +feb 12 +raikes 12 +password 32 +established 32 +seth 4 +kaiser 14 +full-time 32 +exchanged 32 +innocent 36 +jefferies 4 +affirm 36 +non-food 32 +intellectual 32 +exchanges 32 +prospered 32 +introducing 32 +fosters 32 +stupid 36 +manon 4 +vacations 34 +jeep 36 +mrgo 4 +vicious 32 +edison 4 +beryl 6 +brutal 32 +unchecked 32 +whammy 32 +dofor 12 +semi-obscene 32 +honest 32 +ryder 4 +corrupt 32 +four 46 +per-share 42 +quit 36 +utp 8 +wrlt-fm 4 +unfounded 32 +deductibility 32 +strategically 32 +hall 36 +jamail 12 +criminals 32 +riverside 4 +coup 36 +implicated 32 +clay 6 +panels 32 +slashing 32 +leery 32 +hitachi 14 +nicaraguan 4 +consolidated 46 +sparrow 4 +halt 36 +concealing 32 +hitlin 4 +adapt 32 +forrest 4 +journalistic 32 +gottesman 12 +comparisons 32 +yankee 4 +sentiment 32 +applying 32 +asai 8 +coercion 32 +ervin 12 +export-import 12 +sympathize 32 +redd 12 +gulfstream 4 +ehrman 4 +celtic 6 +standing 32 +axp 12 +rate-of-return 32 +endure 32 +doel 4 +invariably 34 +consumer-electronics 32 +self-policing 32 +hiatus 32 +economics 36 +hoare 4 +decline 36 +hard-currency 32 +pilots 46 +joanne 4 +abrams 4 +preventing 32 +dixons 14 +trumpet-filled 32 +curfew-long 32 +contact 32 +minimum 32 +fischbach 6 +facility 32 +harsher 32 +information 100 +winnick 4 +yellow 4 +gaz 4 +dairy 32 +freeze 32 +jardine 4 +one-week 32 +slv 8 +male 32 +traumas 32 +gas 36 +microcosm 32 +greatest 32 +preferring 32 +revitalize 36 +imposed 96 +generation 36 +california-santa 4 +endangering 32 +secrets 32 +notice 36 +accounting 36 +lawfully 32 +accusations 32 +slr 4 +nsm 4 +bleeding 32 +gentiles 4 +knut 2 +multilayer 32 +hustle 32 +porky 4 +stop-loss 32 +bailout 32 +mismanagement 32 +antitrust-law 32 +newspapers 36 +remainder 32 +ranalli 8 +mylan 14 +comment 32 +lodging 32 +mccaw 4 +margaret 4 +mouse 32 +jenny 4 +assign 32 +martial 32 +commend 32 +forster 12 +reinstate 32 +genentech 14 +transplant 32 +health 38 +invalid 32 +surprised 32 +will 110 +broadly 32 +transparently 32 +crude-steel 32 +wilf 8 +cfps 4 +copolymer 4 +chicago-based 4 +peak 32 +av-8b 4 +peat 36 +monteverdi 6 +arranged 32 +undo 32 +surprises 32 +formulates 32 +furnaces 32 +olivier 6 +registry 32 +playful 32 +vocational 32 +nssi 4 +mr. 14 +pannill 4 +thomson 4 +shooting 34 +andover 4 +co-plaintiffs 2 +thrusting 32 +malls 32 +responsibile 32 +misunderstanding 32 +embattled 32 +l. 4 +disbanded 32 +manifold 32 +shad 12 +karma 32 +sensed 32 +hodel 12 +unconstrained 32 +underwritings 32 +declaration 32 +abhorrence 32 +catalyzed 32 +valley 4 +rises 36 +shaw 12 +condoned 32 +seemingly 36 +extending 32 +survival 40 +busines 32 +sweden 14 +prudential 4 +graceland 4 +thinly 32 +perplexed 36 +kelton 12 +aggressively 32 +single-day 4 +contrasting 32 +mid-1990s 32 +mrk 8 +borrow 32 +restated 32 +trundles 32 +mrs 8 +home-grown 32 +beds 32 +expedited 32 +pilot 32 +wide-bodies 32 +treason 32 +growl 32 +grown 32 +breckinridge 2 +expanded 32 +former 110 +subsidizes 32 +moss 4 +runnin 4 +insures 32 +citizens 110 +subsidized 32 +hinted 32 +apprehensive 32 +readings 32 +acerbic 32 +funnier 32 +broadman 4 +highest-paid 32 +unobtainable 32 +pronounced 32 +pool-playing 32 +six-year 32 +yesterday 106 +freddie 14 +impoverished 32 +liquidating 32 +split 38 +influential 32 +simplify 4 +costing 4 +buoy 32 +indicators 36 +replace 32 +gen 4 +covent 4 +inquirer 4 +feared 32 +benighted 32 +moments 32 +amused 32 +octave 32 +spaciousness 32 +park 36 +stripped 32 +anticipate 32 +criticizing 32 +premature 32 +closer 36 +abhors 32 +foundations 32 +benefactors 32 +rainer 2 +pioneers 32 +tendering 32 +pfennig 32 +microwave 36 +photos 32 +submitting 32 +almys 12 +sake 32 +half-decade 32 +insured 32 +procter 4 +creature 32 +qualified 32 +palm-sized 32 +loyal 32 +acceded 32 +street 44 +outright 32 +physician 32 +characterized 32 +f-111 12 +pgloy 4 +executives 102 +visitor 32 +fruitful 32 +papandreou 12 +compatible 32 +job 36 +intraday 32 +series 36 +verifying 32 +slumping 32 +signal 46 +wigton 12 +hp 4 +alfred 6 +page-one 32 +anglin 4 +defection 32 +systems 44 +lipper 14 +w. 4 +creeps 32 +aquino 6 +businessman 32 +durables 32 +socialist 36 +impatiens 32 +x-rays 4 +suggested 32 +caps 32 +contemplating 32 +ps 4 +views 36 +unspecified 32 +niceties 32 +engen 4 +acres 32 +ponnet 4 +intravenous 36 +few 38 +spurgeon 8 +strunk 8 +shortfall 32 +swept 32 +admittedly 32 +undertreatment 32 +pre-election 32 +attractiveness 32 +wx 4 +implication 32 +accommodated 32 +managed 32 +describes 32 +wu 8 +glemp 4 +lip 32 +climb 32 +covenants 32 +actual 36 +stimulated 32 +policy-making 32 +press 36 +lio 8 +cruz 12 +helane 2 +stems 32 +we 46 +parallelism 32 +sprinkel 12 +bred 32 +ticking 32 +lie 32 +savannah 4 +acquiesced 32 +la 46 +stratified 32 +zones 32 +sentence 32 +remedies 32 +benefits 36 +woodside 4 +studiously 32 +acronym 32 +cardillo 4 +each 46 +eliminate 32 +dipping 32 +soady 8 +shish 2 +praise 32 +clamoring 32 +oak 4 +knight-ridder 4 +analyses 32 +lure 32 +sea 46 +ousey 4 +aiding 34 +catering 32 +see 38 +overreacting 32 +wasteland 32 +fixed-rate 32 +candidate 96 +assets 110 +parochial 32 +wealth 32 +accob 8 +firepower 32 +semantics 36 +received 96 +replacing 32 +set 44 +unlawfully 32 +fertilizers 32 +dirty 32 +horseshoe 32 +lk 4 +survivors 32 +harbingers 32 +ascribed 32 +lurk 4 +bally 14 +wholesalers 40 +emily 4 +adieu 32 +damage 36 +clabir 14 +lake-front 32 +together 34 +numerous 34 +populations 32 +merion 8 +consecutive 32 +eisner 12 +finds 36 +cynr 4 +jeanne 4 +house 46 +shoulders 32 +proposal 44 +palmer 4 +patterns 32 +efh 8 +motion 36 +opponent 32 +ideas 36 +soothe 32 +equipment 36 +kebab 32 +export 32 +questions 32 +conflicting 32 +southern 46 +asset- 32 +angiographics 32 +jacob 4 +gary 14 +avondale 2 +infections 32 +citations 32 +systematic 32 +virus 40 +comply 32 +harmful 32 +forstmann 4 +foray 32 +micro 4 +brashness 32 +skew 32 +pan 14 +pants 32 +malongo 4 +radical 32 +repairmen 32 +clock 32 +fault 32 +persio 4 +protecting 32 +mechanically 32 +austria 4 +angolans 4 +league 36 +preservers 32 +misapplied 32 +remind 32 +participating 34 +checkoff 4 +gencorp 14 +pacific 14 +merge 32 +low-priced 32 +denominated 32 +data-base 32 +subordinated 32 +crises 32 +disadvantaged 32 +bibles 4 +uglich 4 +circles 32 +single-family 34 +emigrated 32 +nuclear 108 +propped 32 +circled 32 +brethren 32 +critically 32 +footwear 32 +subordinates 32 +disgraceful 32 +mpi 4 +knitting 36 +rinehart 4 +media 36 +ponnelle 12 +prevalent 32 +victim 32 +helps 32 +foreigners 38 +rowan 4 +unveils 12 +formations 32 +underweighted 32 +denounced 32 +performer 32 +vrdolyak 12 +spill 36 +craziness 32 +bout 32 +claimant 32 +briefly 32 +prompting 32 +stalls 8 +undercutting 32 +portfolio 32 +aspects 34 +karr 8 +seven-member 32 +wrongdoing 32 +dublin 12 +wall-to-wall 32 +brought 36 +extremist 32 +plainclothes 32 +innovate 32 +offerings 36 +subsidizing 32 +chevy 4 +priority 32 +schulz-koehn 4 +pegasus 14 +discharge 32 +engaged 32 +swapped 96 +r.h. 6 +nora 4 +marpac 4 +nameplate 32 +substitution 32 +hertz 6 +seconds 32 +wesley 6 +dogs 32 +vacancy 96 +contender 32 +crooks 12 +outfitted 32 +inextricably 32 +eroding 32 +came 40 +editor 36 +comanche 4 +carbide 4 +nervous 32 +quick-reaction 32 +followerfish 32 +craft 32 +harrisburg 8 +amid 110 +contended 32 +calculators 32 +upset 32 +camp 36 +giants 36 +toilets 32 +simultaneous 32 +reinforcing 32 +diana 4 +cost 32 +suspending 32 +boca 12 +stone 46 +facilitating 32 +electrocardiogram 32 +pacman 4 +fast 44 +doublespeak 32 +contrasted 32 +methods 36 +proved 32 +two-story 32 +lets 32 +nicaragua 6 +debtor-country 32 +lifeless 32 +baryshnikov 4 +chilton 12 +pervasive 32 +elbit 4 +grenada 4 +co-managed 32 +permits 32 +investigating 32 +port 32 +suter 12 +erdman 4 +leominster 4 +owns 96 +jules 4 +prankster 32 +looked 32 +saudi 4 +endeavors 32 +co-manager 32 +invade 32 +avoided 36 +requirements 32 +alnt 8 +bnk 4 +emi 4 +install 32 +tancredo 4 +manne 4 +randy 4 +emerge 36 +delinquent 4 +disappearance 32 +suburb 32 +deficit 44 +mimicking 32 +sutezo 4 +shafer 8 +retton 4 +willcox 8 +you-know-what 32 +turbo 32 +broadcaster 32 +lincoln 14 +recall 36 +anthony 6 +cleveland-based 4 +extended-stay 32 +supplemented 32 +patient 32 +violets 32 +unusually 32 +kelley 4 +koester 8 +assembling 32 +contrasts 32 +conglomerateur 32 +central 44 +scholarship 32 +obscene 32 +erratic 32 +pistols 32 +conveyed 32 +cpq 12 +extends 44 +dresser 4 +dresses 32 +cpt 6 +unload 32 +hci 8 +louis 14 +jerusalem 4 +miny 8 +low-income 32 +perquisites 32 +dressed 32 +revolutionary 32 +huffy 32 +signals 32 +rationed 32 +duplicate 32 +hike 32 +cph 4 +mountain 36 +carpenter 12 +genetski 12 +bradt 8 +arco 14 +inadequately 32 +averaging 32 +attribute 32 +confounded 32 +liebowitz 4 +employs 32 +brady 4 +intensely 32 +sorbonne 4 +buyer 34 +airplane 32 +lexington 8 +strenuous 32 +guyon 4 +rationale 32 +holders 102 +volz 8 +investors 46 +primary 36 +penobscot 12 +photographically 32 +advertising 110 +micron 4 +euan 8 +settled 32 +wine 100 +wind 36 +wing 36 +primark 12 +hardening 32 +parlow 12 +wins 36 +group 46 +argonaut 4 +publish 32 +international 110 +healey 4 +monopole 32 +newsprint 36 +turnaround 36 +cadre 32 +retail-entertainment 32 +broderbund 4 +double-a/a-1-plus 32 +mend 32 +peers 36 +beckett 4 +ventilation 32 +indianapolis-based 4 +mscc 4 +georgetown 4 +waters 32 +short-maturity 32 +forbidden 32 +menu 32 +unlawful 32 +monopoly 32 +news 38 +nios 4 +sailors 32 +stolen 32 +differently 32 +nickname 32 +maquilas 42 +overseeing 32 +represent 32 +confirmation 40 +survivor 32 +jewelry 32 +elects 4 +steel-fabrication 32 +households 96 +squawk 32 +brent 6 +reacting 32 +long-term 34 +combipress 6 +denison 14 +resulted 32 +jurists 32 +fraction 32 +puzzles 32 +feistritzer 4 +union 46 +revved 32 +otherwise-flattering 32 +cornetti 4 +farmington 4 +schooling 32 +machine 36 +abdul-haadee 4 +puzzled 32 +mine 32 +vague 32 +scared 36 +abbe 4 +iowa-based 4 +lakes 32 +olenick 4 +seemala 6 +repaid 36 +deductions 32 +bottler 32 +bottles 32 +airways 4 +spur-of-the-moment 32 +employ 32 +entrepreneurial 32 +ciba-geigy 4 +jean 6 +repair 36 +screamed 32 +cigarette 36 +well-connected 32 +dahl 4 +fiancee 32 +valuable 32 +company-owned 32 +wealthier 32 +bridges 4 +keenan 12 +otis 4 +collaborated 32 +air-freight 64 +drill-bit 32 +ruffle-front 32 +condominium 32 +meets 32 +recordings 32 +den.a 8 +sacrifice 4 +editors 32 +duck 32 +nev.-based 4 +ribavirin 32 +respect 32 +hairs 32 +evokes 32 +brentwood 4 +herald 4 +gathered 32 +adults 32 +networking 36 +independence 32 +clifton 2 +differences 34 +isolated 36 +plunge 36 +money-transfer 32 +scaled-back 32 +southeast 14 +frequent 34 +ahonoora 4 +wheeler-dealers 2 +spirited 32 +chosen 32 +scares 32 +linda 12 +serviceable 32 +somebody 36 +metropolitan 44 +twin-engine 32 +immediate 32 +ads 36 +swamping 32 +ida 4 +approaches 32 +consultants 36 +unfazed 32 +deaths 32 +bikinis 32 +wriv-tv 2 +eons 32 +loucks 8 +everything 36 +recreating 32 +vice 108 +straw 32 +silk 32 +vulnerable 32 +ex-cia 32 +locations 32 +resins 32 +looms 36 +financement 4 +smashing 32 +unravel 32 +cary 4 +math 32 +casseb 4 +black-market 32 +excessively 32 +herculean 32 +care 100 +card 38 +trucking 32 +antidote 32 +alarming 32 +shortages 32 +carl 6 +semiconductor 110 +higher-than-anticipated 32 +method 32 +planners 36 +involved 36 +moines 4 +sprinkles 32 +declared 96 +controller 32 +prevents 32 +drescher 4 +u.s.-dominated 4 +pastures 4 +muster 32 +psychologically 32 +bylaws 32 +jacksonville 4 +limiteds 32 +superiority 96 +sprinkled 32 +low-budget 32 +departure 36 +vaginal 32 +compunction 32 +ethical 32 +muted 32 +protected 32 +projection 32 +steelmakers 32 +spanier 8 +squirms 32 +contain 32 +overturn 32 +pore 32 +correspondent 32 +josephthal 4 +median 32 +slapping 32 +stevenson 4 +attributes 32 +sleeves 32 +guts 32 +smelters 32 +disappearing 32 +linked 32 +realigned 32 +di 44 +newsstands 32 +endo 8 +northrop 14 +extreme 32 +phillips 14 +sort 32 +steppes 8 +steeper 32 +affirmed 32 +whereabouts 32 +foster 44 +invite 32 +decker 4 +sport-fishing 32 +bland 32 +john 14 +parents 38 +hazlitt 4 +guardian 32 +lackluster 32 +enjoying 32 +do 38 +recast 32 +dividing 32 +notorious 32 +transfering 32 +lebow 4 +preparing 32 +entered 32 +stabilization 36 +arrived 32 +straws 32 +marty 6 +ottone 4 +commendable 32 +auschwitz 4 +marts 32 +lining 32 +batter 8 +giudici 4 +practical-joking 32 +honduras 4 +copycat 4 +ability 100 +autonomous 32 +upgrade 36 +de 100 +inouye 4 +shipper 32 +post-big 32 +thursday 6 +institutions 100 +multiply 32 +objected 32 +guano 32 +hodgepodge 32 +settle 44 +wayne 8 +inception 32 +unclear 32 +high-energy 32 +printable 32 +sweetner 8 +shield 36 +front-runner 32 +gregory 12 +traders 46 +maj. 4 +riddled 32 +usw 4 +high-flier 32 +bethesda 4 +job-training 32 +parnes 4 +sias 8 +sociological 32 +deprive 32 +metro 14 +vitro 2 +riddles 32 +bouquet 32 +underwriters 38 +apparent 32 +voters 34 +jerome 4 +subcontractors 32 +margo 2 +supplanting 32 +overcome 32 +sighting 32 +well-known 32 +cnvx 4 +wdc 8 +description 32 +george 14 +t.npi 4 +left-wingers 32 +uep 8 +jaded 32 +athens 12 +fenner 4 +forties 32 +fortier 4 +fulfilled 32 +tie 32 +obligatory 32 +well-versed 32 +unaware 32 +extravagance 32 +holdings 44 +skill 32 +sales 110 +new$ 4 +barnett 12 +maryinsky 4 +prospective 32 +bankrupt 32 +bah 2 +mingle 32 +inflated 32 +prosecute 32 +literally 32 +use 36 +subsidy 32 +exactly 32 +symptom 32 +withheld 32 +richer 36 +d.h. 4 +motown 4 +calendar 36 +millennia 32 +india-rubber 4 +supersaver 32 +victor 14 +refinances 32 +now-defunct 32 +cautious 40 +enforcement 36 +subside 32 +fearon 4 +consumer-goods 2 +instances 32 +midlands 4 +skipped 32 +bill 44 +pinto 4 +tastes 36 +suggestions 32 +hard-charging 32 +elegant 32 +homework 32 +goldhammer 4 +cornerstone 32 +taylor 12 +millar 4 +sup 4 +fianna 4 +suggestion 32 +thousand 32 +exchange 102 +nippon 14 +larger 32 +noncompetitive 32 +recognizance 32 +star-topped 32 +satisfying 32 +repay 32 +almost-certain 32 +industry-financed 32 +reconsideration 32 +stray 32 +pork 38 +meg 4 +sokolow 12 +middleman 32 +deregulation 36 +barometer 32 +marquee 32 +waived 32 +flatly 32 +both 46 +pfe 12 +iverson 4 +bipartisan 34 +epidemiology 32 +dmbk 8 +humphreys 4 +offering 100 +article 32 +higher-than-expected 32 +fodder 32 +source 42 +shot 32 +expense 32 +gatsby 4 +ill-advised 32 +bottomed 32 +jean-louis 4 +punished 32 +wacky 32 +ferry 32 +skilled 32 +ries 4 +stock-cash 32 +five-year 32 +illustration 32 +carry-forward 32 +resigned 108 +adopted 40 +betty-jo 2 +bomb 32 +object 32 +guero 32 +user-charge 32 +burgee 4 +six-cylinder 32 +kinburn 4 +backing 32 +combustion 32 +perfect 32 +vanderbilt 12 +maloof 4 +saturn 6 +commanders 32 +renunciation 32 +sasso 4 +ill-designed 32 +bauer 12 +hug 40 +buildings 36 +hud 2 +administering 32 +bunches 32 +goodwin 4 +entrenching 32 +thorough 32 +iscs 4 +wsj 4 +gerhard 4 +hut 4 +unfortunate 32 +hawkeye 14 +passion 32 +shp 8 +announcements 32 +shadowy 32 +non-discretionary 32 +currently 42 +co-production 32 +only 38 +initially 96 +exposed 32 +ado 32 +wharton 14 +telecasts 32 +tropical 32 +bottoms 32 +bank-secrecy 32 +weights 32 +linerboard 38 +mills 36 +bls 4 +pierce 44 +resume 36 +recollection 32 +consolidation 32 +loosens 32 +commonplace 32 +supports 32 +mckinley 8 +pause 32 +cited 36 +futility 32 +robin 4 +cardin 4 +changed 36 +chieftains 32 +high-end 32 +m&a 4 +beaubien 4 +bendel 4 +stifles 32 +alabama 4 +cites 96 +elliott 4 +massacres 32 +similarities 32 +bombarded 32 +admittance 32 +leader 36 +utah-based 4 +donning 32 +secretaries 32 +taiwan 4 +nationality 32 +spreadsheet 32 +transitional 32 +realists 32 +guidance 32 +blessed 32 +demure 32 +dismissing 36 +stunning 32 +entrepreneur 32 +cheerful 32 +arab 4 +work-places 32 +thievery 32 +complication 32 +cry 36 +reckoned 32 +complicating 32 +coasts 32 +sobbing 32 +expressionist 4 +asking 32 +residence 4 +peregrine 32 +premeditation 32 +mighty 32 +tones 32 +sylvania 4 +shimon 4 +frail 32 +lks 8 +resourceful 32 +switched 32 +mysteriously 32 +toned 32 +rts 4 +mightn 32 +hose 32 +sensors 32 +three-ring 32 +sustaining 32 +zoltan 4 +lanes 32 +resentment 32 +utilities 46 +adv 8 +overaddiction 32 +tinier 32 +slower 32 +forcing 32 +along 42 +alone 36 +rousseau 4 +spilled 32 +miserable 32 +gaffe 32 +slowed 32 +peugeot 8 +newsletter 32 +schumer 4 +swooping 32 +wasn 44 +occidential 8 +employment 36 +stifling 32 +career 36 +afghanistan 4 +canada 14 +movie-studio 32 +dropout 32 +s.p.a. 4 +secretly 32 +may 110 +nunn 12 +enjoyed 32 +seeped 32 +shops 36 +frazier 4 +brookfield 8 +doing 40 +exe 4 +moffett 4 +norsk 14 +observance 32 +units 102 +transporation 4 +kisses 32 +hinduism 4 +gaughan 8 +blumenthal 4 +excesses 32 +involves 32 +jumblatt 4 +sounding 32 +local 38 +distanced 32 +royster 12 +u.s.-trained 4 +river 4 +pains 32 +demonic 32 +oxford 4 +glory 32 +unilever 4 +paint 32 +saharan 4 +bartels 4 +sufficiently 32 +databases 32 +child-bearing 32 +acknowledgement 32 +richest 32 +connotation 32 +cuff 12 +geochemistry 32 +skidded 32 +brotherhood 4 +informant 32 +recorders 32 +cheating 96 +supervision 32 +spreckels 4 +rebs 4 +tables 32 +retired 34 +carolee 2 +roth 12 +seemann 8 +kyushu 4 +suffered 32 +falcons 32 +ga. 4 +mirth 32 +dearborn 6 +crowne 4 +warsaw 4 +dana 4 +all-irish 32 +classicist 32 +becor 12 +deposited 32 +trickling 32 +brand-name 32 +galen 4 +orate 32 +prospering 32 +defraud 32 +includes 36 +paribas 14 +visitors 34 +armed 36 +halcyon 32 +orders 36 +special-interest-group 32 +beane 12 +shakeout 32 +premises 32 +bernie 4 +tubing 32 +double-a-minus 32 +confined 32 +burden 32 +test 36 +loosely 32 +chapstick 4 +withholding 32 +pays 32 +stylistic 32 +louisiana-pacific 14 +warp 32 +enlist 32 +fa-18 4 +ballpark 32 +arguments 32 +averted 32 +stainless 32 +shipyard 36 +interruptions 32 +grossed 32 +abt 14 +lenders 32 +misappropriation 32 +charlie 4 +gingerbread 32 +bbec 8 +abc 14 +sickness 32 +aba 12 +sahara 4 +resultant 32 +abf 8 +oxy 8 +tinkering 32 +soliciting 32 +thrust 32 +eligible 32 +commodore 4 +innovating 32 +bbc 4 +braverman 12 +avez 32 +feels 32 +bbk 4 +jumps 32 +veiled 32 +chimpanzees 32 +medieval 32 +jour 32 +legal-ethics 32 +martini 4 +combat 32 +leak 32 +training 36 +lybrand 4 +coney 4 +outsells 32 +refer 32 +rang 32 +welcome 32 +glass-steagall 4 +turns 40 +impede 32 +offense 32 +successful 32 +unisys 4 +supplemental 32 +urge 36 +state-owned 32 +kinda 4 +gang 32 +wilmington 12 +safeway 4 +unwelcome 32 +abner 4 +good 38 +crosby 12 +lafarge 14 +weeklong 32 +nights 32 +intimacy 32 +airliners 32 +blackboard 32 +kansas 4 +rubens 4 +contribution 32 +then-secret 32 +older 32 +granite 32 +high 46 +policy-setting 32 +ballets 34 +entiche 4 +well-orchestrated 32 +day-to-day 32 +humanity 32 +buford 8 +thunberg 4 +bathers 32 +babson 8 +day-care 34 +dutch 4 +inquiries 32 +encased 32 +ought 32 +clashed 32 +druse 4 +automotive 32 +begetters 32 +gaudy 32 +examinations 32 +unreleased 32 +chg. 4 +acquirers 32 +mmblf 8 +assures 32 +lunch 32 +nuclear-strategy 32 +gemayel 4 +assured 32 +long-term-gain 32 +eisenhower 4 +turbine 32 +walsh 4 +goradok 4 +boundaries 32 +such 34 +background 36 +stallion 32 +totalling 32 +feldstein 12 +daredevil 32 +pauls 4 +matsumura 4 +investing 32 +define 32 +phone 32 +ibus 4 +peasant 32 +paula 4 +diversion 32 +closings 32 +presented 32 +amends 32 +gmc 4 +perry 14 +employers 98 +smith 12 +gmh 4 +icn-financed 4 +paulo 4 +port-o-potty 4 +australia-based 8 +unrealistic 32 +strongest 32 +elder 36 +horton 4 +nor 42 +shotguns 32 +adjusting 32 +now 46 +yearn 32 +not 46 +years 102 +upward 32 +hoped 36 +alternate 4 +non 32 +artistic 32 +noc 8 +cooling-off 32 +purchase 46 +births 96 +million-ton 32 +chiefly 32 +teens 32 +terms 42 +portents 32 +amendments 32 +parodies 32 +conjectures 32 +amex 12 +sheathed 32 +partnerships 36 +answers 32 +investment-banking 32 +whereas 34 +rescuing 32 +job-hopping 32 +dimes 32 +straightforward 32 +something 36 +upc 8 +brother-in-law 32 +blank 4 +surrendered 32 +chances 32 +minzer 12 +clarified 32 +feetlebaum 4 +puusepp 12 +historian 34 +moguls 32 +timothy 4 +guilt 32 +fighting 38 +complementing 32 +high-performance 32 +peek 32 +decentralized 32 +ends 36 +django 4 +ratified 32 +behest 32 +guild 38 +advocacy 34 +predict 32 +clevepak 4 +paintings 32 +obtains 32 +profusion 32 +breakthroughs 32 +receive 32 +vastly 32 +conducting 32 +resell 32 +sayi 4 +alleghany 6 +kumar 4 +melt 32 +kildare 4 +learning 36 +stuff 36 +manatee 4 +sincerely 32 +segregated 32 +prescribed 32 +kaneb 6 +boone 8 +richardson-vicks 4 +revenues 32 +gilbert 12 +leasing 36 +strengthening 32 +feinstein 4 +decision 100 +shed 32 +aircraft-evacuation 32 +z 100 +j.c. 6 +priscilla 4 +beijing 4 +long 46 +pratically 32 +lone 4 +beans 32 +trimming 32 +manners 32 +steadily 32 +diagram 32 +netted 32 +command 36 +disks 32 +steeply 32 +yr. 4 +more-extensive 32 +shareholders 110 +sometimes-flimsy 32 +perrin 4 +extraction 32 +ratajczak 4 +anticipation 32 +clans 32 +valencia 4 +notwithstanding 32 +whittier 4 +disclosures 32 +notation 32 +early-deployment 32 +belton 4 +succeeded 32 +restored 32 +existence 32 +axles 32 +butyl 32 +labor-management 32 +kendall 8 +claridge 8 +seventeen 2 +host 32 +gubernatorial 32 +incorporates 32 +brewster 12 +libel 32 +augment 32 +born 38 +pastime 32 +traditional 32 +quinlan 8 +bore 32 +leapfrogging 32 +about 46 +fashionable 32 +management-led 32 +demos 8 +schenectady 8 +partially 32 +incorporated 32 +businesses 106 +telematics 4 +carmichael 4 +bowling 32 +dubai 4 +alter 36 +second-quarter 32 +bangemann 12 +homeowner-mortgage 32 +whiteman 4 +prof. 6 +alton 4 +occupancy 32 +vlis 8 +enact 32 +anniversary 32 +manure 32 +hyping 32 +korean 4 +koten 4 +stockman 8 +using 42 +earlier-than-contemplated 32 +seven-up 12 +abc-affiliated 4 +mims 4 +redoglia 4 +hwp 8 +concocted 32 +embassy 46 +awareness 32 +gravity 32 +fairness 32 +rittereiser 12 +mime 32 +engendered 32 +juveniles 32 +wielding 32 +disagrees 32 +chronicle 32 +ones 32 +seasonal-adjustment 32 +breath 32 +cutthroat 32 +iran-contra 4 +widened 40 +occupying 32 +wartenberg 8 +secret 44 +omnibus 32 +fractional 32 +lung 32 +suddenly 34 +ftc 12 +whiskey 32 +zagorsk 4 +burst 32 +copying 32 +cemeteries 32 +horse-breeding 32 +events 38 +accountants 36 +baluchis 4 +reduction 32 +determining 32 +taxis 38 +peroni 12 +wilshe 4 +explanation 32 +spaces 32 +top-level 32 +johnsons 4 +develops 36 +soviet 6 +miner 32 +trans 4 +proofs 32 +lobbying 32 +joint-venture 32 +prepubescent 32 +bounced 32 +stirring 32 +polluting 32 +sooner 32 +rjr 14 +silence 32 +industry 110 +still-centralized 32 +overcrowded 32 +debentures 100 +berisford 4 +william 14 +piloted 32 +panay 4 +superpower 32 +encouragement 32 +yamaichi 2 +impasse 32 +bidding 36 +slate 32 +overwhelmed 34 +frightened 64 +filed 32 +done 32 +chadli 4 +munch 32 +binge 32 +debt-laden 32 +sherman 12 +negative 32 +coherent 32 +maximize 32 +peach 36 +pre-big 32 +versus 32 +literature 32 +un-reagan-like 32 +velobind 8 +submitted 32 +vacant 32 +jet 36 +jew 4 +orbanco 14 +statutes 32 +clip 32 +interceptors 32 +rowlands 4 +mcknew 12 +destroyed 32 +management 110 +demonstrating 32 +vu 32 +finicky 32 +hypothetical 32 +master 36 +frustrate 32 +portend 32 +malevolent 32 +huw 8 +vi 4 +davenport 4 +vf 14 +ve 34 +systemhouse 4 +alarm 36 +switzerland-based 4 +throwaways 32 +average 46 +burned 32 +number 32 +resignation 32 +starcraft 4 +hated 32 +harming 32 +shipped 32 +lineup 32 +encourage 32 +robelo 12 +rub 36 +overdue 34 +acquirer 32 +exams 32 +run 36 +apartment 32 +decide 32 +orsini 8 +enrique 4 +c-yields 64 +the 126 +short 36 +natomas 4 +expectations 102 +baker-watchers 4 +should 102 +v. 4 +undermining 32 +offshore 38 +profitability 36 +rigs 32 +shore 32 +shcharansky 4 +gave 32 +pyrotechnics 32 +appointment 32 +skyw 8 +mayors 32 +receivers 32 +conferences 32 +stable 32 +drinkers 32 +ensure 32 +s&w 4 +tracks 32 +ppos 4 +dress 32 +displaced 32 +gospel 32 +overreach 32 +thighbone 32 +oil-drilling 32 +burdick 12 +metals 36 +securities-industry 2 +u-shaped 4 +invitations 32 +evaporating 32 +ucc 8 +wald 4 +rebelling 32 +glucksman 4 +heck 14 +approximate 32 +legitimacy 32 +ucl 4 +eddie 6 +pawing 2 +teeth-gnashing 32 +merck 14 +about-to-boom 32 +barbara 14 +shearson-managed 4 +fighters 32 +ugly 32 +accidently 32 +male-female 32 +hawaiian 12 +methodology 32 +skins 32 +birthplace 32 +reliever 32 +scaling 32 +proliferation 32 +kent 6 +lump 32 +monaghan 4 +discuss 40 +schedule 32 +distribution 36 +wein 4 +connors 4 +pile 36 +hipbone 32 +eight-member 32 +beehives 32 +peerless 4 +wallop 44 +snag 32 +antique 32 +joned 32 +mass.-based 4 +soured 32 +musicians 32 +equivalent 96 +outlast 32 +quandary 32 +jones 12 +anonymity 32 +purporting 32 +tradition 34 +underground 32 +frayed 32 +affordability 32 +nugget 4 +tharp 4 +brutally 32 +zeal 32 +artificial 32 +ballot 32 +laffer 4 +date- 4 +smile 32 +nominating 32 +chester 4 +underclass 32 +pinstripes 32 +sidesteps 32 +predisposed 36 +policy 110 +drinking 32 +classifying 32 +england 4 +provoke 32 +anti-communist 32 +conservatively 32 +motorola 4 +photo 36 +surpassing 32 +unfulfilled 4 +capital-markets 32 +friendship 32 +forfeited 32 +repeal 36 +brant 12 +semiconductor-equipment 32 +dust 36 +fidelity-monarch 4 +bleached 32 +churches 32 +jail 32 +revisit 32 +himont 14 +electricity 36 +clearinghouse 32 +foiled 32 +non-cash 32 +accusing 32 +angeles-based 4 +grounded 32 +retaliated 32 +gymnastics 32 +slippers 32 +qua 32 +sun 46 +marking 32 +shakeup 32 +mechanic 32 +grievances 32 +hwkb 8 +million-plus 32 +abrogate 32 +rests 32 +brunswick 4 +four-year-olds 32 +runyon 4 +surged 40 +jackpot 36 +a.c. 4 +man-hours 34 +shrewsbury 4 +braided 32 +cinderblock 32 +opining 32 +putka 4 +leeson 4 +urstadt 4 +mclean 4 +approximates 32 +mcic 8 +dundee 4 +h.c. 6 +sayao 4 +continually 32 +sued 100 +creams 32 +ashamed 32 +anxious 32 +detonate 32 +mounted 32 +scripts 32 +cvn 8 +sweeten 40 +directed 32 +sweeter 32 +i 14 +fla.-based 4 +discontinued 32 +aren 100 +area 36 +market-sensitive 32 +sidestepped 32 +diem 4 +rotational 32 +volunteers 32 +summer 36 +travels 32 +litigator 32 +regaining 32 +joins 32 +ravaged 32 +ebnc 4 +joint 44 +laugh 32 +handful 32 +industrial 110 +deeply 32 +fears 32 +howe 4 +co-authored 32 +blocks 32 +steenburgen 12 +richards 4 +books/william 4 +ledyard 4 +desktop 32 +invoices 32 +heaped 32 +high-quality 32 +continues 100 +fundamental 32 +term-loan 32 +evaluating 32 +lulling 32 +boxer 36 +yielding 32 +concessionary 32 +schuman 4 +contracting 32 +benefit 32 +clearing 36 +continued 34 +good-looking 32 +contra 4 +nonunionized 32 +lingerie 32 +shots 32 +training-related 32 +playroom 32 +cmd 4 +lehder 4 +beaumont 4 +misstate 32 +fund-raising 32 +triple-damage 32 +janitors 32 +spotted 32 +seven-figure 32 +peer 32 +allowing 34 +additional 110 +seat 44 +wefer 8 +finding 36 +pro-forma 32 +implemented 32 +etn 8 +anti-inflation 32 +etc 32 +disagreed 32 +travenol 4 +seag 8 +budgets 32 +rival 38 +matter 36 +fixed-rated 32 +strange 32 +select 32 +sideways 32 +onions 32 +rhetorical 32 +k. 4 +cooper 14 +vapid 32 +nyta 4 +champions 32 +petroleum 44 +asians 6 +rappaport 8 +outlining 32 +fabricated 32 +journey 32 +naylor 12 +please 32 +excreta 32 +malfunctions 32 +schlesinger 8 +flying 34 +tipping 32 +insistence 32 +vessel 32 +undisputed 32 +damaging 32 +cornball 32 +basically 36 +altos 4 +receipt 32 +gloating 32 +tip 40 +competitiveness 36 +dividend 44 +uncommon 32 +reform 36 +limit 36 +cyanamid 4 +certification 36 +populism 32 +photographic 32 +lower-priced 32 +showcased 32 +sept. 14 +royal 4 +md.-based 4 +fast-paced 32 +refractory 4 +heckuva 32 +study 108 +treatments 32 +hia 12 +time 44 +creating 32 +broadens 32 +rains 32 +chemically 32 +gaps 32 +tellez 4 +somber 32 +military 100 +cooled 32 +grievance 32 +irrelevant 32 +widen 32 +intellectually 32 +lawyer-cpa 32 +tropics 32 +petitions 32 +dry 36 +sheldon 12 +gossip 32 +virazole 4 +lever 32 +hourlong 32 +mousse 32 +voices 4 +addressed 32 +refugees 32 +reprehensible 32 +mild-mannered 32 +matching 32 +tranquil 32 +asia 4 +jackets 32 +single-b-3 32 +obtain 32 +newark 12 +messiest 32 +addresses 32 +voiced 32 +adequacy 32 +vanzetti 4 +june 6 +landfill 32 +affirmative 32 +non-utility 32 +swordfish 32 +approaching 32 +cheetah 4 +sally 6 +anglo-dutch 4 +warned 32 +dale 6 +implied 32 +hospitable 32 +dali 4 +nutley 4 +harlan 12 +importantly 32 +countrywide 8 +subject 38 +scavengers 32 +coaches 32 +single-store 32 +roadblocks 32 +loses 4 +comfort 32 +closes 32 +cake 4 +morning 32 +dalhouse 12 +grove 12 +hats 32 +stephens 4 +receptive 32 +foreigner 32 +responsible 32 +mid-december 32 +prowess 32 +breathing 32 +furniture 100 +screening 32 +hata 4 +sewage-treatment 32 +bring 36 +apocryphally 32 +workload 32 +stockbroker 32 +neon 32 +toddlers 32 +states 46 +nick 4 +tenor 32 +martinet 4 +traitor 32 +inexact 32 +eye-opening 32 +disorder 32 +pro-iran 32 +hills-based 4 +tax-cut 32 +helyar 4 +bassett 4 +behind 34 +uninvited 32 +by-election 32 +outpacing 32 +relegated 32 +naked 36 +saunders 4 +persuaded 32 +slumps 32 +confuse 32 +illusion 32 +tainted 32 +e.h. 8 +floating 32 +portrayed 32 +kemal 4 +hotel 110 +introduced 96 +fractious 32 +capitalize 32 +maquila 34 +tampa 4 +mgm/ua 4 +tournaments 32 +lays 4 +precaution 32 +lists 32 +heublein 4 +induced 32 +rehearing 32 +substance 36 +fry 12 +retrenchment 32 +joking 32 +matthews 12 +fluids 4 +obligator 32 +little-noted 32 +sleepy 32 +kong 4 +nissan 8 +sloppy 32 +leeway 32 +lyons 14 +decision-making 32 +performs 32 +amdec 4 +experienced 32 +gainful 32 +print 36 +fairy 36 +sacrificing 32 +candidates 40 +reinsurance 32 +benefiting 32 +scientists 38 +insurgency 32 +citizenship 32 +shunted 32 +eschewing 32 +cuts 36 +aerospace/technology 32 +tree 36 +gods 32 +plants 36 +maintained 32 +ranks 40 +bracket 32 +complaining 32 +beirut 4 +data-storing 32 +junji 4 +transcripts 32 +depleting 32 +hirshhorn 2 +dillon 4 +journal 36 +rewarded 32 +acquiring 32 +starters 32 +price-depressing 32 +face-saving 32 +belmar 4 +first-year 32 +skull 4 +uneconomic 32 +boise 4 +guittard 4 +puff 32 +generic 38 +mich.-based 4 +maturity 32 +thwart 36 +candor 32 +drill 32 +johnson 14 +milkshakes 32 +huge 32 +bomber 32 +employee-compensation 32 +sink 32 +domestic 42 +sine 32 +sunnyvale 12 +sing 32 +bradley 12 +steaks 32 +fernand 8 +cocktails 4 +english 4 +ramps 32 +blamed 32 +lagging 32 +pitfalls 44 +risk-free 32 +papers 36 +resentful 32 +mirrored 32 +hiccups 32 +aquatic 32 +poison 32 +bound 32 +dreadful 32 +chip 100 +intourist 4 +hennessy 8 +expecting 32 +governs 32 +decorating 32 +wielded 32 +jaguar 4 +prospectus 32 +guarded 32 +obligation 96 +balloting 32 +guilty 44 +orthodox 32 +free-market 36 +silliness 32 +convince 32 +deal 36 +insecurity 32 +arguing 32 +historians 32 +rejuvenate 32 +mitsuko 4 +solomon 12 +mlp 8 +vacation 32 +decatur 2 +shoddy 32 +cordials 32 +deduction 32 +attraction 32 +towbin 12 +uac 4 +causing 32 +engagement 32 +ual 14 +definite 36 +democratic 38 +dominant 32 +uaw 4 +coal-mining 32 +presidents 100 +good-sized 32 +erasable 32 +themes 32 +kristol 12 +head 100 +kastenmeier 12 +davao 4 +girls 32 +pfizer 14 +resting 32 +trademark 32 +coates 8 +fujitsu 6 +laments 32 +kicker 32 +pahn-ish 4 +revelations 32 +pain 32 +frequents 32 +thematic 32 +genital 32 +emmett 8 +castro 4 +seeks 44 +observers 32 +tmc 8 +disenchantment 32 +coated 32 +nerd 32 +pursue 32 +loyalties 32 +american-made 4 +pre-tax 36 +understanding 36 +nero 6 +oil-pipeline 32 +blocking 32 +burlingame 4 +financial 108 +plutonium 32 +research-and-development 32 +tenders 2 +constanza 4 +sprang 32 +dipped 32 +streets 32 +nielsen 14 +pardon 32 +debut 32 +good-faith 32 +charts 32 +rudder 32 +pearce 4 +record-setting 32 +weighs 44 +campbell 6 +hmc 4 +forecasts 32 +locked 32 +paperback 32 +ekman 12 +suspect 32 +heinrich 4 +plaintiff 32 +briefing 32 +snowplows 32 +solidify 32 +vote-getter 32 +leaping 32 +mickey 4 +relaxation 32 +forte 32 +california-based 4 +information-service 32 +interrelated 32 +brains 32 +meanings 4 +decrane 8 +pollard 4 +sanctioned 32 +plotted 32 +steel-fabricating 32 +front-page 32 +jammed 32 +myriad 32 +shirley 4 +mass-production 32 +tattered 32 +tutu 4 +exporters 32 +reflects 32 +stave 32 +hurts 32 +regretted 32 +apathetic 32 +characters 32 +struggled 32 +origins 32 +von 32 +booster 32 +psycho-killer 32 +corresponding 32 +future 36 +intimidates 32 +banker 100 +capriccio 4 +restoring 32 +unidentified 32 +futuro 4 +coopers 12 +shicoff 4 +council 44 +fiduciary 32 +two-foot-long 32 +gazette 4 +therein 32 +impending 32 +withdrew 96 +sitcom 32 +salvador 4 +cooped 32 +bean 4 +lufkin 4 +gyohten 4 +tungstic 32 +beef 32 +pausing 2 +largest-ever 32 +dimon 4 +sporkin 12 +pandair 4 +sumitomo-clan 4 +middle 36 +sample 32 +performing 32 +correspondence 32 +salovaara 4 +capitol 4 +geared 32 +winners 40 +mike 14 +proprietors 32 +evacuation 32 +couponing 32 +waterflood 32 +forays 32 +basketball 38 +rajavi 4 +publicly 32 +kennedy 12 +convex 4 +pullback 32 +showboat 14 +convey 32 +racquets-master 32 +pipelines 4 +firsts 4 +ritterbusch 4 +treatment 32 +blonds 36 +lead 38 +mccullagh 4 +almost 98 +risked 32 +labeled 32 +served 32 +bluechip 32 +mixed 38 +blonde 36 +fairly 32 +bevy 32 +bahia 4 +earliest 32 +bees 32 +nonsense 32 +hme 8 +stay-over 32 +infusions 32 +yaroslavl 4 +martyred 32 +zoning 36 +cursory 32 +chrysler 14 +distinctions 32 +pcar 4 +breeze 4 +kilburn 8 +televisa 4 +orleans-based 4 +checked 32 +hierarchy 32 +msl 6 +repertory 36 +regalia 32 +church 46 +remarkably 32 +illustrates 32 +ixiz 4 +first-quarter 32 +nuts 32 +once-incurable 32 +zwyer 4 +puzzle 32 +virologist 32 +equitypurchase 32 +notable 40 +unless 34 +four-story-tall 32 +fezzes 32 +illustrated 32 +souvenir 32 +regarding 32 +subways 36 +magnetic 32 +chikane 12 +lights 32 +showering 32 +reimpose 36 +lionel 14 +one-upmanship 32 +viral 32 +patchwork 4 +era 32 +upshot 32 +lincoln-mercury 8 +wines 32 +armenian 4 +positions 44 +mcnealy 12 +hostility 32 +morrison-knudsen 8 +banjo 32 +room 36 +rent 32 +roof 32 +mccrk 4 +gluts 32 +walnut-sized 32 +embarrassed 32 +worse 32 +debt-ridden 32 +razor-sharp 32 +balanchine 4 +diagnostic 32 +certfs 8 +nihon 4 +seriously 32 +gotten 32 +rolla 4 +suzanne 4 +introductions 32 +tow 4 +dishwater-dingy 32 +replow 32 +top 38 +rouse 32 +bargain-basement 32 +toy 36 +output 46 +theme-park 32 +uphold 32 +partnership 100 +except 32 +arrows 32 +cartoon 32 +oust 32 +breakdowns 32 +tom 4 +btr 2 +too 38 +ton 32 +tulsa 12 +televised 32 +societies 32 +rex 4 +canon 14 +promotions 34 +spread 32 +minicomputer 32 +non-petroleum 32 +coincide 32 +lemgruber 12 +soared 36 +indictments 32 +leaflets 32 +e.m. 4 +theaters 32 +edwin 6 +limiting 32 +orlando 12 +tampering 32 +creatures 32 +carceres 4 +tertiary 32 +induces 32 +procurement 36 +amortizing 32 +haven 36 +honorable 32 +turned 32 +beard 32 +beare 8 +mtbe 4 +additionally 2 +turner 14 +unlimited 32 +reform-minded 32 +pre-aids 32 +grossly 32 +conceivable 32 +drebsky 4 +worst 32 +claptrap 32 +dausch 8 +bears 36 +corrections 12 +chasing 4 +romualdez 4 +suna 8 +difficult-to-collect 32 +channels 32 +claims 36 +sung 32 +suny 4 +asks 52 +foresee 32 +jacket 32 +ropk 4 +fearing 32 +farmer-borrower 32 +meditation 32 +sunw 4 +chautauqua 4 +gimmickry 32 +lying 32 +attempt 36 +extend 32 +dart 36 +age-old 32 +strips 32 +round 40 +schmedel 8 +extent 32 +confusion 36 +mobex 12 +jolla 4 +attested 32 +beer 100 +leaf 32 +abandoned 96 +calvin 4 +scaled 32 +hart 2 +allegheny 14 +farris 12 +retaliate 32 +weeping 36 +outrage 32 +toys 36 +colonialists 32 +cite 32 +after-tax 32 +paul 14 +oversize 32 +installation 32 +hard 36 +intimate 36 +embodying 32 +brill 4 +gloss 32 +harm 32 +intimidation 32 +confirms 32 +lent 32 +laundry 32 +easley 4 +calm 32 +recoupment 32 +arrington 12 +censure 34 +otc 12 +cx 4 +exact 32 +premiere 32 +rocked 32 +mail-order 32 +giraffe 32 +shadow 32 +delight 32 +tie-ins 32 +high-class 4 +government-appointed 32 +abraham 14 +cohen 12 +tarnow 2 +four-week 32 +specify 32 +gangster-filled 32 +ethic 32 +expulsion 32 +earlier 106 +novices 32 +baird 12 +inert 32 +delivery 32 +a.d. 4 +overlap 32 +delivers 32 +infusion 36 +hooking 32 +uncompleted 32 +cherbourg 4 +birthday 36 +revealed 32 +ko 4 +laser-related 32 +philadelphia 12 +sinking 32 +inch 32 +strippers 2 +compelling 32 +participant 32 +asthma 36 +jumped 96 +discharged 32 +snap 32 +alfb 4 +rob 32 +mckeon 8 +advantage 32 +berendt 12 +disappeared 32 +judgment 44 +worsening 104 +stalled 32 +assails 4 +filing 38 +cyclosporine-a 32 +selikoff 12 +affiliates-led 4 +rehash 32 +stepchild 32 +mob 36 +vanunu 12 +anti-ballet 32 +america 12 +spreads 36 +borscht 4 +witness 40 +giant 32 +keeps 32 +globe-trotting 32 +barge 32 +vigorously 32 +token 32 +preferential 32 +festival 36 +imprisonment 32 +chv 12 +fixings 32 +albright 4 +lugar 4 +shugart 4 +cruikshank 4 +operator 32 +three-point 32 +cutbacks 36 +manage 32 +woman 36 +spot-market 32 +recuse 32 +non-competitive 32 +churchillian 4 +safer 32 +laboratories 36 +rents 32 +unending 32 +mozart 4 +contradicted 32 +unhealthy 32 +assault 32 +crisp 32 +pasts 32 +medication 32 +petty 32 +skunk 32 +swaggering 32 +beige 32 +barrett 12 +drink 32 +rebate 32 +fulfilling 32 +williams 12 +gasoline-tax 32 +prejudices 32 +unhappily 32 +dimwitted 32 +float 32 +oceanographic 32 +overstate 36 +charlene 2 +democracies 32 +brain 32 +seelig 12 +insurgent 32 +convene 32 +undeniably 32 +enough 32 +willoughby 4 +putting 32 +psychiatrist 36 +aberrational 32 +data-networking 32 +douglas 12 +cigna 14 +sexual 32 +mon 14 +god 36 +aggregates 32 +dpac 8 +fazio 4 +characteristic 32 +falter 32 +tristesse 4 +acknowledged 36 +phase 32 +arrive 32 +cautions 32 +gop 4 +fredric 6 +realizing 32 +got 100 +covers 32 +ladies 4 +altitudes 32 +abides 32 +toronto-dominion 10 +image-tarnishing 32 +variant 32 +retard 32 +own 36 +thrive 32 +toying 4 +corrected 32 +acknowledge 32 +evenhanded 32 +shiite 6 +lou 4 +lot 32 +low 46 +facade 32 +los 46 +quarter-to-quarter 32 +chilling 32 +marvelous 32 +dresher 12 +acli 14 +bly 12 +citibank 4 +homes 100 +mounting 32 +winans 4 +centers 36 +glugging 32 +resulting 32 +inferior 32 +producers 102 +axxx 4 +startups 32 +sequent 4 +heavily 32 +viratek 4 +janney 4 +complied 32 +priorities 32 +growth-oriented 32 +empowered 32 +manifested 32 +misapplying 32 +locally 32 +distant 32 +panel 36 +episode 32 +admits 32 +wedding 32 +henri 4 +lines-western 4 +mack 12 +shouting 34 +disease 36 +rationalize 32 +laurence 6 +wrapped 32 +watching 32 +pedersen 8 +postponement 32 +narrows 36 +bely 4 +nmk 8 +growing 32 +actor 36 +naming 36 +figures 42 +cyrus 4 +enterprise 36 +freya 6 +greed 36 +purportedly 32 +needed 32 +nash 4 +europeans 4 +anti-ballistic 4 +linking 32 +ghosts 32 +anti-germ 36 +mot 4 +idomeneo 4 +fluke 32 +good-neighbor 32 +enforce 32 +custom-made 32 +supplied 32 +market-research 32 +cft 4 +expressive 32 +wyo 4 +state 110 +marion 4 +commentaries 32 +all-night 32 +glance 36 +cleared 36 +black-white 32 +supplies 36 +supplier 32 +birch 8 +patsy 32 +long-troubled 32 +fanatic 32 +additives 32 +rough-and-tumble 32 +horsepower 32 +dbase 32 +bonn 14 +god-fearing 4 +administration 38 +plc 4 +bond 42 +bone 32 +denis 8 +intermodal 4 +bona 32 +uprisings 32 +cachet 32 +incurred 32 +all-suite 32 +chevalier 36 +robertson 14 +kinds 32 +surprising 32 +membership 96 +shareholder 32 +olcp 8 +mishandled 32 +dicn 8 +trattori 4 +spokeswoman 32 +dollar-holdings 32 +schemes 32 +powerful 32 +exemptions 32 +picking 32 +chip-consuming 32 +withdraw 32 +pepsi 4 +design 36 +reins 32 +favorably 32 +bousquet-cadillac 4 +marrel 4 +office-space 32 +troubles 32 +nivard-flornoy 4 +racquets 34 +hills 36 +wrigley 4 +okay 32 +hsc 8 +automatic-teller 32 +coal-related 2 +soft-drink 96 +favorable 32 +bookshelf 4 +moines-based 4 +preference 32 +professor 32 +companywide 32 +lieutenant 32 +high-technology 32 +recess 32 +insolvent 32 +lpx 8 +sifting 32 +client 32 +miracle 32 +tendered 32 +tele-communications 14 +igc 12 +holt 8 +shindell 12 +restructure 32 +entitle 32 +agreements 32 +sailing 32 +imnx 8 +tournament 32 +u.s.a. 4 +differs 32 +gillespie 12 +j 14 +retained 32 +wright 4 +responsibility 36 +prosecuting 32 +words 32 +script 32 +remnant 32 +amiable 32 +machine-style 32 +ruined 32 +tank 32 +vanity 4 +euromarket 4 +kolb 8 +chaparral 4 +account 36 +attired 32 +dating 32 +explosions 32 +phases 32 +courage 32 +folk 32 +swap 44 +japanese-made 4 +retiring 32 +spectra-physics 14 +aligned 32 +aftermath 32 +sway 32 +michigan 14 +faith 32 +spokesman 96 +ounces 32 +perturbations 32 +burning 32 +tefra 4 +data-reading 32 +dozens 34 +chronologies 32 +york-based 4 +u.s.-japan 4 +deteriorates 32 +cease-fire 32 +sluggishly 32 +ire 32 +financal 32 +appliances 36 +satellite 36 +solis 4 +excursions 4 +financial-district 32 +goldfeder 12 +porsche 2 +chengbei 4 +jim 6 +fireworks 2 +texas-based 4 +pelf 32 +solid 32 +unsavory-looking 32 +carolinians 2 +explaining 32 +rome 12 +maggie 4 +heights 36 +servicer 32 +scary 32 +adolfo 6 +absolute 36 +claiming 96 +coordinator 32 +prophecy 4 +monolithic 4 +payroll 32 +civil-rights 32 +heed 32 +classrooms 32 +brezhnev 4 +scare 32 +solidarity 4 +contradiction 32 +reviewed 32 +irs 12 +struggle 36 +punta 14 +opec 4 +compelled 32 +miyazawa 4 +opel 6 +open 36 +backless 32 +rostov 4 +airlift 36 +games 100 +domination 64 +impediment 32 +poor-quality 32 +sneaking 32 +sessions 32 +delegations 32 +confides 32 +atoned 32 +pryor 4 +overcharged 32 +unprecedented 32 +particle 32 +kits 32 +edits 32 +daunting 32 +mendoza 4 +distance 32 +majestic 34 +overcharges 32 +likable 32 +wiped 32 +unterberg 4 +cast 32 +trucks 36 +broaden 32 +segue 32 +cleveland 12 +pricing 36 +rochelle 4 +saia 12 +said 126 +broader 34 +affecting 32 +hearings 32 +setup 32 +shaped 32 +planting 32 +operation 36 +lighter 32 +bournonville 4 +sinatra 4 +casy 8 +bitter 32 +combing 32 +potentially 32 +stations 100 +deeper 32 +percentage 34 +greeks 4 +arrogant 32 +stimulate 32 +steinberg 4 +blinder 14 +diversification 32 +lescaze 4 +cihlar 4 +anti-hypertensive 32 +kram 4 +guy 32 +broker 40 +libor 4 +stark 4 +articulate 32 +kalamazoo 8 +buses 32 +prevention 36 +moroccans 4 +microsemi 2 +treasurys 10 +bold 32 +money-losing 32 +gauge 32 +emerald 4 +landfills 32 +start 36 +bused 32 +unproved 32 +stars 36 +broken 32 +bearable 32 +anew 32 +followed 96 +carried 32 +hurting 32 +facts 36 +pepsico 14 +poems 32 +case 36 +pushing 42 +wonderfully 32 +sues 68 +repealing 32 +isolation 32 +ethylene 32 +zealand-based 4 +dimmed 32 +facto 32 +fete 32 +bragged 32 +agsi 8 +defer 32 +walt 12 +scrambled 32 +pins 4 +include 32 +haunted 32 +predator 32 +output-based 32 +baltimore 12 +pine 4 +navistar 4 +world 46 +scotch 4 +well-advised 32 +positively 32 +defying 32 +bade 32 +employed 32 +employee 32 +revised 36 +herrera 8 +stephen 14 +discontinue 32 +arie 4 +arid 32 +aria 32 +forbids 32 +psychology 32 +romans 4 +employer 34 +stance 36 +monthly 32 +stanch 32 +munich 4 +killian 8 +maps 36 +uncertainties 32 +divertimento 4 +ran 96 +shelling 32 +gin 32 +idol 32 +oil-services 32 +limousine 4 +decadent 32 +lambro 12 +hour 32 +noxious 32 +door-to-door 36 +gypsies 32 +lynford 12 +underdog 32 +jams 32 +processors 32 +bankshares 4 +matsushita 4 +berkeley 4 +detriment 32 +implicating 32 +adjustable-rate 32 +more-favorable 32 +padding 32 +lantern-lit 32 +rockingham 4 +continual 32 +compared 42 +inside-trading 8 +oklahoma 12 +broadcasters 38 +sponges 32 +families 32 +merchants 36 +lymph 32 +section 32 +compares 32 +nevada 12 +sng 8 +oil-service 32 +qatar 4 +world-class 32 +guidelines 32 +blue-ribbon 32 +bechar 4 +lease-purchase 32 +retroactive 32 +storybook 32 +weekends 32 +adjourned 32 +shields 12 +levy 44 +scapegoat 32 +plodding 32 +falsity 32 +automatic 36 +taxpayer 32 +uspci 14 +outlets 32 +unavoidable 32 +cjn 4 +bloodless 32 +milllion 32 +seem 32 +seen 36 +hidden 36 +interfere 32 +administrator 32 +seed 32 +crashed 32 +leukemia 4 +misdeeds 32 +indispensable 32 +thwarts 32 +birnbaum 8 +sees 100 +clerical 32 +aloft 32 +catherine 4 +now-legendary 32 +bolstered 32 +intend 32 +york-new 4 +columbus 12 +fibrous 32 +long-running 32 +lammermoor 4 +two-pronged 32 +intent 32 +w.c. 4 +phones 32 +caucasus 4 +regards 32 +brad 4 +cost-reduction 32 +mikhail 4 +steal 32 +oechslin 12 +ibew 4 +bandag 2 +boosts 44 +buffer 32 +cantor 4 +animal 32 +monitors 32 +auto-parts 32 +canton 4 +sanity 32 +vaal 4 +whoever 2 +written 34 +stormy 36 +reconstituted 32 +scullion 12 +fraternity 32 +skids 32 +chip-industry 32 +elsewhere 32 +backers 32 +civilians 32 +allentown 4 +epa 4 +harold 12 +rabbi 32 +rocket 32 +foursquare 32 +hi-bred 4 +appreciated 32 +snapping 32 +epi 8 +colors 32 +pellet 32 +distinction 32 +proposals 38 +doubt 32 +end-use 32 +kid 32 +asia/ 4 +fourth-largest 32 +groove 32 +bidders 34 +overaged 32 +cutback 32 +reliable 34 +abiding 32 +suggesting 32 +embracing 32 +columns 32 +opossms 4 +audacious 32 +marsam 8 +deals 36 +jackson 12 +denials 32 +diners 36 +endgame 32 +alley 36 +smugglers 32 +diagnose 32 +hitters 32 +modifier 32 +available 32 +reliably 32 +anchors 32 +jefferson 8 +matt 4 +students 46 +dan 14 +shape-memory 32 +dal 4 +plight 32 +inevitable 32 +playoffs 32 +liquid-yield 32 +mate 36 +day 36 +nemesis 32 +hindered 32 +alfonso 4 +medical-insurance 32 +off-brand 32 +continuing 34 +alfonse 2 +licensing 32 +forever 32 +spices 32 +blue-collar 32 +atoka 4 +spreading 32 +dumping 34 +persuading 32 +waynesboro 4 +faculty 32 +pasztor 4 +subversion 32 +niggers 32 +cried 32 +chronic 32 +waved 32 +fliers 34 +yawn 32 +understood 32 +barksdale 4 +workers 102 +city-sponsored 32 +hamadei 4 +donned 32 +dealing 32 +provoked 32 +corporate-bureaucracy 32 +recalculating 32 +london 14 +chemical-analysis 32 +fanny 4 +englewood 12 +advancement 32 +passes 32 +donald 6 +await 36 +scurrying 32 +charge-offs 64 +volkswagen 14 +violently 32 +suppliers 96 +bkn 8 +court-appointed 32 +prices 102 +bisporus 32 +commerce 36 +militia 32 +trigger 32 +olivetti-made 4 +creditor 40 +sands 4 +warmth 32 +breach 32 +falls 36 +curling 32 +natural 44 +knowlton 12 +markets 110 +wide 32 +aids-information 4 +quebecor 6 +prohibits 32 +distorts 32 +inherent 32 +task 40 +incarnated 32 +announce 32 +surcharge 32 +graham 14 +violations 32 +kawanishi 4 +responded 32 +johnny 4 +alexandra 4 +unlv 6 +propaganda 32 +dark-haired 36 +bandwagon 32 +storage 32 +akshay 2 +hes 8 +hafez 4 +gatt 4 +sale-leasebacks 32 +ky. 4 +pressure 100 +rereading 8 +chevron 14 +prohibitions 32 +broker-dealer 36 +ex-cell-o 4 +hypertension 32 +virazole-against-aids 4 +colombian 4 +sacrifices 32 +neighboring 32 +reporterof 4 +arts 36 +emigres 32 +n.c. 4 +politeness 32 +varsity 32 +csfb 4 +preserved 32 +macroeconomic 32 +capitalization 32 +treatable 32 +unions 34 +symphony 4 +ill-informed 32 +realigns 8 +technique 32 +ancient 32 +joke 32 +painless 32 +fermenta 14 +error 36 +pincham 4 +shabby 32 +touting 32 +worsens 32 +statements 32 +ship 36 +cumbersome 32 +hilford 4 +ditches 32 +audio-video 34 +cheek 12 +trim 32 +stored 32 +cameramen 32 +wojciech 8 +trip 36 +inappropriately 32 +lowest 36 +leap 32 +e.l. 4 +hong 12 +extension 36 +reuben 2 +medicare 4 +pakistan 6 +fatal 32 +restless 32 +injured 32 +bantam 4 +integration 32 +lawrenceville 8 +talc 32 +temporary 32 +missing 40 +stamina 32 +talk 38 +reflected 32 +awry 32 +tall 32 +kathleen 4 +asthmatic 32 +saturday 4 +indefinitely 32 +indiana 4 +measurement 32 +when-issued 32 +petro-canada 4 +certificate 32 +rowdiness 32 +breaking 34 +technology 110 +reregulation 32 +bettner 4 +glacial 32 +searched 32 +mercoil 4 +peres 12 +brenton 4 +textbook 32 +grossman 12 +irreverence 32 +interpreters 32 +triboro 4 +scrutinizing 32 +d-rams 4 +munin 8 +pushed 96 +correctional 6 +minorities 32 +wagon 32 +abolished 32 +offer 44 +slowing 32 +joe 14 +colts 4 +admissions 32 +stanger 8 +effect 36 +symbolic 32 +croons 32 +wanting 32 +inducing 32 +mentioned 32 +spun 96 +predated 32 +commanding 32 +honestly 32 +plausibly 32 +merger-defense 32 +virginia 12 +jump 36 +quoting 32 +disturbing 32 +no-win 32 +crime 36 +whisper 32 +caesarean-section 4 +malaysia 4 +va. 4 +floor 32 +important 32 +control 44 +nobel 4 +tre 4 +elephants 32 +screenplay 32 +trn 4 +tro 4 +rafael 4 +unmanageable 32 +translate 32 +wash. 4 +debt-to-capital 32 +trw 4 +flood 32 +atorino 4 +tariffs 36 +try 42 +borger 4 +overseas 102 +steer 32 +steep 32 +personal-injury 32 +reversing 32 +samples 32 +bureaucratic 32 +brahms 4 +astronautics 4 +dual-purpose 32 +baylor 4 +equicor 2 +curfew 96 +heroine 32 +republic 46 +immunology 36 +jeyaretnam 12 +redwood 4 +steel 46 +finish 32 +lab 32 +auctioned 32 +hair-trigger 32 +ledgard 4 +b.v. 4 +quarter 100 +parties 36 +exclude 32 +nutrasweet 14 +itself 36 +p&l 4 +liberals 32 +las 14 +originated 64 +tehran 6 +law 108 +tremolite 32 +lau 4 +solicitousness 32 +topics 32 +lay 36 +blinders 32 +mugged 4 +deserves 32 +coach 36 +mechanics 32 +inconsistent 32 +goodyear 14 +outperforming 32 +cafe 36 +interpretive 32 +spot 36 +materials 100 +minister 36 +jubilant 32 +personal-care 32 +regard 32 +chrysanthemum 32 +goodwill 32 +aspiration 32 +usda 4 +instinctively 32 +hillsborough 4 +anti-takeover 44 +hanson 8 +blistering 32 +extended 100 +presides 32 +process 32 +ancestors 32 +voted 36 +amfac 6 +october 4 +complete 32 +distributed 32 +evolutionary 32 +fresher 32 +transferable 32 +delfim 4 +votes 32 +nestle 2 +flight 32 +presided 32 +thurs 10 +viewed 36 +zweig 8 +close-out 32 +shakespeare 4 +column 32 +weary-looking 32 +complained 32 +factor 32 +outweigh 32 +buffeted 32 +slithering 32 +pollution 36 +fisheries 32 +much-needed 32 +cumulative 32 +rose-colored 32 +thrusts 32 +eaux 4 +rhr 8 +impairing 2 +smart 36 +giorgio 4 +aer 4 +aes 12 +r-word 4 +permanently 32 +latin 6 +governor 32 +cable-television 32 +resplendent 32 +twentieth 4 +assessments 32 +ragbag 32 +hispanics 4 +monitoring 32 +accreditation 32 +macdonald 12 +suspension 32 +assailed 32 +observation 32 +roller-coaster 32 +unintended 32 +affected 96 +grants 32 +deprosse 4 +iraqi 6 +aegis 4 +shortened 32 +wingding 32 +harsco 12 +hullabaloo 32 +crying 34 +data-communications 32 +mobil 4 +instant-camera 32 +egg 32 +auroras 4 +vcc.a 4 +worrell 12 +coldwell 4 +transmutes 32 +obstacles 36 +rebuild 32 +jan. 14 +mutual 46 +political-science 32 +broader-based 32 +comsat 8 +dickson 4 +triple-b 32 +setback 40 +flick 4 +period-vaulting 32 +rebuilt 32 +buybacks 8 +store 36 +maneuvering 32 +ala. 4 +plots 32 +unattractive 96 +science 36 +sound 36 +digital 36 +capsule 32 +greensburg 4 +overload 32 +overall 34 +curbs 36 +excuses 32 +depository 32 +virgin 4 +racing 32 +olivetti 12 +walkout 32 +brake 32 +cruzado 36 +nasdaq 4 +servicing 32 +barely 32 +mainframe 32 +dull 36 +swarthy 32 +excused 32 +excited 40 +trap 32 +winter 46 +growers 32 +alas 2 +completing 32 +export-guarantee 32 +immunity 32 +disarmed 32 +nixon 4 +proclaiming 32 +t 12 +jane 4 +warehouse 32 +sharply 34 +splits 32 +sideline 32 +technologies 44 +expects 108 +tate 4 +bureaucracies 32 +reverence 32 +waller 4 +launching 32 +black-lung 32 +advocated 32 +gather 32 +punch 4 +dawn 32 +apprehension 32 +leases 32 +belong 32 +fewer 34 +reps. 6 +nonbank 32 +vacated 32 +potty 4 +tagamet 6 +allies 96 +accurately 32 +tempestuous 32 +unsuccessfully 32 +undergone 32 +strangers 32 +height 32 +boyd 12 +fiscal 44 +lbr 4 +gideon 4 +election 36 +delay 36 +deliver 32 +filings 36 +alums 32 +self-defeating 32 +entertainment 36 +bottle 32 +maseng 4 +hillsman 4 +arbitragers 34 +hugely 32 +declining 36 +synthetic 32 +classicism 32 +preceding 32 +informal 32 +tourist 32 +trips 32 +piecuch 8 +a-2 4 +occur 32 +a-1 4 +mcclelland 4 +eighth 4 +ritter 4 +thimbleful 32 +activism 32 +dennis 6 +resemble 32 +credits 32 +a-% 32 +demento 8 +strauss 4 +termination 32 +terrorists 32 +raider 32 +rejection 32 +repressed 32 +crownx 4 +conceptually 32 +contracts 36 +observe 32 +risen 36 +strategist 32 +photographer 32 +fiscal-year 34 +rodents 4 +video-disk 32 +renomination 36 +feelings 36 +pre-reform 32 +prints 36 +wnews 12 +osaka 4 +transferred 32 +turning 32 +bible 4 +wives 32 +undersecretary 32 +restoration 32 +promoted 32 +outlaw 32 +feel 36 +bombing 32 +roanoke 12 +choices 32 +lovett 8 +schoolmasters 32 +newcomers 32 +oil-field 32 +clandestine 32 +addict 32 +with 110 +existed 32 +audrey 4 +interpretation 32 +unqualified 32 +incidents 32 +jayne 2 +portasol 4 +late-night 32 +bite 32 +mice 36 +there 46 +museum 36 +equities 36 +weighing 32 +nhy 8 +concord 4 +kogod 4 +bits 32 +benedetti 4 +blacklisted 32 +militants 32 +replica 32 +methodist 4 +excite 32 +declined 104 +diamond 14 +top-of-the-line 32 +oral 32 +allay 32 +storer 4 +stores 36 +declines 36 +smorgasboard 32 +romanticism 32 +whopping 32 +s&l 4 +machines 36 +allan 4 +asher 4 +full-year 38 +undeveloped 32 +statistical 38 +terribly 32 +storyteller 32 +deploying 32 +gci 4 +meet 36 +zipping 32 +gravely 44 +tide 32 +recruits 32 +genetic 36 +powers 32 +dravidians 4 +focused 32 +shlaes 4 +abelson 4 +swathed 32 +hard-pressed 32 +terrible 32 +brigade 32 +ripe 32 +pik 4 +drug 102 +six-week 32 +d. 4 +toured 32 +pie 12 +included 32 +productive 32 +brokerages 36 +intelligent 32 +slower-than-expected 32 +impossible 32 +intervention 32 +fuzzy 32 +johnston 12 +kiwi 4 +servants 32 +small-parcel 32 +pit 32 +cowboys 4 +transformation 32 +ronald 6 +contribute 32 +ample 32 +impaired 32 +stood 32 +portec 8 +ico 4 +kureishi 4 +phoenix 14 +discerning 32 +long-lived 32 +kirby 4 +artists 36 +noise 32 +suspend 96 +gouging 32 +operating 46 +bancshares 4 +hairline 32 +contractionary 32 +amply 32 +marketings 32 +herbert 2 +fatality 32 +tried 96 +dj 4 +mixture 32 +gray 46 +carlos 4 +byswi 4 +modified 32 +interfaith 4 +capable 32 +dd 8 +pole 32 +wallach 4 +gran 4 +astonishes 32 +tries 32 +bonds 110 +pulmonary 32 +patronizing 32 +slow 32 +grab 32 +contractual 32 +slot 8 +exercise 32 +tidy 32 +trash-collection 32 +meleiha 4 +three-lane 32 +monitored 32 +blas 4 +excuse 32 +cushion 32 +unicorp 12 +rogue 32 +pathetic 32 +criminally 32 +norway 14 +lurking 32 +heitzeberg 4 +specialty 96 +adjustment 32 +mission 38 +batterymarch 6 +extrapolation 32 +lara 12 +tempted 32 +deputy 38 +meals 32 +reverse 40 +raises 36 +posner 12 +encounter 32 +curtis 12 +sanctuary 32 +champion 44 +demanded 32 +washingtonians 4 +underwood 12 +perkins 4 +scene 32 +emotional 32 +salesman 32 +angola 4 +antitrust 32 +sears 4 +laughing 32 +interiors 4 +vinnell 4 +givebacks 32 +non-canadians 32 +fading 36 +rounded 32 +newport 4 +invented 32 +diplomatic 32 +rituals 32 +reilly 4 +clda 8 +absenteeism 32 +periodically 32 +herself 32 +works 44 +surface 32 +betsy 4 +realistically 36 +abm 4 +rainier 6 +heavy-truck 32 +raiding 32 +hoop 32 +broadening 32 +engaging 32 +luders 12 +believe 34 +pharmacists 32 +arising 32 +misconduct 32 +unexpectedly 32 +binns 4 +hood 32 +vanilla 32 +darling 32 +metzenbaum 4 +gaynors 4 +going-away 32 +centerior 4 +distributions 32 +disable 32 +acreage 32 +rca 12 +demonstrated 32 +counties 32 +suburbs 32 +sloan-kettering 4 +self-deprecating 32 +escorted 32 +upjohn 14 +ph.d. 4 +progression 32 +recipe 32 +hamburg 4 +painters 32 +vegetables 32 +skittish 32 +altmann 4 +coerce 32 +asbestos-lawsuit 32 +anti-terrorist 32 +ended 36 +license-renewal 32 +obvious 32 +sought-after 32 +information-swapping 32 +commits 32 +beset 36 +chernobyl 4 +chiam 4 +plunder 32 +terzi 12 +hates 32 +ex-chairman 40 +override 32 +third-country 32 +standardization 32 +revamping 40 +georg 4 +suits 38 +expressiveness 32 +mchenry 8 +tuition 32 +bridal 32 +stunned 32 +situations 32 +foxboro 8 +snake 36 +incantations 32 +torrance 4 +term 32 +diarrhea 32 +fisher-price 4 +reciprocity 32 +clayton 4 +sickened 32 +conditional 32 +difficulty 32 +youngest 32 +manipulative 32 +clamor 32 +opposition 38 +nutty 32 +biography 32 +anaylsts 32 +operations 102 +conventional 32 +spc 4 +torture 32 +black-cowboy 32 +duplicating 32 +sodium 32 +overhang 32 +soft 38 +occurs 32 +soviet-bloc 4 +jobs 36 +harshly 32 +instead 106 +susceptible 32 +authority 36 +spy 36 +loss-ridden 32 +reseve 4 +ataturk 4 +amortization 32 +globo 4 +bloc 36 +afforded 32 +nicolas 6 +propelled 32 +marching 32 +inside 34 +knocking 32 +meticulously 32 +tax-increase 32 +skies 32 +wall 46 +incorrectly 32 +incarcerated 32 +homosexuality 32 +truman 2 +buoyant 32 +consortium 100 +propeller 32 +over-represented 32 +tamanrasset 8 +provides 32 +illusions 32 +aghast 32 +luff 32 +demjanjuk 6 +deteriorating 32 +debates 32 +bernado 4 +class-action 32 +vision 32 +provided 96 +rozelle 12 +tears 36 +fredericks 8 +mystifies 32 +depriving 32 +superlatives 32 +madison 4 +architecture 32 +weyerhaeuser 12 +exploit 32 +ct. 4 +approves 44 +parksigns 4 +drives 36 +invoking 32 +maclaine 4 +hogwash 32 +t.cdc 8 +air-conditioner 32 +spruce-pine-fir 32 +newest 32 +convenience 32 +approved 36 +aspidistra 32 +signature 36 +six-month 32 +cos. 4 +valet 32 +idaho 4 +mesopotamian 4 +mca 6 +formation 32 +excess 34 +courier 32 +pearl 4 +outdoor 32 +drawing 32 +libyan 4 +intended 100 +goes 32 +nyse 4 +confront 32 +writers 32 +satin 32 +dump 32 +zodiac 4 +scramble 4 +diminishing 32 +plain-talking 32 +wearying 2 +director 102 +crew 32 +gandhi 4 +forward-looking 32 +mushrooms 36 +w-4s 4 +inventory 42 +researchers 42 +enthusiasm 36 +instructed 32 +cref 14 +counterlogic 32 +youngsters 32 +pectorals 32 +memoirs 4 +fsia 4 +reception 32 +oil-well 32 +ranges 32 +gng 4 +flies 32 +example 32 +bombshell 4 +telectronics 6 +bullishness 32 +keenly 32 +centered 32 +ranged 32 +security 46 +acquired 100 +spurred 32 +dardi 4 +responding 34 +tightrope 32 +stan 4 +cmb 8 +bennett 8 +eliminating 32 +stay 36 +specials 32 +bowie 4 +satans 4 +wellsford 4 +disposes 32 +envy 32 +star 36 +props 32 +wgr-am 4 +centuries 32 +workplace 32 +facing 32 +bankruptcy 44 +generous 32 +erode 32 +priori 32 +stallions 32 +birdwell 12 +figured 32 +special 46 +feelingly 32 +grades 36 +specialize 32 +payload 32 +strain 36 +repeating 32 +tickers 32 +stage-dominating 32 +unspectacularly 32 +prd 8 +subservient 32 +sigma 4 +self-imposed 32 +nail-painting 32 +legendary 32 +hoods 32 +concentrate 32 +caspar 4 +finanziaria 8 +somewhere 44 +exceeds 32 +economical 32 +grieveson 4 +mckay 12 +vehicle 32 +donors 38 +refaat 4 +earthly 32 +surveys 34 +canceled 32 +devastatingly 32 +forging 32 +hardship 32 +turkey 38 +fnd 4 +benjamin 4 +chiba 4 +zim 8 +reassigned 32 +iranian 4 +chocolatier 4 +mesmerized 32 +carberry 4 +antigovernment 32 +charnel 32 +cede 36 +dallas 14 +praising 32 +sr. 4 +acquisitive 32 +fragile 32 +crippling 32 +potato 32 +oft-stated 32 +minolta 4 +mcguire 4 +disrupted 32 +g-5 4 +well-qualified 32 +drug-enforcement 32 +prisoners 32 +exchanging 32 +undervalued 32 +rogers 12 +gerson 12 +toning 32 +material-handling 32 +groundwork 36 +edwards 12 +deepen 32 +bankcard 4 +stockbrokerage 32 +understand 32 +francaise 8 +fetch 96 +vietnam 6 +a.a. 4 +low-end 32 +bulky 32 +breadth 32 +srv 8 +sri 4 +harrah 12 +relaxed 32 +nightwatch 4 +crimps 32 +kemp 4 +venture 100 +smell 32 +recruitment 32 +dirac 8 +low-status 32 +custody 32 +shoulder 32 +purpose 36 +terry 4 +precise 40 +manitoba 4 +smooth 32 +fell 100 +harcourt 4 +accessories 32 +gestures 32 +supply-and-demand 32 +tanner 4 +mg. 32 +lobster 32 +felt 32 +today 46 +felv 4 +taras 4 +protege 32 +warnings 32 +company-operated 32 +evening 36 +her 34 +availability 32 +lime 36 +hew 4 +granted 38 +chocolat 4 +pours 32 +nfl 12 +dictionary 32 +hey 36 +hex 12 +concurrently 2 +motoi 2 +hiccup 32 +ischemia 32 +utah 14 +comfortable 32 +hepatitis 32 +detail 32 +evidenced 32 +rosalie 6 +auction 36 +rage 32 +length 32 +hefty 32 +slowness 32 +acquires 44 +promises 32 +bugs 8 +wards 32 +shapes 32 +grenfell 4 +animosity 32 +bobby 12 +report 44 +boat-and-motor 32 +serve 32 +relocating 34 +last-minute 32 +oil-producing 32 +unity 32 +clashes 32 +budgetary 32 +ignited 32 +dependents 32 +caves 32 +indigent 36 +possibilities 32 +borrowed 36 +irregularities 32 +kazakhstan 4 +piecemeal 32 +unfolding 32 +tijuana-san 4 +co-workers 32 +holding-company 32 +pollution-control 32 +rules-enforcing 32 +latchkey 32 +general-interest 32 +nazaire 8 +magnet 32 +marched 32 +perk 32 +retaining 32 +turmoil 32 +roads 32 +two-day 32 +gm 14 +at&t 14 +go 36 +budapest 8 +novelty 32 +gd 4 +ge 14 +andersen 4 +violating 32 +petroles 4 +flew 36 +actuarial 32 +fabian 8 +occasional 32 +poll 32 +gy 8 +dwight 8 +gt 12 +medical-technology 32 +icc 4 +gq 4 +gr 4 +assuage 32 +rembleske 8 +koenig 4 +breed 32 +documentaries 32 +lows 32 +protectionist 32 +now-notorious 32 +celebrating 32 +robberies 32 +refineries 32 +all-time 32 +allegis 4 +planes 32 +decried 32 +jwt 14 +branded 32 +ba-2 4 +planet 32 +forson 8 +prosecutors 32 +beatrice 4 +jugglers 32 +champs 32 +run-up 32 +raiser 32 +links 32 +adapts 4 +drawn-out 32 +confirm 32 +wrecked 32 +torto 4 +electronic 38 +printers 32 +ease 36 +visibly 32 +welex 4 +happened 32 +easy 36 +visible 32 +neglecting 32 +raised 108 +desperately 32 +guess 32 +adversely 32 +east 46 +deferral 32 +globe 36 +carteret 6 +bid-rigging 32 +j.k. 4 +jett 12 +pure 32 +improvise 32 +internal 46 +pura 4 +jets 32 +thereafter 34 +unremitting 32 +paulus 8 +leagues 32 +hazard 32 +low- 32 +faint 32 +mcfarlane 14 +student 36 +means 36 +afoul 32 +garden 44 +miami-based 4 +ram 8 +drawn 32 +rao 8 +meant 36 +de-americanized 32 +consequence 32 +mcginley 4 +ray 4 +elements 32 +danish 14 +seated 32 +nonprofessional 32 +capita 32 +battered 32 +yevgeny 4 +anti-jazz 8 +agencies 32 +raw 32 +experts 34 +takeover-oriented 32 +fictionalized 32 +hailed 32 +nothing 40 +but 126 +bookstore 32 +fweets 32 +nli 8 +continent-wide 32 +five-week 32 +between 34 +zy 4 +painted 32 +mathewson 4 +precipitate 32 +calculations 32 +addington 2 +racial 32 +reich 12 +stockholdings 32 +bus 32 +dumagami 10 +taught 32 +wishful 32 +bumpy 40 +payouts 36 +chocolate-coated 32 +fingerprinted 32 +thwarting 32 +de-germanize 32 +adopting 32 +brannigan 4 +witless 32 +hoak 8 +plunking 32 +modernizes 32 +competitors 34 +fenders 32 +debenture 32 +eight 34 +defendant 32 +knack 32 +spike 14 +pre-graham 32 +mcdonnell 6 +mousetraps 32 +mismanaged 32 +makers 110 +gramm-rudman 4 +pertained 32 +bram 2 +scandals 44 +stock-swap 32 +yell 36 +chamorro 12 +s.c.-based 4 +casinos 44 +representatives 32 +impractical 32 +foreclose 32 +frank 14 +tyger 4 +reporter 36 +grocery 32 +stripes 4 +impulses 32 +frisked 32 +until 38 +lotus 14 +exaggerated 32 +foam 32 +foal 32 +reported 100 +kensington 4 +radiation 32 +structuring 32 +rescheduling 32 +registration 32 +initiating 32 +recognizable 32 +federated 4 +tinker 12 +solicit 4 +eric 4 +kindercare 4 +cushman 4 +voluntarily 32 +marches 32 +willing 32 +defending 32 +libya-style 4 +once-monolithic 32 +broadcast 36 +specious 32 +chandler 8 +forgotten 36 +free-standing 32 +second-ranked 32 +chestnut 32 +visits 32 +advisory 32 +authentic 32 +churns 32 +mood 32 +slowly 40 +insight 32 +truell 4 +string 32 +understandably 32 +associates 38 +solicited 32 +inscrutability 32 +support 116 +dominate 32 +moot 32 +issues 36 +precedes 32 +callous 32 +messel 8 +concrete 32 +understandable 32 +refuge 36 +urban 44 +sell-off 32 +memory 46 +single 32 +either 34 +armon 4 +qualifies 32 +collecting 34 +recommends 32 +hodding 4 +administered 32 +conversions 32 +zeroed 32 +charters 32 +effluent 32 +favorites 32 +netto 4 +cigarettes 36 +tues. 8 +reporters 36 +informally 32 +indicted 44 +obliged 32 +brag 32 +twa 4 +unlike 34 +provisionally 32 +oversold 32 +my 38 +carriers 100 +quadrex 4 +singapore 14 +angrily 32 +taipei 8 +regularly 32 +romeo 4 +owned 32 +atomization 32 +borne 32 +openness 32 +intrauterine 32 +rocks 32 +tahoe 4 +antiprotons 32 +reflecting 40 +oswego 4 +dispense 32 +owner 32 +referred 32 +zimmer 14 +rocky 36 +motivation 32 +year-old 32 +ladder 32 +lear 14 +printer 32 +raise 100 +presentation 32 +excoriating 32 +jed 4 +certified 44 +kudelka 4 +ludwig 4 +nuys 4 +printed 32 +sanguine 32 +beta 32 +aron 10 +manufacturer 32 +manufactures 32 +chocolate-chunk 32 +patent-infringement 32 +franc 32 +microbe 32 +milton 4 +richfield 4 +corrosion 32 +junk-bond 32 +disclose 32 +rohr 14 +pinch 32 +stuck 32 +animal-health 32 +converting 32 +expand 32 +otherwise-anemic 32 +worlds 36 +platoon 4 +more 110 +beneficial 32 +fnbf 8 +auto-buying 32 +adhesives 32 +vignettes 32 +convinced 32 +beats 32 +touchy 32 +definitely 100 +falling 42 +accounts 36 +poorest 32 +david-weill 12 +quondam 32 +siegler 4 +leaning 32 +chefs 32 +inject 32 +category 36 +morris 12 +admitted 32 +white-haired 32 +tweedledee 4 +favors 36 +loosen 32 +maxcell 4 +disability 32 +envoys 32 +attesting 32 +stockbrokers 32 +stares 32 +lasted 32 +toronto 12 +chilly 32 +paine 4 +ardmore 4 +trademarks 32 +hourly 32 +boo-boos 32 +byron 4 +complements 32 +domtar 4 +grounds 32 +stoic 32 +anemia 32 +anemic 32 +empire 32 +credibly 32 +six-year-old 32 +probing 36 +rhodes 4 +meter 32 +otherwise 34 +harney 4 +doulton 4 +supposed 32 +hanisee 12 +loose 32 +disciplined 32 +toxic 32 +pargas 4 +plea 36 +tuxedo 32 +three-year 32 +grimm 12 +actions 32 +special-events 32 +furnished 32 +latch 32 +wfc 8 +discounting 32 +parcel 4 +leftovers 32 +carve 32 +hmo 4 +comparison 32 +furthered 32 +wrko-am 4 +stoltenberg 4 +drugs 32 +majority-owned 32 +sergeants 32 +topic 36 +express 36 +moslem 6 +operators 32 +paraphrase 32 +inner 32 +innes 8 +battle-tested 32 +less-developed 32 +pleased 32 +nominees 32 +occupations 32 +auditorium 36 +bickering 32 +fernley 4 +stock-in-trade 32 +nobodies 32 +reaffirm 32 +millon 4 +splintering 32 +drucker 4 +detected 32 +elaborately 32 +books 44 +completion 34 +catalogued 32 +invests 32 +relays 32 +overpriced 32 +convicted 32 +beseechingly 32 +bukovsky 4 +claremont 12 +belittle 32 +gigolo 4 +asymmetrical 32 +stylish 32 +arkansas 4 +collusion 32 +boller/coates/spadaro 4 +trinity 4 +zoo 32 +optimistic 36 +qualifications 32 +pinpoint 32 +reminds 32 +vendors 32 +dna 4 +transtechnology 14 +sites 36 +in-house 32 +st. 12 +characterize 32 +crisscross 32 +birth 32 +handcuffed 32 +nod 4 +knife 32 +c-123 4 +attacking 32 +prods 32 +sexy 32 +debilitating 32 +speakes 4 +speaker 36 +advancing 32 +lawyer 44 +kilpatrick 8 +carrot 32 +unsung 32 +hoopsters 4 +high-density 32 +public 38 +cedar 8 +communicated 32 +carmine 4 +administrative 32 +idea 32 +overture 36 +apartment-housing 32 +swiss 14 +harrow 4 +indication 32 +ontario 4 +eugene 14 +omit 32 +satiated 32 +bilateral 32 +sto 4 +stk 4 +spite 32 +stockpile 32 +nighttime 32 +beneath 32 +conquered 32 +stb 8 +responsibilities 96 +guaranteeing 32 +glashow 4 +sharks 32 +debt 100 +speeding 32 +hottest 32 +outperformed 32 +bar-hopping 32 +wohl 12 +hardware 36 +glenn 4 +lauding 32 +attrition 32 +software 36 +alert 32 +faction 32 +attached 32 +emr 8 +film 44 +captives 32 +fcc 14 +o-daiko 32 +supporter 32 +sentiments 32 +file 32 +amnesia 32 +slipped 40 +religious 32 +moon 32 +ndco 8 +tax-loss 32 +prejudiced 32 +unselfish 32 +medications 32 +ears 32 +concentrating 32 +professionals 32 +scout 32 +chapters 32 +havens 4 +flavor 32 +concert 36 +heroines 32 +wished 32 +creator 32 +indicate 36 +limited-partnership 32 +edinburgh 4 +improvements 32 +dismissed 32 +run-and-gun 32 +concern 38 +sparse 32 +anti-apartheid 38 +cost-cutting 36 +second-guessing 32 +supported 34 +liven 32 +leveraged-buyout 32 +high-school 32 +lived 32 +market 110 +approval 110 +expiring 32 +intra-european 32 +parallel 32 +inhabitants 32 +district 108 +centocor 4 +brookings 2 +marked 32 +eclipsed 32 +jeopardizing 32 +evaporate 32 +marquette 4 +lives 34 +vegas 4 +death-rate 32 +lambsdorff 4 +gender 32 +sustained 32 +damage-control 32 +tatum 8 +milestone 32 +danny 4 +sever 32 +knight 12 +beauty 36 +optical 4 +seven 34 +cabs 32 +frightening 32 +tenafly 4 +preventable 32 +photography 40 +organisation 4 +crawl 32 +sloan 12 +gina 2 +belched 32 +huyssteen 4 +five-month 32 +chicken-restaurant 32 +passed 32 +bumpers 32 +financial-services 32 +jus 4 +voice 36 +colby 4 +rationalization 32 +first 46 +jug 4 +construction-materials 32 +worn-out 32 +random 36 +whip 32 +kicks 32 +legalization 32 +dispositions 32 +air 46 +semiconductor-industry 32 +better-known 32 +ait 4 +inevitability 32 +compliance 32 +inroads 32 +aim 32 +me 38 +freedman 12 +shirts 32 +freshman 32 +aid 100 +conservatism 32 +visa 6 +hurlburt 4 +excellence 32 +halted 32 +vise 32 +exports 110 +ketchum 12 +automatically 32 +subscribe 32 +thumbed 32 +hyperbole 32 +convert 32 +later 46 +tpa 4 +diane 6 +autonomy 32 +repressive 32 +preoccupation 32 +n.h. 4 +co. 12 +mullally 12 +m.j. 6 +cephalexin 6 +surgeon 32 +lowenthal 12 +trammell 4 +fattening 32 +nyack 4 +reorganizing 32 +judge 46 +friday 14 +lowly 32 +dodge 40 +lounge 32 +auckland 4 +conquest 4 +retailer 96 +activity 36 +investable 32 +clg 8 +adapting 32 +familiarity 32 +meaning 32 +clf 8 +depreciable 32 +bounce 32 +randall 4 +adjuvant 32 +disaster 32 +liberties 32 +waltz 4 +derby 8 +recession 32 +perceive 32 +freight 44 +opening 32 +g-man 4 +tops 32 +legg 4 +con 4 +heinemann 4 +copies 32 +excitement 32 +office-automation 64 +plunked 32 +temptations 32 +euroyen 4 +collaboration 32 +experiments 32 +deferred 32 +front-runners 32 +ma 4 +stop 46 +rarely 34 +copied 32 +cox 4 +coy 4 +charing 4 +awakening 32 +cot 4 +nsany 4 +sweetly 32 +brides 32 +deliberations 32 +wdg 8 +recurrence 32 +quarterly 46 +rigdon 4 +spouses 32 +tactic 32 +tomorrow 34 +clouds 4 +inefficiency 32 +inserts 32 +fanuc 4 +luanda 12 +sachem 4 +cellular 36 +hokum 32 +courtroom 32 +pinks 32 +proportioned 32 +obscures 32 +profit-spreads 32 +disposal 32 +exorbitant 32 +creates 32 +fred 12 +free 44 +placed 36 +sommer 8 +caucused 32 +vann 4 +finished 32 +questionable 32 +while 46 +institution 36 +passions 32 +frew 12 +sense 32 +productivity 32 +federation 4 +relative 32 +petipa 4 +spain 4 +deposit 36 +tex 12 +deservedly 32 +malaysian 12 +claudine 8 +orchestrated 32 +departing 32 +bygone 32 +cruzeiro 32 +enthusiastic 32 +reimburse 32 +rapaciousness 32 +durant 4 +tornto 4 +statute 32 +transition 32 +emil 4 +floating-interest-rate 32 +derivative 32 +casualty 38 +whatever 38 +often 46 +delco 4 +currency-trading 32 +temple 4 +reinstatement 32 +keynesian 4 +world-traded 32 +prevailed 32 +heel 36 +second-highest 32 +healthvest 8 +state-court 32 +cash-flow 32 +estate 36 +contingents 32 +disputes 38 +ferris 12 +guys 36 +vancouver-based 4 +officials 110 +moderate-priced 32 +advise 32 +amended 32 +isc 4 +devour 32 +isn 104 +centralized 32 +glittering 32 +dried 32 +unreliable 32 +cokes 4 +hague 4 +transient 32 +workweeks 32 +morgan 14 +peaks 32 +peripheral 32 +harlem 4 +attempted 32 +resistant 32 +secrecy 32 +dtc 12 +kill 32 +reiterated 32 +common-stock 32 +stabilizing 32 +conner 12 +dealer 36 +competitor 32 +quadrennial 32 +reassess 32 +ensemble 36 +related 36 +marbury 4 +soft-spoken 32 +portugal 4 +home-video 32 +covered 32 +originating 32 +recommendation 32 +persecuting 32 +menlo 4 +unsuccesful 32 +reply 32 +sunni 4 +parachutes 32 +entrepreneurship 32 +tumult 32 +buffalo 4 +borders 32 +survive 36 +rejecting 32 +last-ditch 32 +dummy 32 +ldc 4 +conn.-based 4 +comparing 32 +huntington 6 +very-small-business 32 +members 38 +imelda 4 +clips 32 +accidents 32 +salinas 4 +native 32 +latter 32 +write 36 +seldom 34 +coleman 14 +zagorski 4 +enderlin 4 +staples 32 +am 38 +fabled 32 +couple 32 +klaus 4 +nightly 36 +conrail 14 +dental 32 +definition 32 +magnitude 32 +moment 32 +artistically 32 +schreyer 8 +waterhouse 4 +square 36 +leventhal 4 +fashion 32 +toronto-based 4 +midpriced 32 +compatibility 32 +rohowsky 8 +recede 32 +ken 4 +abolition 32 +threw 32 +bets 32 +earning 34 +thompson 4 +hinder 32 +key 44 +veritable 32 +risks 36 +olof 4 +lasers 32 +three 110 +ddc 4 +risky 36 +bookish 32 +perception 32 +grata 32 +repayment 32 +denigrating 32 +wilcox 4 +michigan-based 4 +pugnacious 32 +non-steel 32 +high-ranking 32 +put 34 +foreseen 32 +borovoy 8 +manufactured 42 +pul 4 +pub 4 +pullman-peabody 12 +ernest 14 +semifinals 32 +interns 32 +bothered 32 +brockman 4 +entry 32 +ba-3 4 +noel 2 +ba-1 4 +under-represented 32 +entries 32 +ventres 8 +numerals 32 +criticism 32 +users 36 +coat 32 +department-related 4 +earned 36 +groves 8 +coal 36 +eight-foot 32 +foskett 4 +selling 42 +repurchased 32 +masters 36 +misstated 32 +kahle 12 +lift 32 +sheridan 4 +modern 38 +ulcer 32 +secured-lease 32 +varied 32 +cripple 32 +supercomputers 32 +refunded 32 +mari 4 +life 46 +barley 32 +reopened 32 +brigades 32 +flirting 32 +wednesday 12 +postponed 100 +complain 32 +hijacking 32 +waving 32 +data-processing 32 +vogel 4 +ontario-based 4 +audience 32 +subordinate 32 +underwrote 32 +backed 32 +nummi 8 +infractions 32 +smuin 12 +gerry 8 +slender 32 +forms 36 +sciences 4 +culture 36 +pm 4 +concept 46 +pn 8 +evans 4 +pk 4 +strengthen 32 +scott 4 +pd 4 +origin 32 +waive 32 +halved 32 +applications 42 +cabbage 4 +booty 32 +reliance 46 +gant 8 +boots 36 +halves 32 +wisconsin 14 +rgs 4 +roxani 4 +troops 32 +builders 44 +projects 32 +maneaty 12 +economic 108 +trager 4 +disbanding 32 +muhammad 12 +curtail 32 +departments 32 +curently 32 +satisfactorily 32 +nicholson 4 +davidweill 8 +inventive 32 +arbor 4 +orthodontic 32 +audiences 32 +induction 32 +manipulation 96 +kimberly 4 +nonwhite 32 +jesus 4 +localized 32 +salomon 14 +valued 100 +criticizes 32 +greece 6 +new-car 32 +minn. 4 +ewall 32 +mortgage-backed 32 +urgency 40 +ceramic 32 +job-conscious 32 +spying 32 +dispel 32 +conversations 32 +values 32 +hindawi 4 +coryphees 32 +resurrecting 32 +hock 4 +sharing 32 +edition 32 +omens 32 +sauce 32 +declarations 32 +lambert 4 +paper 38 +pizza 38 +phenomenon 32 +underdeveloped 2 +inflation-adjusted 32 +lawton 12 +architectural 32 +visions 32 +macdougal 8 +improving 32 +reaches 32 +locating 32 +far-fetched 32 +lucia 4 +finest 32 +reis 12 +sailboat 32 +unfairness 32 +faded 32 +cassoni 4 +upstate 32 +valvano 4 +hyperinflation 32 +refiner 32 +microscope 32 +speakerphone 32 +deceptive 32 +donna 4 +carmen 4 +detection 32 +find 36 +inhaled 32 +commissioner 38 +frears 4 +rush 32 +referral 32 +captors 32 +balancing 32 +public-liaison 32 +fink 12 +pesticides 32 +ex-microsoft 32 +continue 36 +commissioned 32 +baa-1 4 +baa-3 4 +applaud 32 +occasionally 34 +swiss-registered 4 +toppped 4 +atrocious 32 +gael 4 +completely 32 +adler 12 +iceberg 32 +respiratory 36 +reciprocal 32 +arm 104 +directing 34 +supply-siders 34 +arb 32 +bearer 32 +screenings 32 +coast 44 +costa 12 +publicity 96 +banca 4 +prettier 32 +nonperforming 32 +evolve 32 +announcement 32 +months 32 +alchemist 32 +costs 38 +lipton 12 +art 38 +distracted 32 +utx 8 +peaking 32 +exchange-rate 32 +acquaintance 32 +venice 4 +comprehensive 36 +rode 32 +colorado 6 +cut-and-dried 32 +posing 32 +uti 4 +murders 32 +ansa 4 +napery 32 +brandao 4 +rods 32 +ftlv 4 +drop 36 +suspects 32 +portray 32 +sony 4 +expire 32 +rings 32 +ngo 4 +enabled 32 +rosenberg 4 +opponents 34 +mother 32 +wakefield 4 +heavy-duty 32 +biggest-selling 32 +roles 32 +sultry 32 +tiny 32 +weathers 4 +enormously 32 +countermeasures 32 +enables 32 +paid 32 +untutored 32 +directions 32 +explore 32 +imperils 8 +phoebus 4 +refinancing 40 +morristown 4 +kimbriel 8 +closest 32 +already-crowded 32 +marcos 12 +apart 36 +downward 32 +orlov 12 +convocations 32 +burgess 4 +peelers 32 +macabre 32 +substituting 32 +fans 34 +eaten 32 +play 32 +screens 32 +defendants 34 +slip 36 +fe 4 +plas 4 +flower 32 +enormous 32 +higher-ranking 32 +subsidize 32 +pre-strike 32 +slim 32 +plan 44 +luncheon 32 +drum 32 +viability 32 +flowed 32 +ostrow 4 +robbed 32 +slid 32 +attend 32 +ecstatic 32 +morale 36 +wbi 8 +ensconced 32 +overuns 32 +force 36 +ill-fated 32 +factory 32 +wbb 12 +denial 34 +blindly 32 +interrupted 32 +championed 64 +telephone-installation 32 +rallies 32 +grow 36 +dollar-owners 32 +gros 12 +carry 32 +arabs 4 +approach 32 +budget-cutting 32 +canny 40 +mackin 4 +tucker 4 +pate 32 +abela 12 +allegation 32 +associate 40 +factors 38 +gear 36 +arranging 32 +manila 6 +pitching 32 +others 46 +dissolved 32 +permanent 32 +subsistance 32 +lender 36 +specialist 32 +self-defense 32 +unavailability 32 +l.p. 12 +slices 32 +paced 34 +bsc 4 +laborers 32 +grinspun 4 +anti-union 32 +nearby 32 +visited 32 +tort 32 +mifflin 4 +guerrilla 32 +brief 36 +sliced 32 +rescind 32 +rifkin 12 +saturation 32 +crowe 12 +crowd 32 +modeling 32 +relieve 32 +keyed 32 +caa 4 +cab 4 +cal 4 +can 116 +crown 36 +malaise 32 +cai 4 +virtues 32 +kuhn 2 +cat 36 +thoughts 32 +asahi 2 +keyes 12 +cap 36 +promoting 32 +car 106 +galvanize 32 +grandmotherly 32 +carries 32 +diagnosing 32 +reason 36 +spent 32 +magnificent 32 +dutch-auction-rate 4 +taxation 32 +talking 36 +earle 4 +coordination 32 +genteel 32 +wondering 32 +misleading 36 +bowen 12 +fly-drive-sleep 32 +carnegie 4 +robust 40 +inflections 32 +summaries 32 +dissolver 68 +misting 32 +ravitch 4 +waste-disposal 36 +contends 32 +downfall 32 +attractions 4 +brewed 32 +weighed 36 +overwhelming 32 +dinsmore 4 +icbms 4 +self-tender 32 +brazilians 2 +reputation 32 +freedom 36 +gifted 32 +snobbism 32 +thalmann 4 +waterfront 34 +deepest 32 +chevelles 4 +nearest 96 +enabling 34 +heaviest 32 +work-study 32 +embarrassment 32 +sunbeam 14 +flournoy 4 +rolling 36 +poker 32 +guests 34 +rates 38 +firmer 32 +unrequited 32 +fleet 36 +chaplains 32 +girl 34 +u.s.s.r. 4 +compact 32 +subcompact 32 +value-added-tax 32 +reviews 32 +adjacent 32 +weren 32 +enhance 32 +sheet-metal 32 +quips 32 +reinstated 32 +borohydride 32 +underbilling 32 +arena 32 +forces 32 +regain 32 +warranty 36 +confuses 32 +mmm 8 +mush 32 +eke 32 +ekg 4 +must 36 +pre-paid 32 +forced 32 +regular-season 32 +wipe 32 +dialogue 32 +seniors 32 +confused 32 +yen-denominated 34 +buck 4 +remotely 32 +endotronics 14 +displaying 32 +isabella 4 +detailed 32 +militiamen 32 +stock-market 36 +anti-gadhafi 32 +a.m. 32 +pregnant 32 +independents 32 +analyzed 32 +bigness 4 +mixing 4 +buckley 12 +sunglasses 32 +kind 36 +foolish 32 +neuro 4 +edina 8 +projected 32 +museums 32 +easy-cash 2 +uterine 32 +wander 32 +reminded 32 +epistolary 32 +heavier 32 +complaint 36 +staffs 32 +clones 32 +overallotment 32 +hopelessly 32 +failures 36 +clot 36 +circuitry 32 +reminder 32 +poles 36 +leave 36 +nationale 4 +material 36 +radial 32 +bow 32 +stronghold 32 +oval 32 +negotiate 40 +realistic 32 +tudor 4 +videocassette 32 +equicor-equitable 4 +price/earnings 32 +blender 32 +bags 32 +phrases 32 +shanghai 4 +planned 32 +televsion 32 +certainty 32 +responsive 32 +assumption 32 +mild 34 +accelerating 32 +amarillo 12 +lopes 4 +toshiba 6 +exhibited 32 +competitive 32 +jolt 32 +egypt 4 +capping 32 +therapies 32 +bullying 32 +non-farm 2 +movie-maker 4 +published 32 +non-canadian 32 +interests 32 +inc. 12 +acute 32 +logan 4 +edge 32 +cute 32 +apologized 32 +triple-b-plus 32 +precisely 32 +neutrons 32 +spokane 12 +publishes 32 +commenting 32 +imitators 32 +subvert 32 +overextending 32 +grave 32 +comparatively 32 +glimpse 32 +gateway 4 +beers 32 +clearance 36 +surplus 36 +awaits 32 +predicts 32 +mcmurray 4 +notoriously 32 +knock 32 +theft 32 +suicide 32 +word-processing 32 +dayco 4 +weakening 32 +balance 36 +never-never 32 +negotiation 32 +amounted 32 +minus 32 +year-ending 32 +seneker 4 +phi 4 +aspin 12 +tyce 12 +stanley 14 +bidder 32 +planner 4 +md-11 12 +repairing 32 +manufacture 32 +vice-president 32 +heat 36 +prejudice 32 +ancher 12 +consistent 32 +asides 4 +raid 32 +dirk 4 +extra 32 +rain 32 +holocaust 32 +xanax 4 +mer 8 +upheld 32 +mep 4 +casualties 32 +pensacola 4 +balance-of-payments 32 +met 36 +bavarian 4 +shoppes 4 +gives 32 +indecisive 32 +graying 32 +high-bracket 32 +accelerated 32 +jawboning 32 +purchasing 36 +weakened 32 +lunatic 32 +lowers 36 +acknowledges 32 +gregorian 12 +advertised 32 +commerciale 4 +sailor 32 +accelerates 32 +recalled 32 +willliams 4 +medea 4 +mckeown 4 +neighborhood 32 +cabrera 12 +fda 6 +contaminated 32 +allen 12 +token-ring 32 +instructions 32 +sweeping 32 +fdn 4 +involvement 36 +fds 8 +gordon 6 +timing 32 +seeds 32 +becket 8 +myopia 32 +best-selling 32 +cieply 4 +envisions 32 +price-earnings 32 +progressive 36 +penal 32 +insists 32 +translation 32 +waite 6 +saves 32 +saver 32 +interleukin-1 32 +intolerable 32 +reviewing 32 +light-skinned 32 +lubove 12 +rev 4 +rock-bottom 32 +late 46 +worsen 32 +application-specific 32 +matriculated 32 +suitors 32 +refugee 32 +saved 32 +witches 32 +dance 44 +momentary 32 +vladimir 4 +fried 44 +heterodox 32 +persisted 32 +contract 36 +moraine 4 +strollers 32 +hosted 32 +bench 32 +analogues 32 +gibert 4 +goods 100 +villages 32 +besides 42 +investor 46 +proceeds 42 +nonviolent 32 +going 32 +nancy 12 +casts 32 +link 36 +skin 32 +australian 14 +china 46 +recouping 32 +limits 36 +sydney 8 +seven-year 32 +reemerge 32 +jesse 2 +el-sayed 96 +skip 32 +group/business 4 +glen 4 +sewerage 4 +sin 32 +flavors 32 +seesaws 4 +ignored 32 +slide 36 +capitulation 32 +sunworld 14 +ultimate 32 +equality 32 +instruments 36 +sib 4 +mushroom 38 +total 46 +highfliers 32 +opted 32 +hair 32 +six 102 +unauthorized 32 +infringement 32 +sit 32 +oversees 32 +non-precious 4 +kathy 4 +forestall 32 +bosses 32 +soda 32 +bull 36 +trouble-free 32 +strategists 96 +computers/office 32 +bulk 32 +hurl 32 +appetite 36 +embezzlement 32 +scanditoy 4 +order 36 +otto 4 +miguel 4 +high-priced 32 +state-controlled 32 +perle 12 +pills 32 +jpm 4 +advance-purchase 32 +totty 4 +interplay 32 +animators 32 +experiencing 32 +waldholz 4 +desperation 32 +strapped 32 +disgust 32 +fuels 32 +merchant-ivory 4 +groans 32 +mosley 4 +chopped 32 +king 38 +aqua 36 +biological 32 +lesser 34 +dying 32 +certain 44 +religions 32 +hess 4 +reactions 32 +italiana 4 +drexel 14 +scale 32 +turnabout 32 +instincts 32 +enterprises 44 +northwestern 4 +tolerance 32 +waging 32 +buyback 36 +democrat 4 +describe 32 +actively 32 +explains 32 +murder 32 +countervailing-duty 32 +friendly 32 +realms 32 +pepper 12 +articles 32 +diseases 36 +triumphs 4 +pasok 4 +pump 36 +albani 12 +savage-western 4 +planning 36 +haggling 32 +being 34 +necessarily 32 +decree 32 +estimate 36 +formulated 32 +consist 32 +hanif 4 +shuttle 32 +advocate 36 +noble 14 +cancers 32 +revival 36 +quasi-protectionist 32 +rjf 8 +resist 32 +seductive 32 +abused 32 +providers 32 +millie 4 +microsoft 14 +merging 32 +countered 32 +epileptic-like 32 +altruistic 32 +scorns 32 +shambles 32 +comforting 32 +offers 36 +combinations 32 +ellsberg 4 +pqb 4 +page 32 +expansive 32 +shufro 4 +no-nonsense 4 +relax 32 +detector 32 +utilize 32 +lined 32 +yet 34 +nurtures 32 +homeowners 32 +yes 34 +scrutiny 32 +hadn 32 +groundwater 32 +litigants 32 +dealership 32 +relocations 32 +noir 32 +yevtushenko 4 +produce 36 +restructured 32 +triangle 4 +yen 32 +physicians 36 +circumstances 32 +developed 32 +x-there 64 +ticket 32 +potent 32 +fusillade 32 +switchboards 32 +proxmire 12 +bucksbaum 12 +francisco-based 4 +earthquake-free 32 +coughlin 8 +abhor 32 +initiatives 32 +openly 32 +skimmed 32 +displayed 32 +nationalism 32 +children 38 +lower-cost 32 +marketable 32 +historically 34 +glassmakers 32 +full 44 +realignment 32 +director-general 32 +exceeding 32 +grid 32 +applicant 32 +comex 12 +anybody 32 +dissented 32 +widow 4 +adjoins 32 +wholesaler 32 +covering 32 +leigh 12 +poverty 32 +inflammatory 32 +shorts 32 +understands 32 +eduardo 4 +grip 32 +cdii 8 +confirmed 96 +beatrice/hunt 4 +educator 32 +generator 32 +extensive 36 +mid-to-upper 32 +pledge 32 +produced 32 +after 110 +proceed 32 +concerto 4 +pa.-based 4 +having 46 +enemies 32 +emissions 32 +produces 32 +producer 46 +wage 34 +onto 32 +stoke 32 +computer-information 32 +affiliation 32 +bogdanich 4 +vtek 4 +mastered 32 +southbend 6 +fixed-cost 32 +invites 32 +councillors 32 +hyman 8 +removing 32 +fatalistic 32 +dictatorship 32 +flatter 32 +narrower 34 +brands 36 +invited 32 +swb 4 +scathing 32 +brightest 32 +garland 4 +mckinnon 12 +helmut 4 +grungy 32 +johann 4 +esber 12 +emma 4 +pmco 4 +pulp 40 +cords 8 +advisable 32 +georgiadis 4 +emmy 4 +mevacor 4 +carpeting 32 +present 32 +trait 32 +repositories 32 +georgian 4 +gown 32 +connolly 12 +impatient 32 +tax-rate 32 +adjunct 32 +dynamics 4 +expertly 32 +quacks 32 +workplace-related 32 +sentencing 40 +anti-smoking 32 +mediterranean 4 +lifted 32 +chloe 4 +comments 32 +zoot 32 +pockets 32 +wreck 32 +black-owned 32 +fla. 4 +underwriting 32 +lubin 12 +punishments 32 +colgate-palmolive 2 +hints 32 +zone 32 +preferred-stock 32 +sabre 4 +chum 32 +fraught 32 +revoking 32 +stigma 32 +records 44 +targets 32 +truer 40 +changing 36 +breaching 32 +poppea 12 +mergers 36 +brian 14 +mateo 4 +ft. 4 +fundamentalist 32 +exploits 32 +mediator 32 +impunity 32 +ratings 36 +u.k. 12 +suspended 32 +dual-career 32 +fundamentalism 32 +cooperation 100 +weinstein 12 +record-breaking 32 +advocating 32 +montedison 4 +crosses 32 +auctions 38 +compiled 40 +horror 32 +chicken 36 +waldman 4 +congressional 38 +riding 32 +speech 32 +kurt 4 +indebtedness 32 +patti 4 +nucleus 4 +gags 32 +resisted 32 +europ 12 +educated 32 +ceded 32 +vaccine 32 +downplay 32 +paragraphs 32 +saddled 32 +check 32 +wire 36 +brandy 32 +one-sixth 32 +merc 4 +urokinase 32 +apparel 36 +lowered 96 +tango 32 +mere 32 +sweethearts 32 +jacobson 8 +sweeny 4 +inaccurate 32 +watchers 32 +argentine 4 +buss 8 +argentina 4 +lucky 38 +eaton 4 +busy 36 +hartford 12 +articulately 32 +corroboration 32 +withdrawal 44 +commons 4 +modernize 32 +obliterate 32 +poink 4 +condon 12 +hinges 32 +marketeers 32 +wor-fm 4 +co-creator 32 +bush 14 +scientific 36 +dynes 8 +dramatic 32 +two-series 32 +respectful 2 +assaults 32 +currencies 40 +dangers 32 +redemption 44 +ringing 36 +decreased 32 +lund 4 +congregated 32 +valves 32 +alienate 32 +whirring 32 +upgrading 32 +assortment 32 +acumen 32 +gentleman 32 +gallantly 32 +dissidents 32 +medicinal 32 +warranted 32 +awards 32 +assurance 44 +stoga 8 +recently 114 +dismissal 32 +deleting 32 +chagrin 32 +dimetapp 4 +spirit 32 +louisville 4 +mostow 4 +arbitration 32 +raw-steel 2 +newsrooms 32 +roulac 8 +midwest 4 +urs 10 +thomas 14 +crocodile 4 +morrow 4 +tissue 2 +invoked 32 +pantzer 12 +ever-improving 32 +rely 32 +barrels 32 +blacklist 32 +petersburg 8 +teleglobe 6 +mexico 14 +laid 32 +encourages 32 +protect 32 +ousted 32 +dismisses 36 +hustlings 4 +constituent 32 +fill 32 +hollow 32 +speculating 32 +canadians 4 +ouster 32 +chesebrough-pond 12 +nettlesome 32 +ekstrom 8 +obsessional 34 +eagle-picher 10 +underline 32 +convincingly 32 +laughable 32 +accuser 32 +surprisingly 32 +triumph 32 +replaceable 32 +contented 32 +lynn 12 +accomplished 32 +perceiving 32 +accord 36 +vw 8 +nbc 12 +academies 32 +abshire 4 +midsized 32 +prince 32 +handsomely 32 +credited 32 +positioning 32 +estrangement 32 +focus 36 +israeli 6 +leveraged 32 +plea-bargaining 32 +seriousness 32 +lose 32 +brutish 32 +appealing 32 +social-security 32 +short-year 32 +lowell 12 +begins 44 +stressed 32 +layoffs 32 +wash.-based 4 +loss 46 +rummy 32 +lost 36 +qualifying 32 +luckily 8 +mci 14 +lavish 32 +willam 2 +separates 32 +behold 32 +frailty 4 +massenet 6 +broccoli 32 +fbs 8 +occasion 32 +situation 36 +aliens 36 +fbi 4 +separated 32 +physician-researcher 32 +locality 32 +fbc 8 +generations 32 +sweep 32 +invasion 32 +inman 8 +sanders 4 +invaluable 32 +sexiness 32 +ambition 32 +running 44 +below-cost 32 +reasons 36 +though 42 +syrian 4 +s. 14 +belgo-luxembourg 8 +attaining 32 +stumbled 32 +intensify 32 +flair 32 +practitioners 32 +adjustments 32 +half-empty 32 +continuously 32 +appreciation 32 +vaunted 32 +plazas 4 +kreider 4 +politicized 32 +headstrong 32 +trashy 32 +lobbied 32 +strassels 8 +andrei 4 +hopped 32 +choreographer 32 +fish 32 +helped 34 +choppy 32 +spar 4 +borg-warner 14 +sb 4 +conscious 32 +se 32 +rut 4 +non-japanese 32 +participants 34 +cluster 32 +traded 32 +fabricating 32 +sm 8 +single-b 32 +losers 32 +structural 32 +buyouts 32 +st 4 +winnipeg 4 +blacks 32 +hazardous-waste 32 +gasoline 98 +trades 36 +trader 32 +omb 12 +exercisable 32 +enrico 4 +stroh 4 +lgn 4 +mother-in-law 40 +schneider 12 +enrich 32 +soprano 32 +carlson 12 +developers 34 +superstitious 32 +meese 12 +moralizing 32 +hildegard 2 +ashton-tate 6 +petersen 8 +fray 32 +enhancing 32 +balked 32 +n.j. 4 +southfield 8 +insurance 44 +supervisory 32 +hanoi 4 +swear 32 +projecting 32 +observes 32 +observer 36 +wavering 32 +cozied 32 +comanches 4 +bollerer 4 +sadder 2 +c.o.m.b. 6 +billing 32 +victories 32 +lowry 4 +observed 32 +bourj 4 +unresolved 32 +open-market 32 +anti-dumping 42 +stoves 32 +price 110 +collateral 32 +sneaker 32 +moniker 32 +shark 36 +frenzied 32 +blustery 32 +persuasive 32 +bristol-myers 4 +expropriated 32 +spurned 32 +sharp 44 +pranksterism 32 +ethics 36 +contingent 32 +resources 36 +rua 4 +aids 38 +absolutely 32 +smiled 32 +draftsman 32 +recipients 32 +bloom 4 +custom 32 +newsweek 6 +monteith 8 +struts 32 +blood 32 +shifted 32 +solicitor 32 +analysts 46 +scant 32 +lighting 32 +syria 4 +simon 12 +amend 32 +memorandum 32 +jurisdictional 32 +fri. 2 +nevertheless 34 +didn 32 +highest 32 +severe 32 +heal 32 +decisions 32 +full-sized 32 +skyscraper 32 +single-digit 32 +bottlenecks 32 +financed 96 +second 46 +aviv 4 +post-split 32 +guessing 32 +woodcuts 32 +armin 4 +season 32 +stever 4 +ernst 6 +hot-blow 32 +schwarz 4 +light-filled 32 +gained 96 +lead-recycling 32 +three-day 32 +utilization 32 +cloud 32 +gartner 4 +executor 32 +spurt 32 +treadway 4 +affiliates 36 +birmingham 14 +clout 32 +marshal 32 +problem-loan 32 +tvla 8 +chicago-area 4 +defense 108 +implies 32 +indictment 32 +bertrand 4 +critical 36 +salaries 38 +lavender 32 +caliber 32 +bloodstock 32 +buick 8 +somehow 42 +schwartzman 4 +leaking 36 +bigwig 32 +allows 96 +marche 32 +nervousness 34 +tune 32 +arose 32 +inscrutable 32 +wound-healing 32 +imagine 32 +seventh-largest 32 +consumer-group 32 +hal 14 +okla.-based 4 +castings 32 +tails 32 +carrying 32 +developing 32 +digest 4 +convoluted 32 +had 108 +froze 32 +condoms 32 +hay 4 +staggers 32 +insult 32 +frankel 4 +out-of-favor 32 +has 108 +toadstool 32 +hereditary 32 +refused 32 +dishwashers 32 +transamerica 4 +sleazy 32 +speakers 32 +managements 32 +healy 12 +k-12 4 +carroll 8 +staff 46 +telecommunications 46 +failure 36 +supervisors 32 +kit 32 +endangered 32 +flooded 32 +redistribution 32 +attempts 34 +dhl 4 +allegations 34 +strenuously 32 +endanger 32 +halsor 8 +penetrate 32 +re 36 +above-average 32 +resolve 100 +rj 10 +implementing 32 +gilts 32 +kempe 4 +t.j. 2 +newmark 14 +mathematically 32 +jamaica 4 +rt 4 +clutch 32 +weinger 12 +andrews 4 +centrifuge 32 +propping 32 +dosages 32 +doubly 32 +ponce 4 +savin 4 +market-oriented 32 +panicked 2 +lentivirus 4 +would-be 32 +mortages 32 +talent 32 +principals 32 +outlawing 32 +emits 32 +debated 32 +rid 32 +kilmer 4 +variability 32 +technician 32 +walkie-talkies 32 +philosophical 32 +considerably 32 +clerk 32 +charged 36 +imbroglio 4 +voicing 32 +liberate 32 +metall 6 +tighten 32 +winner 32 +one-time 32 +appalachian 4 +consumer-oriented 32 +monday 14 +considerable 32 +telecasting 32 +share-for-share 32 +charges 102 +novel 32 +kfv 4 +needing 32 +maid 32 +pharmaceutical 36 +a.t. 4 +maneuvers 32 +smr 4 +sms 4 +balloons 40 +bypass 32 +posted 100 +vans 36 +marvels 32 +norwegian 6 +return 36 +nonunion 36 +healthy 32 +plaintive 32 +illegitimate 32 +disguised 32 +smf 12 +outstanding 32 +shelves 32 +portfolios 32 +bicentennial 32 +roommate 32 +rapid-fire 32 +chronology 36 +clues 32 +nurse 36 +shulman 12 +valve 32 +disgruntled 32 +quell 32 +flora 2 +gte 14 +radio-controlled 32 +f 12 +shoring 32 +week 38 +chimpanzee 32 +semi-annual 32 +shuffling 32 +formless 32 +daiwa 4 +acqusitions 32 +shelley 4 +intentions 32 +think 32 +ballyhooed 4 +thing 36 +gainers 34 +andreas 4 +unitek 4 +alliance 36 +hesitate 32 +raphael 4 +range 32 +lacks 32 +chain 36 +marilyn 6 +tchaikovsky 4 +disagreements 32 +rebel 36 +colleague 32 +colodny 12 +likud 4 +deliberately 32 +kinetic 32 +mayor 38 +r.j. 2 +faring 32 +convergent 4 +someone 34 +printemps 6 +invitation 32 +latitude 32 +paranoid 32 +cleveland-cliffs 10 +paranoia 32 +network-news 32 +thank 32 +boats 32 +conjures 32 +framingham 4 +arbitrage-trading 32 +dataquest 4 +toyoo 4 +baffled 32 +objection 32 +protective 32 +blackstone 4 +whichever 32 +bartlett 4 +buying 44 +uncharacteristically 32 +gathering 32 +klein 12 +rubber 44 +d-ram 4 +isles 4 +specifications 32 +fellas 32 +depositary 36 +reverted 32 +factual 32 +unguaranteed 2 +curtain 36 +consternation 32 +lately 34 +greenberg 12 +idolized 32 +publicized 32 +a-discounted 64 +dethrone 32 +jasinowski 12 +instrumental 32 +irritations 32 +bowery 4 +delaware 14 +somewhat 32 +infancy 32 +arbiter 4 +maxxum 4 +buoyed 32 +beesley 12 +ottoman 4 +accident 32 +legitimate 36 +haughty 32 +comparable 32 +unveil 32 +lonsdale 4 +mellifluously 32 +industries 108 +designing 32 +liberation 4 +initial 42 +orleans 4 +regulation 38 +allots 32 +ava 4 +howls 32 +surpassed 32 +ventron 4 +informed 34 +anti-ulcer 32 +monday-night 4 +mcgee 12 +slated 44 +legislation 40 +generating 32 +indulgence 32 +thus 42 +location 32 +continuation 32 +interleukin-2 32 +erect 32 +stamp 32 +interview 36 +eastdil 4 +anguished 32 +ups 6 +uniformly 32 +puffy 32 +wanted 32 +furor 32 +wallboard 36 +hughes 14 +hobor 12 +centronics 14 +insurers 36 +female 32 +sniff 32 +door 32 +delano 4 +baroque 4 +workings 32 +kiss 40 +disdaining 32 +upj 8 +spoken 32 +sculpture 4 +unsupported 32 +bulgarians 4 +ensures 32 +jones-irwin 4 +swamped 32 +baptista 12 +galoob 4 +mutuals 32 +new 46 +collapse 36 +investigate 32 +interest 110 +masterpieces 32 +revolve 32 +easier 32 +second-fiddle 32 +pso 8 +paying 36 +conflict-of-interest 32 +spinning 34 +rendering 32 +balloon 32 +psd 8 +complexities 32 +orchard 4 +supporting 32 +coming 46 +oakland 4 +regardless 42 +predicting 32 +revise 32 +lardner 4 +noon 32 +shortly 34 +resigning 32 +auto-company 32 +slumped 32 +big-bucks 32 +salzburg 4 +correspondents 32 +banking 108 +making 44 +caleb 4 +plantations 32 +commensurate 32 +endemic 32 +embroiled 32 +trying 34 +reputed 32 +money-supply 32 +multimillion-dollar 32 +usefulness 32 +colonel 32 +macfadden-bartell 4 +retailers 40 +discovery 32 +inquire 64 +fung 12 +fund 36 +route 36 +kodak 14 +coherence 32 +forge 32 +ameritech 4 +moammar 12 +forgn 12 +flashing 32 +slew 32 +honoring 32 +leaped 32 +jerk 32 +kemmons 6 +ncnb 4 +tastiest 32 +catastrophe 32 +paulette 4 +variety 32 +linchpin 32 +undoubtedly 34 +barclays 4 +tenure 32 +mobilize 4 +anderson 12 +montreal 12 +editor-in-chief 32 +bajarin 12 +flaky 32 +comparative 32 +perils 32 +subcommittees 32 +specializing 32 +price-fixing 32 +c 36 +grabbing 32 +estes 8 +schools 36 +westbound 32 +elizabeth 4 +offensive 32 +fights 36 +double-digit 32 +beni 4 +nine-to-10-month 32 +headed 96 +instability 32 +north 44 +amr 14 +fertilizer 32 +thought 32 +hydro 4 +launched 98 +chaos 32 +amy 4 +amf 4 +gaining 32 +amd 4 +foals 2 +tcf 4 +amc 14 +ama 8 +bakes 4 +amo 12 +launches 36 +societe 4 +swings 36 +fast-food 32 +automation 32 +barrage 32 +inquiry 36 +exemption 32 +puts 32 +hadlock 4 +globalization 32 +seats 46 +takeda 4 +patrons 32 +prepared 32 +explosives 32 +ridgefield 8 +latam 12 +powerhouse 32 +dallas-fort 4 +dorm 6 +vidal 4 +tax-overhaul 32 +dingell 12 +ltd. 4 +octavia 4 +proportional 32 +possibility 32 +profits 38 +customizing 32 +double-a-minus/a-1-plus 32 +gecm 4 +fslic 4 +freely 32 +recreational 32 +alliant 4 +soldiers 32 +adorjan 8 +pole-vaulter 32 +hays 2 +fitzwater 12 +lazarus 4 +long-run 32 +inference 32 +freezeframe 4 +t-lymphotropic 4 +prominently 32 +toll 36 +freeport-mcmoran 4 +infringe 32 +acceptance 32 +conservation 36 +told 36 +record 44 +far-ranging 32 +tagliabue 4 +brick 32 +hanged 32 +accepts 40 +cofide 12 +liquor 34 +barry 12 +videos 32 +spell 32 +telequest 14 +milwaukee 12 +collected 32 +belief 32 +run-down 32 +definitive 34 +cci 12 +keyboards 32 +ambassadors 32 +bank 110 +ccb 12 +ccc 4 +intrigue 32 +cce 12 +evaporation 32 +mining 46 +provinces 32 +politician 32 +mound 32 +billionaire 32 +awake 32 +successor 32 +half-step 32 +duds 32 +identical 32 +waiving 32 +declare 32 +mount 36 +irritants 32 +wales 4 +taste 32 +association 36 +dispute 36 +updated 32 +ticket-purchase 32 +increasing 100 +builds 32 +windhaven 4 +graze 32 +directorial 32 +balls 32 +inexplicably 32 +centuries-old 32 +addicts 32 +inexplicable 32 +sea-land 4 +editorial-page 32 +updates 32 +soar 32 +refinance 32 +soap 32 +symposium 32 +willingness 32 +learn 32 +norm 32 +ever 34 +stately 32 +consequential 32 +editorial 36 +break-up 32 +anticipated 32 +over 110 +peanuts 32 +warns 32 +tasks 36 +adam 4 +remote 32 +technological 34 +adverse 32 +anticipates 32 +statue 32 +paris 12 +nomura 4 +settles 44 +hca 12 +gradison 4 +shindig 32 +erria 4 +third-ranked 32 +edelman 12 +reservations 36 +crude-oil 32 +palestinians 4 +mainstream 32 +biting 32 +thinking 32 +needham 4 +entertained 32 +restrictions 32 +contributions 32 +anaheim 12 +helpful 32 +memo 32 +thunderous 32 +classes 32 +possible 36 +was 108 +farmer-borrowers 32 +roped 32 +postpone 32 +unesco 4 +known 34 +subcabinet-level 32 +counterparts 32 +preserving 32 +basement 32 +pickens 12 +discounts 32 +latent 32 +effort 36 +minneapolis-based 4 +third-highest 32 +s.g. 4 +stardom 32 +possibly 34 +disconnect 32 +quarters 32 +iranian-syrian 4 +founders 32 +deficit-reduction 32 +itek 4 +mobile-home 32 +abalone-processing 32 +nations 36 +item 32 +pete 4 +brusqueness 32 +guerrillas 32 +hiccuped 32 +assertions 34 +barrios 4 +equity 36 +discussions 32 +daylong 32 +u.s.-soviet 4 +mid-40s 32 +minoxidil 32 +devices 36 +overabundance 32 +faulted 32 +hyper-reactivity 32 +jaws 32 +lyle 4 +unsuccessful 32 +waddell 8 +testify 32 +shifting 32 +cooperman 12 +speidell 4 +intention 32 +krug 12 +aln 8 +regarded 32 +audits 36 +glaser 4 +fourth 38 +motel 32 +apollo 4 +oversubscribed 32 +toothpaste 32 +small-appliance 32 +columbia-registered 4 +polypropylene 32 +spree 32 +diverting 32 +e-estimated 64 +pliable 32 +cashing 32 +therapeutic 32 +ldcs 4 +cabinet 32 +flounder 32 +antibody 36 +neo-darwinists 32 +burger 12 +active 32 +knows 36 +might 100 +feb. 14 +safety-related 32 +weighty 32 +implored 32 +instructive 32 +violated 96 +mad 4 +slips 32 +mac 4 +rarity 32 +professing 32 +depositor 32 +deathbed 32 +parasitical 32 +max 12 +germany 12 +measures 32 +ain 32 +hungary 14 +arkin 4 +ridiculous 32 +germans 6 +s.a. 4 +tax 110 +demonstrate 32 +brand 32 +canadian 14 +tar 4 +it 110 +tap 32 +on-site 34 +kidneys 32 +middletown 8 +tan 4 +remember 34 +veress 4 +centigrade 4 +lewis 12 +duration 32 +appeals 44 +triple 32 +segment 32 +laced 32 +menus 32 +photo-processing 32 +difficult 32 +occupy 32 +long-awaited 32 +seamen 100 +inducements 32 +placate 32 +mass-manufactured 2 +degrees 32 +sidestep 32 +assistance 100 +eager 32 +animals 32 +amplifications 4 +incomplete 32 +persuade 32 +doctors 46 +desmond 6 +calgary 12 +immigrant 32 +tucson 4 +reallocation 32 +chairs 32 +securities-law 32 +retail 110 +board 110 +ave. 4 +schumann 4 +short-haul 32 +block 44 +redmond 4 +generated 32 +retain 32 +elma 4 +tommaso 8 +catholic 4 +says 110 +information-driven 32 +calvert 4 +fuzziness 32 +atmosphere 32 +denationalized 32 +resuscitate 32 +satellite-beamed 32 +talked 32 +f.g. 4 +jeans 34 +legends 32 +merit 32 +food-store 32 +raw-material 36 +acquistion 32 +ledger 32 +umm 4 +peace 36 +katz 4 +assembled 32 +six-packs 32 +bach 4 +tariff 32 +preston 12 +ballet 36 +speyer 4 +eurobonds 12 +specifically 42 +kids 32 +prohibition 32 +donations 32 +prior 106 +northwest 4 +fast-moving 32 +soon 98 +per-capita 10 +represented 32 +back 46 +pertinent 32 +monsanto 6 +labib 4 +preparation 32 +sandra 4 +long-form 32 +forest-products 32 +jose 4 +lancet 4 +rehnquist 4 +rubin 4 +converted 32 +foot 32 +ducks 32 +easton 4 +capital-spending 32 +wallow 32 +bedside 32 +dumez 6 +dilemma 36 +shortage 36 +meddlesome 32 +overhead 32 +heated 32 +stock 110 +afraid 32 +slacks 32 +six-figure 32 +wheelchair 32 +outskirts 32 +clouded 32 +pay-fone 14 +fanatics 32 +softdrink 32 +clev 4 +tasted 32 +savage 44 +capital-gains 32 +regulates 32 +boxes 32 +highways 32 +office-temporary 32 +bing 4 +objectionable 32 +hospital 46 +kaufman 14 +drawings 32 +nordmann 12 +outbursts 32 +self-consciously 32 +top-secret 32 +hastings 2 +deterioration 32 +regulated 32 +status 32 +conspicuous 32 +again 38 +oct. 6 +justices 40 +virtually 32 +high-limit 32 +tractors 32 +stereo 32 +artitragers 32 +backfired 32 +dated 32 +proper 32 +vital 36 +propel 32 +gourmet 36 +level 100 +malt 32 +dates 32 +bids 34 +deer 32 +belted 32 +structure 32 +blur 32 +boat 36 +index 36 +ogil 4 +fleming 4 +covington 4 +bahamas 4 +doorbells 32 +ate 32 +blue 38 +bronze 32 +messianic 32 +cat-and-mouse 32 +hazards 32 +government-sponsored 34 +appealed 32 +impetus 32 +everyone 46 +pace 36 +provisions 34 +trilling 32 +draw 32 +spiced 32 +reassure 36 +pack 32 +intricacy 32 +renegade 32 +raked 32 +brokers 34 +dram 4 +bidu 4 +welfare 32 +drag 32 +neco 12 +harder 32 +neck 32 +maurier 12 +simpson 12 +superstitions 38 +container 36 +death-penalty 32 +burbank 4 +vindication 32 +reversed 32 +strategic-arms 32 +czm 8 +fully 34 +containment 32 +effective 32 +feed 36 +ineffective 32 +overbuilding 32 +compressor 32 +official 108 +confess 32 +single-engine 32 +bureaucratically 32 +yelling 32 +paratungstate 32 +berlin 4 +ourselves 32 +fpa 8 +why 38 +architects 36 +aware 32 +award 44 +whites 32 +rayner 8 +increased 42 +bti 8 +stronger-than-expected 40 +introductory 32 +reproduce 32 +defended 32 +hyped 32 +rotondo 12 +scandal-ridden 32 +increases 44 +carlo 4 +permit 32 +line 36 +bty 4 +margoshes 4 +garret 4 +illuminate 32 +away 36 +emphasize 36 +global 34 +small-minded 32 +discussed 32 +drake 4 +nearing 32 +liters 32 +deflated 32 +ga.-based 4 +cohens 4 +traveling 32 +cure 32 +profilic 32 +auto-plant 32 +garza 4 +blithe 32 +janet 4 +alternating 32 +palestinian 4 +balkanized 4 +significantly 32 +handsome 32 +model 36 +diego 4 +wake 36 +intones 32 +facilities 100 +unreasonable 32 +finders 32 +raising 44 +belgium 6 +refurbishing 32 +doron 4 +one-tenth 32 +joining 32 +presumptions 32 +ore.-based 4 +television-type 32 +superstations 32 +zico 6 +already 98 +broadcasts 32 +subscriber-line 32 +halliburton 12 +cheers 32 +ribbons 32 +versatile 38 +rope-like 32 +charge 40 +cynthia 4 +routinely 32 +beat 32 +domestic-appliance 32 +summit 42 +volunteered 32 +phased 32 +chry-plym 8 +underwritten 32 +sox 4 +incentive 36 +chartered 36 +sow 32 +ekofisk 4 +heightening 32 +represents 32 +son 34 +pumped 32 +tadeusz 8 +thrown 32 +vocal 36 +kimball 8 +loquacity 32 +catalyst 4 +reno 12 +made 44 +battery-powered 32 +leaned 32 +concluding 32 +bristol 4 +broadcastmail 32 +durenberger 4 +adrar 4 +orleans-style 4 +theresa 8 +government-recognized 32 +apostles 32 +reser 12 +chart-guided 32 +jamming 32 +teeth 36 +into 96 +woodhead 8 +stockpiles 32 +underwear 32 +censor 32 +calif-based 4 +intc 12 +including 34 +roadside 32 +conceived 32 +transformers 4 +tons 32 +nostalgia 32 +conversely 2 +judiciously 32 +poisonous 32 +tony 4 +tong 4 +tone 40 +kouril 12 +construed 32 +existing 32 +plaid 32 +coveted 32 +considered 34 +beseech 32 +frontal 32 +athletes 32 +u.s.-backed 4 +bendjedid 4 +reversion 32 +onetime 32 +memos 36 +cross 44 +airports 32 +hits 32 +goetabanken 4 +persists 32 +eroded 32 +n.j.-based 4 +alarmed 32 +product-liability 32 +misappropriated 32 +uncertain 32 +runners 32 +lowering 34 +assigned 34 +virtual 32 +mcauliffe 8 +ceo 4 +foreign-debt 32 +clothing 32 +algeria 12 +aviator 32 +waukegan 8 +creation 32 +liquid 32 +weighted 32 +cents 32 +imasco 4 +afghan 4 +stablilizers 32 +defense-electronics 32 +tyranny 32 +waves 32 +rust 36 +advest 6 +lee 14 +mercury 4 +crisanti 4 +semi-negative 32 +heart-shaped 32 +juries 32 +representation 32 +unleaded 34 +calder 4 +perot 4 +harris 14 +hint 32 +celestre 8 +governing 36 +silent 36 +animator 32 +laptop 32 +congressmen 32 +outgrowth 32 +adequately 32 +fluidly 32 +abortions 36 +clucks 32 +munoz 12 +supplying 32 +cities/abc 4 +rapport 32 +amsterdam 8 +romance 34 +folly 32 +hasbro 4 +novels 36 +meteoric 32 +give 44 +statesmanlike 32 +pages 32 +urgings 32 +lindner 8 +blitz 32 +hardest 2 +guinea 32 +gonzalez 4 +kidder 14 +clear 44 +old-fashioned 32 +belt 36 +prove 34 +gain 44 +dangling 32 +reproducing 32 +kevin 6 +shotgun 32 +bell 46 +bramco 4 +nondurable 40 +atfc 8 +outcry 32 +clean 36 +tools 36 +television-newsroom 4 +supersedes 32 +reinhardt 4 +santa 12 +houghton 4 +political 98 +unified 36 +pounds 32 +accustomed 32 +presence 32 +achieving 34 +escalate 4 +unimaginable 32 +managers 36 +wits 32 +coffee 46 +mistress 32 +resorts 44 +marketeering 32 +intends 32 +kohlberg 4 +high-intensity 32 +polk 4 +trade 108 +excludes 32 +polo 36 +parody 32 +armageddon 4 +excluded 32 +stresses 32 +noisy 32 +clubs 32 +outlook 36 +absolve 32 +pipe 32 +chagrined 34 +pacts 36 +guards 32 +abrasives 32 +guaranty 4 +drusilla 6 +mailbox 32 +computer-aided 32 +authorization 32 +interbank 36 +excise 32 +accomplishments 32 +jerry 4 +alderman 4 +hootch 32 +whoop 32 +sported 32 +feds 32 +operationally 32 +suggest 32 +impelled 32 +withered 32 +tripling 32 +dinette 32 +libya 4 +chattanooga 8 +sailer 8 +accelerator 32 +coolidge 12 +dollars 96 +lorimar-telepictures 8 +disagreeing 32 +killing 32 +nazi 4 +arturo 4 +farther 32 +toyota 8 +fundamentals 32 +democrats 14 +slogan 32 +allow 32 +climbing 32 +freres 4 +aegean 4 +routes 32 +nicholas 4 +mom 32 +convenient 32 +abdicating 32 +vous 36 +fascination 32 +routed 4 +stringfellow 4 +analysis 32 +dubofsky 4 +corps 32 +priest 32 +lessening 32 +jungle 32 +fort 12 +himself 32 +reflect 96 +latest 44 +deterring 32 +chirac 4 +appoint 32 +backs 32 +perfection 32 +ford 14 +zooming 32 +problem 40 +gnp 4 +form 44 +exported 32 +caution 32 +wheeling 12 +qualify 36 +class 36 +fork 32 +boutique 34 +unsharklike 32 +ravages 32 +federal 110 +shake 32 +blustein 4 +emigrate 32 +integon 6 +shaky 32 +peace-loving 32 +silo 4 +screamers 32 +sufficient 34 +do-it-yourself 34 +astonishing 32 +seekers 32 +stimulating 32 +around 44 +selwyn 4 +danube 4 +fondy 8 +lean 34 +married 36 +guardia 4 +rudani 4 +consumption 98 +expansion-related 32 +leon 6 +khoo 4 +smuggling 32 +edmund 4 +intermediary 32 +adair 12 +anything 32 +paving 32 +intertwined 32 +cheaper 36 +congreso 4 +fonda 4 +ing 4 +cynical 32 +journalist 32 +ind 4 +oil 110 +rest 36 +bearing 32 +keran 4 +pih 4 +inn 4 +windfall 32 +ink 32 +mcentee 8 +ini 4 +fails 44 +headaches 32 +foreign 46 +divest 32 +int 4 +ins 4 +secord 12 +chemical 44 +embarked 32 +babylonian 2 +motorbiking 32 +journalism 32 +devaluation 32 +baghdad 4 +uncollectable 32 +dnb 4 +man 36 +pig 32 +verified 32 +barakat 4 +writing 32 +fungi 36 +mar 4 +islam 4 +informative 32 +forefathers 32 +withdrawals 32 +submersible 96 +arctic 4 +hoping 34 +some 110 +catskills 4 +close 44 +rial 8 +llx 4 +damp 32 +reopen 32 +presumably 34 +alcohol-related 32 +silver 36 +australian-based 4 +stun 4 +faster-growing 32 +circus 32 +pronouncing 32 +figuring 32 +pierced 32 +rentals 32 +fixed 32 +annuities 32 +residual 32 +staged 32 +labor 46 +cng 4 +southwest 14 +experimental 32 +bode 32 +excel 6 +susan 6 +affects 32 +eisenstadt 8 +discontinuing 32 +covertible 4 +bonus 32 +madcap 10 +expertise 32 +professional 38 +disappears 32 +uniforms 32 +zehli 4 +bogeymen 32 +overproducing 32 +yields 34 +flights 36 +laszlo 4 +confidential 34 +fasteners 32 +boycotts 32 +essentially 32 +assignment 32 +places 34 +mid-may 32 +well-done 32 +trimmed 96 +nov. 14 +lurks 32 +climax 32 +clara 4 +curb 36 +snowstorms 32 +s 36 +discretion 32 +adm. 6 +list 32 +asserting 32 +insolvency 32 +unexpected 32 +exponent 32 +transports 32 +yourself 32 +lacy 38 +reagan 14 +wildly 32 +corruption 32 +impact 36 +singapore-based 4 +flx 4 +fly 32 +pont 4 +frey 12 +doctorate 32 +hereabouts 32 +pretoria 4 +perhaps 46 +drum-shaped 32 +suburban 32 +flu 32 +mainframes 32 +offered 96 +clossey 4 +aged 32 +disorders 32 +mysteries 32 +averaged 32 +sneakers 32 +anatoly 4 +tighter 32 +vista-based 4 +spontaneously 32 +detrick 4 +aftershocks 32 +proximity 32 +truffles 38 +memory-chip 32 +fundamentally 32 +hatcher 4 +sorry 32 +pursued 32 +layoff 32 +tire 46 +letters 40 +microphone 32 +outside 102 +b-week 16 +levels 36 +hollywood 4 +mascots 32 +thrived 32 +regrettable 32 +multiplied 32 +afonso 4 +storming 32 +morin 4 +goldsmith 12 +nato 4 +carrington 4 +ziemer 8 +branford 4 +restitution 32 +results 58 +mmr 8 +returns 44 +drummer-athletes 32 +kleenex 4 +reporting 32 +nutritious 32 +decade 32 +declassified 32 +aficionados 32 +fence-sitting 32 +goetzl 12 +absent 32 +grabs 32 +washington-based 6 +news-service 32 +nickeling 32 +elected 100 +proponents 34 +roughed 32 +impeding 32 +teacher 32 +teaches 32 +critique 32 +gangster-and-love 32 +effigy 32 +subjects 32 +inclined 32 +cotton 44 +sensibility 32 +irons 32 +myl 8 +irony 32 +unfair 32 +tronic 4 +cowboy 32 +feature 32 +squad 32 +kicking 32 +jaap 4 +spin 32 +committing 32 +neves 4 +erratically 4 +slowest 32 +saturated 32 +raw-materials 32 +nuclear-weapons 32 +hesitant 32 +iranians 4 +scrap 32 +reduced 96 +damon 4 +diceon 14 +nurtured 32 +sonnenblick 4 +mae 4 +apparatus 32 +organizing 32 +sacrosanct 32 +reduces 36 +two-decade-old 32 +sachs/kidder 4 +sufferers 32 +full-scale 32 +mediation 32 +commitment 96 +sat 32 +hired 32 +accommodations 32 +saw 32 +european-looking 4 +narrative 32 +dependable 32 +greenmail 32 +started 32 +bleak 32 +say 100 +sad 42 +incurring 32 +sag 32 +rabushka 12 +lampooned 32 +fiasco 36 +sam 12 +san 12 +sao 4 +sai 8 +examining 32 +preview 32 +wear 32 +paramount 36 +finely 32 +trouble 36 +tcw 8 +s.c. 4 +nebulous 32 +skeptics 34 +whinney 4 +two-month 32 +illegal 32 +tubes 32 +deficiencies 32 +temperature 32 +weak 38 +stoicism 32 +industrie 4 +undershoot 32 +surpluses 32 +accomplishes 32 +starter 36 +discouraged 32 +ratepayers 32 +humphries 8 +footlick 4 +attracts 32 +crisis 36 +from 110 +x-rayed 4 +errors 32 +christianity 4 +inflationary 32 +carry-forwards 32 +assisted 34 +riots 32 +compare 32 +objects 32 +french-sounding 4 +train 32 +spawn 32 +kiichi 4 +diapers 32 +daffynition 8 +forwarders 32 +pix 4 +roots 32 +saudia 4 +bathing 32 +percent 40 +moonlighting 4 +sunbathing 32 +preoccupied 32 +refers 32 +skims 32 +frisch 12 +disputed 36 +sean 4 +saudis 4 +constitutes 32 +decorous 32 +conceal 32 +cacophonous 32 +machinery 38 +scoff 32 +introspective 32 +teradata 8 +logistics 32 +ammunition 32 +refuse 32 +francisville 8 +paralyzed 32 +write-down 32 +baltimore-based 6 +diverted 40 +japanese-designed 4 +lazard 4 +pessimistic 36 +unpleasant 32 +gousha 12 +vigor 32 +acquaint 32 +naval 40 +matrimony 32 +major 46 +egyptian 4 +biggest 38 +gringo 32 +western 46 +billion 36 +knowingly 32 +choate 4 +evenhandedly 32 +tax-cutting 32 +heyday 32 +further 46 +absorbing 4 +explicitly 32 +potatoes 32 +dollar-denominated 32 +counsels 32 +bankers 102 +fibers 32 +finesse 32 +diagrams 32 +coffee-growing 32 +believes 96 +nyt 8 +carnivorous 32 +listeners 32 +stadiums 32 +underestimate 32 +nyn 8 +recyclers 32 +phyb 8 +precipitous 32 +standby 32 +nye 4 +finkielstain 12 +stoughton 8 +retaliation 96 +believed 32 +cards 36 +commit 32 +bent 32 +motive 32 +crow 36 +et 32 +inexperienced 32 +immigrants 32 +revenue-raising 32 +campaigns 36 +adviser 36 +witty 32 +panache 2 +bend 36 +cabinet-level 32 +obligations 32 +concentration 32 +first-ranked 32 +world-wide 104 +complaints 32 +swearingen 4 +kline 4 +corporately 32 +appointee 32 +siegels 4 +nest 36 +topped 32 +pakistanis 4 +couldn 36 +streamline 32 +a-330 4 +rumors 32 +parenting 32 +franyo 4 +op-ed 32 +coal-burning 32 +unmitigated 32 +assume 34 +celebrity-laden 32 +adolescents 32 +rockford 6 +frequency 32 +t.nor 4 +witchlike 32 +inspected 32 +sellers 32 +mosle 4 +ious 4 +online 4 +made-for-television 32 +heroic 32 +marina 4 +agent 32 +fidel 4 +readied 32 +vierdanck 4 +hausfeld 12 +mcdonald 12 +graduates 32 +celebrate 32 +harpsichord 32 +gentlemanly 32 +jolted 32 +shantytown 32 +ministry 36 +fide 32 +governmental 32 +graduated 32 +engineer 32 +wholesale 36 +cash-and-stock 32 +thumb 32 +ballistic 32 +m.b.a. 4 +deliverable 32 +robitussin 4 +well-paid 32 +harden 36 +even 46 +tennis-racquets 32 +milburn 4 +iss 40 +coin 32 +sucralose 34 +seniority 32 +depicting 32 +torrent 32 +three-quarters 32 +discord 32 +return-on-investment 32 +beach 36 +obtained 32 +resent 32 +vodavi 4 +ata 4 +heileman 8 +mandated 32 +matched 32 +britain 14 +excessive 32 +inflation 46 +weakness 32 +advises 32 +tacit 32 +tcoma 4 +lotteries 32 +liquids 32 +swingers 4 +ransom 32 +griswold 8 +unshaken 32 +investigative 32 +formal 32 +dabbling 32 +college 46 +advised 32 +precision 32 +divestitures 32 +reasonable 32 +downgrading 32 +jockey 36 +wstf 8 +homeowner 32 +garrasi 4 +byzantine 4 +litigators 32 +red-haired 32 +hangover 32 +subpoena 32 +elvis 4 +side 100 +carajas 4 +pre-apprentices 32 +struggles 32 +authorities 98 +anti-lawyer 32 +compulsively 32 +alberta 4 +costly 34 +struggling 32 +florio 8 +ok. 4 +attache 32 +pedal 32 +vigorous 32 +neanderthals 4 +reportedly 32 +senator 104 +yutaka 4 +carted 32 +publication 32 +securities-services 32 +catastrophic 32 +misguided 32 +fee-for-service 32 +furthermore 34 +abbes 4 +cswc 4 +unforeseen 32 +harmed 32 +steel-ingot 32 +accrue 32 +accost 32 +white-collar 32 +lsi 12 +terrorism 32 +sweet 36 +dancing 32 +elkay 4 +stages 32 +regions 40 +swiss-based 4 +uk 4 +uh 32 +formerly 98 +ut 4 +anti-black 32 +thatcher 4 +us 34 +up 46 +terrorist 32 +j&l 4 +expression 32 +non-recoverable 32 +taffeta 32 +jonathan 4 +litchfield 4 +h.m. 4 +disconnected 32 +matters 36 +oki 4 +rusch 4 +chunk 32 +chamber 36 +limitations 32 +leverage 32 +whims 32 +dixieland 4 +adequate 32 +analyst 100 +attachments 32 +friendships 32 +confrontationism 32 +rugged 32 +bamberger 12 +computervision 14 +maintenance 32 +melamed 12 +multifamily 32 +soviets 4 +decisive 32 +investment-bank 64 +hires 32 +undertook 32 +academia 32 +outline 36 +video 38 +rosenthal 4 +economies 32 +biocraft 10 +widening 44 +falsify 32 +holiday 46 +leahy 12 +confectionery 32 +meierfeld 8 +cooking 32 +gtx 8 +dryburgh 8 +spigot 32 +nearly 46 +distasteful 32 +hamburger 32 +crop 32 +bart 4 +preoccupies 32 +installations 32 +heightened 32 +headlining 32 +blissful 32 +questioner 32 +squander 32 +dispersed 32 +soldier 32 +edged 32 +enacted 32 +superscope 4 +cgp 4 +freed 32 +reasonably 32 +clarence 2 +bohai 4 +indignities 32 +amos 12 +cge 4 +edges 4 +shaken 32 +peelings 32 +amok 32 +dancers 32 +sheen 4 +dominating 32 +foreign-policy 32 +hire 32 +freer 32 +none-too-subtle 32 +kra 8 +centurion 4 +chileans 4 +lafayette 8 +station 36 +education 46 +nauslar 12 +decides 32 +christmas 4 +overproduction 32 +negotiated 32 +g. 4 +cie. 6 +discover 32 +rohatyn 4 +vaccines 32 +decided 36 +conciliatory 32 +accurate 32 \ No newline at end of file diff --git a/resources/nltk_data/tokenizers/punkt_tab/english/sent_starters.txt b/resources/nltk_data/tokenizers/punkt_tab/english/sent_starters.txt new file mode 100644 index 0000000000000000000000000000000000000000..478fd8334c5508d522b87a2ba7c06c38f56bf7b6 --- /dev/null +++ b/resources/nltk_data/tokenizers/punkt_tab/english/sent_starters.txt @@ -0,0 +1,39 @@ +most +he +since +so +both +these +it +nevertheless +this +indeed +however +instead +under +similarly +some +though +while +when +in +despite +although +nonetheless +thus +there +if +the +nor +separately +moreover +but +they +yet +many +according +sales +among +meanwhile +even +i \ No newline at end of file diff --git a/scripts/baselines/generate_all_baselines.sh b/scripts/baselines/generate_all_baselines.sh new file mode 100644 index 0000000000000000000000000000000000000000..8536978e1d53f9d77a383afb4cbab95820dff32b --- /dev/null +++ b/scripts/baselines/generate_all_baselines.sh @@ -0,0 +1,7 @@ +# generate all baselines at one go + +bash scripts/baselines/generate_wrap.sh +bash scripts/baselines/generate_selfqa.sh +bash scripts/baselines/generate_longform.sh +bash scripts/baselines/generate_genie.sh +bash scripts/baselines/generate_entigraph.sh \ No newline at end of file diff --git a/scripts/baselines/generate_entigraph.sh b/scripts/baselines/generate_entigraph.sh new file mode 100644 index 0000000000000000000000000000000000000000..ce9cc991bdfbf737abf461af7b75b3d42483806c --- /dev/null +++ b/scripts/baselines/generate_entigraph.sh @@ -0,0 +1,3 @@ +python3 -m baselines.EntiGraph.entigraph --input_file resources/examples/raw_demo.jsonl \ + --data_type raw \ + --output_file cache/data/entigraph.json \ diff --git a/scripts/baselines/generate_genie.sh b/scripts/baselines/generate_genie.sh new file mode 100644 index 0000000000000000000000000000000000000000..0119930dbe99639793589482e4ca07226ad58331 --- /dev/null +++ b/scripts/baselines/generate_genie.sh @@ -0,0 +1,3 @@ +python3 -m baselines.Genie.genie --input_file resources/examples/raw_demo.jsonl \ + --data_type raw \ + --output_file cache/data/genie.json \ diff --git a/scripts/baselines/generate_longform.sh b/scripts/baselines/generate_longform.sh new file mode 100644 index 0000000000000000000000000000000000000000..d7ed70c515c22e6f0b624eace4eaf5c7320d35f4 --- /dev/null +++ b/scripts/baselines/generate_longform.sh @@ -0,0 +1,3 @@ +python3 -m baselines.LongForm.longform --input_file resources/examples/raw_demo.jsonl \ + --data_type raw \ + --output_file cache/data/longform.json \ diff --git a/scripts/baselines/generate_selfqa.sh b/scripts/baselines/generate_selfqa.sh new file mode 100644 index 0000000000000000000000000000000000000000..18eb7b1f9fdff1fd41857ea791218d5cba6ee3b1 --- /dev/null +++ b/scripts/baselines/generate_selfqa.sh @@ -0,0 +1,3 @@ +python3 -m baselines.SELF-QA.self-qa --input_file resources/examples/raw_demo.jsonl \ + --data_type raw \ + --output_file cache/data/self-qa.json \ diff --git a/scripts/baselines/generate_wrap.sh b/scripts/baselines/generate_wrap.sh new file mode 100644 index 0000000000000000000000000000000000000000..f10857a58cfa8ecc6aed0e8794e8f8ccbb1fcc8b --- /dev/null +++ b/scripts/baselines/generate_wrap.sh @@ -0,0 +1,3 @@ +python3 -m baselines.Wrap.wrap --input_file resources/examples/raw_demo.jsonl \ + --data_type raw \ + --output_file cache/data/wrap.json \ diff --git a/scripts/evaluate.sh b/scripts/evaluate.sh new file mode 100644 index 0000000000000000000000000000000000000000..25706d4866b9ae4c218a0fe2d1195b0d4befd075 --- /dev/null +++ b/scripts/evaluate.sh @@ -0,0 +1,4 @@ +python3 -m graphgen.evaluate --folder cache/data \ + --output cache/output \ + --reward "OpenAssistant/reward-model-deberta-v3-large-v2,BAAI/IndustryCorpus2_DataRater" \ + --uni MingZhong/unieval-sum \ diff --git a/scripts/generate.sh b/scripts/generate.sh new file mode 100644 index 0000000000000000000000000000000000000000..be0bee9b2342e178c44e6385b17d11c14a0fbdd5 --- /dev/null +++ b/scripts/generate.sh @@ -0,0 +1 @@ +python3 -m graphgen.generate --config_file graphgen/configs/graphgen_config.yaml --output_dir cache/ diff --git a/scripts/judge.sh b/scripts/judge.sh new file mode 100644 index 0000000000000000000000000000000000000000..f6fc134e4fdc15b3e55a6eb75cbf66e40eabc4d4 --- /dev/null +++ b/scripts/judge.sh @@ -0,0 +1,2 @@ +python3 -m graphgen.judge --input cache \ + --output cache/output/new_graph.graphml \ diff --git a/setup.py b/setup.py new file mode 100644 index 0000000000000000000000000000000000000000..3dee7f8be40c05459db9ffaed23f2022f4bbfabd --- /dev/null +++ b/setup.py @@ -0,0 +1,64 @@ +import os + +from setuptools import find_packages, setup + +pwd = os.path.dirname(__file__) +version_file = 'graphgen/version.py' + + +def readme(): + with open(os.path.join(pwd, 'README.md'), encoding='utf-8') as f: + content = f.read() + return content + + +def get_version(): + with open(os.path.join(pwd, version_file), 'r') as f: + exec(compile(f.read(), version_file, 'exec')) + return locals()['__version__'] + + +def read_requirements(): + lines = [] + with open('requirements.txt', 'r') as f: + for line in f.readlines(): + if line.startswith('#'): + continue + if 'textract' in line: + continue + if len(line) > 0: + lines.append(line) + return lines + + +install_packages = read_requirements() + +if __name__ == '__main__': + setup( + name='graphg', + version=get_version(), + url='https://github.com/open-sciencelab/GraphGen', + description= # noqa E251 + 'GraphGen: Enhancing Supervised Fine-Tuning for LLMs with Knowledge-Driven Synthetic Data Generation', # noqa E501 + long_description=readme(), + long_description_content_type='text/markdown', + author='open-sciencelab', + author_email='open-sciencelab@pjlab.org.cn', + packages=find_packages(exclude=["models"]), + package_data={ + 'GraphGen': ['configs/*'] + }, + include_package_data=True, + install_requires=install_packages, + classifiers=[ + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Programming Language :: Python :: 3.10', + 'Programming Language :: Python :: 3.11', + 'Programming Language :: Python :: 3.12', + 'Intended Audience :: Developers', + 'Intended Audience :: Education', + 'Intended Audience :: Science/Research', + ], + entry_points={'console_scripts': ['graphgen=graphgen.generate:main']}, + ) diff --git a/webui/__init__.py b/webui/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/webui/app.py b/webui/app.py new file mode 100644 index 0000000000000000000000000000000000000000..7e6f4ebbc95d3965cb3dc5a3582b4f02530ee10a --- /dev/null +++ b/webui/app.py @@ -0,0 +1,519 @@ +import os +import sys +import json +import tempfile + +import pandas as pd +import gradio as gr + +from gradio_i18n import Translate, gettext as _ + +from base import GraphGenParams +from test_api import test_api_connection +from cache_utils import setup_workspace, cleanup_workspace +from count_tokens import count_tokens + +# pylint: disable=wrong-import-position +root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(root_dir) + +from graphgen.graphgen import GraphGen +from graphgen.models import OpenAIModel, Tokenizer, TraverseStrategy +from graphgen.models.llm.limitter import RPM, TPM +from graphgen.utils import set_logger + + +css = """ +.center-row { + display: flex; + justify-content: center; + align-items: center; +} +""" + + +def init_graph_gen(config: dict, env: dict) -> GraphGen: + # Set up working directory + log_file, working_dir = setup_workspace(os.path.join(root_dir, "cache")) + + set_logger(log_file, if_stream=False) + graph_gen = GraphGen( + working_dir=working_dir + ) + + # Set up LLM clients + graph_gen.synthesizer_llm_client = OpenAIModel( + model_name=env.get("SYNTHESIZER_MODEL", ""), + base_url=env.get("SYNTHESIZER_BASE_URL", ""), + api_key=env.get("SYNTHESIZER_API_KEY", ""), + request_limit=True, + rpm= RPM(env.get("RPM", 1000)), + tpm= TPM(env.get("TPM", 50000)), + ) + + graph_gen.trainee_llm_client = OpenAIModel( + model_name=env.get("TRAINEE_MODEL", ""), + base_url=env.get("TRAINEE_BASE_URL", ""), + api_key=env.get("TRAINEE_API_KEY", ""), + request_limit=True, + rpm= RPM(env.get("RPM", 1000)), + tpm= TPM(env.get("TPM", 50000)), + ) + + graph_gen.tokenizer_instance = Tokenizer( + config.get("tokenizer", "cl100k_base")) + + strategy_config = config.get("traverse_strategy", {}) + graph_gen.traverse_strategy = TraverseStrategy( + qa_form=config.get("qa_form"), + expand_method=strategy_config.get("expand_method"), + bidirectional=strategy_config.get("bidirectional"), + max_extra_edges=strategy_config.get("max_extra_edges"), + max_tokens=strategy_config.get("max_tokens"), + max_depth=strategy_config.get("max_depth"), + edge_sampling=strategy_config.get("edge_sampling"), + isolated_node_strategy=strategy_config.get("isolated_node_strategy"), + loss_strategy=str(strategy_config.get("loss_strategy")) + ) + + return graph_gen + +# pylint: disable=too-many-statements +def run_graphgen(params, progress=gr.Progress()): + def sum_tokens(client): + return sum(u["total_tokens"] for u in client.token_usage) + + config = { + "if_trainee_model": params.if_trainee_model, + "input_file": params.input_file, + "tokenizer": params.tokenizer, + "qa_form": params.qa_form, + "web_search": False, + "quiz_samples": params.quiz_samples, + "traverse_strategy": { + "bidirectional": params.bidirectional, + "expand_method": params.expand_method, + "max_extra_edges": params.max_extra_edges, + "max_tokens": params.max_tokens, + "max_depth": params.max_depth, + "edge_sampling": params.edge_sampling, + "isolated_node_strategy": params.isolated_node_strategy, + "loss_strategy": params.loss_strategy + }, + "chunk_size": params.chunk_size, + } + + env = { + "SYNTHESIZER_BASE_URL": params.synthesizer_url, + "SYNTHESIZER_MODEL": params.synthesizer_model, + "TRAINEE_BASE_URL": params.trainee_url, + "TRAINEE_MODEL": params.trainee_model, + "SYNTHESIZER_API_KEY": params.api_key, + "TRAINEE_API_KEY": params.trainee_api_key, + "RPM": params.rpm, + "TPM": params.tpm, + } + + # Test API connection + test_api_connection(env["SYNTHESIZER_BASE_URL"], + env["SYNTHESIZER_API_KEY"], env["SYNTHESIZER_MODEL"]) + if config['if_trainee_model']: + test_api_connection(env["TRAINEE_BASE_URL"], + env["TRAINEE_API_KEY"], env["TRAINEE_MODEL"]) + + # Initialize GraphGen + graph_gen = init_graph_gen(config, env) + graph_gen.clear() + + graph_gen.progress_bar = progress + + try: + # Load input data + file = config['input_file'] + if isinstance(file, list): + file = file[0] + + data = [] + + if file.endswith(".jsonl"): + data_type = "raw" + with open(file, "r", encoding='utf-8') as f: + data.extend(json.loads(line) for line in f) + elif file.endswith(".json"): + data_type = "chunked" + with open(file, "r", encoding='utf-8') as f: + data.extend(json.load(f)) + elif file.endswith(".txt"): + # 读取文件后根据chunk_size转成raw格式的数据 + data_type = "raw" + content = "" + with open(file, "r", encoding='utf-8') as f: + lines = f.readlines() + for line in lines: + content += line.strip() + " " + size = int(config.get("chunk_size", 512)) + chunks = [ + content[i:i + size] for i in range(0, len(content), size) + ] + data.extend([{"content": chunk} for chunk in chunks]) + else: + raise ValueError(f"Unsupported file type: {file}") + + # Process the data + graph_gen.insert(data, data_type) + + if config['if_trainee_model']: + # Generate quiz + graph_gen.quiz(max_samples=config['quiz_samples']) + + # Judge statements + graph_gen.judge() + else: + graph_gen.traverse_strategy.edge_sampling = "random" + # Skip judge statements + graph_gen.judge(skip=True) + + # Traverse graph + graph_gen.traverse() + + # Save output + output_data = graph_gen.qa_storage.data + with tempfile.NamedTemporaryFile( + mode="w", + suffix=".jsonl", + delete=False, + encoding="utf-8") as tmpfile: + json.dump(output_data, tmpfile, ensure_ascii=False) + output_file = tmpfile.name + + synthesizer_tokens = sum_tokens(graph_gen.synthesizer_llm_client) + trainee_tokens = sum_tokens(graph_gen.trainee_llm_client) if config['if_trainee_model'] else 0 + total_tokens = synthesizer_tokens + trainee_tokens + + data_frame = params.token_counter + try: + _update_data = [ + [ + data_frame.iloc[0, 0], + data_frame.iloc[0, 1], + str(total_tokens) + ] + ] + new_df = pd.DataFrame( + _update_data, + columns=data_frame.columns + ) + data_frame = new_df + + except Exception as e: + raise gr.Error(f"DataFrame operation error: {str(e)}") + + return output_file, gr.DataFrame(label='Token Stats', + headers=["Source Text Token Count", "Expected Token Usage", "Token Used"], + datatype="str", + interactive=False, + value=data_frame, + visible=True, + wrap=True) + + except Exception as e: # pylint: disable=broad-except + raise gr.Error(f"Error occurred: {str(e)}") + + finally: + # Clean up workspace + cleanup_workspace(graph_gen.working_dir) + +with (gr.Blocks(title="GraphGen Demo", theme=gr.themes.Glass(), + css=css) as demo): + # Header + gr.Image(value=os.path.join(root_dir, 'resources', 'images', 'logo.png'), + label="GraphGen Banner", + elem_id="banner", + interactive=False, + container=False, + show_download_button=False, + show_fullscreen_button=False) + lang_btn = gr.Radio( + choices=[ + ("English", "en"), + ("简体中文", "zh"), + ], + value="en", + # label=_("Language"), + render=False, + container=False, + elem_classes=["center-row"], + ) + + gr.HTML(""" + + """) + with Translate( + os.path.join(root_dir, 'webui', 'translation.json'), + lang_btn, + placeholder_langs=["en", "zh"], + persistant= + False, # True to save the language setting in the browser. Requires gradio >= 5.6.0 + ): + lang_btn.render() + + gr.Markdown( + value = "# " + _("Title") + "\n\n" + \ + "### [GraphGen](https://github.com/open-sciencelab/GraphGen) " + _("Intro") + ) + + if_trainee_model = gr.Checkbox(label=_("Use Trainee Model"), + value=False, + interactive=True) + + with gr.Accordion(label=_("Model Config"), open=False): + synthesizer_url = gr.Textbox(label="Synthesizer URL", + value="https://api.siliconflow.cn/v1", + info=_("Synthesizer URL Info"), + interactive=True) + synthesizer_model = gr.Textbox(label="Synthesizer Model", + value="Qwen/Qwen2.5-7B-Instruct", + info=_("Synthesizer Model Info"), + interactive=True) + trainee_url = gr.Textbox(label="Trainee URL", + value="https://api.siliconflow.cn/v1", + info=_("Trainee URL Info"), + interactive=True, + visible=if_trainee_model.value is True) + trainee_model = gr.Textbox( + label="Trainee Model", + value="Qwen/Qwen2.5-7B-Instruct", + info=_("Trainee Model Info"), + interactive=True, + visible=if_trainee_model.value is True) + trainee_api_key = gr.Textbox( + label=_("SiliconCloud Token for Trainee Model"), + type="password", + value="", + info="https://cloud.siliconflow.cn/account/ak", + visible=if_trainee_model.value is True) + + + with gr.Accordion(label=_("Generation Config"), open=False): + chunk_size = gr.Slider(label="Chunk Size", + minimum=256, + maximum=4096, + value=512, + step=256, + interactive=True) + tokenizer = gr.Textbox(label="Tokenizer", + value="cl100k_base", + interactive=True) + qa_form = gr.Radio(choices=["atomic", "multi_hop", "aggregated"], + label="QA Form", + value="aggregated", + interactive=True) + quiz_samples = gr.Number(label="Quiz Samples", + value=2, + minimum=1, + interactive=True, + visible=if_trainee_model.value is True) + bidirectional = gr.Checkbox(label="Bidirectional", + value=True, + interactive=True) + + expand_method = gr.Radio(choices=["max_width", "max_tokens"], + label="Expand Method", + value="max_tokens", + interactive=True) + max_extra_edges = gr.Slider( + minimum=1, + maximum=10, + value=5, + label="Max Extra Edges", + step=1, + interactive=True, + visible=expand_method.value == "max_width") + max_tokens = gr.Slider(minimum=64, + maximum=1024, + value=256, + label="Max Tokens", + step=64, + interactive=True, + visible=(expand_method.value + != "max_width")) + + max_depth = gr.Slider(minimum=1, + maximum=5, + value=2, + label="Max Depth", + step=1, + interactive=True) + edge_sampling = gr.Radio( + choices=["max_loss", "min_loss", "random"], + label="Edge Sampling", + value="max_loss", + interactive=True, + visible=if_trainee_model.value is True) + isolated_node_strategy = gr.Radio(choices=["add", "ignore"], + label="Isolated Node Strategy", + value="ignore", + interactive=True) + loss_strategy = gr.Radio(choices=["only_edge", "both"], + label="Loss Strategy", + value="only_edge", + interactive=True) + + with gr.Row(equal_height=True): + with gr.Column(scale=3): + api_key = gr.Textbox( + label=_("SiliconCloud Token"), + type="password", + value="", + info="https://cloud.siliconflow.cn/account/ak") + with gr.Column(scale=1): + test_connection_btn = gr.Button(_("Test Connection")) + + with gr.Blocks(): + with gr.Row(equal_height=True): + with gr.Column(): + rpm = gr.Slider( + label="RPM", + minimum=10, + maximum=10000, + value=1000, + step=100, + interactive=True, + visible=True) + with gr.Column(): + tpm = gr.Slider( + label="TPM", + minimum=5000, + maximum=5000000, + value=50000, + step=1000, + interactive=True, + visible=True) + + + with gr.Blocks(): + with gr.Row(equal_height=True): + with gr.Column(scale=1): + upload_file = gr.File( + label=_("Upload File"), + file_count="single", + file_types=[".txt", ".json", ".jsonl"], + interactive=True, + ) + examples_dir = os.path.join(root_dir, 'webui', 'examples') + gr.Examples(examples=[ + [os.path.join(examples_dir, "txt_demo.txt")], + [os.path.join(examples_dir, "raw_demo.jsonl")], + [os.path.join(examples_dir, "chunked_demo.json")], + ], + inputs=upload_file, + label=_("Example Files"), + examples_per_page=3) + with gr.Column(scale=1): + output = gr.File( + label="Output(See Github FAQ)", + file_count="single", + interactive=False, + ) + + with gr.Blocks(): + token_counter = gr.DataFrame(label='Token Stats', + headers=["Source Text Token Count", "Estimated Token Usage", "Token Used"], + datatype="str", + interactive=False, + visible=False, + wrap=True) + + submit_btn = gr.Button(_("Run GraphGen")) + + # Test Connection + test_connection_btn.click( + test_api_connection, + inputs=[synthesizer_url, api_key, synthesizer_model], + outputs=[]) + + if if_trainee_model.value: + test_connection_btn.click(test_api_connection, + inputs=[trainee_url, api_key, trainee_model], + outputs=[]) + + expand_method.change(lambda method: + (gr.update(visible=method == "max_width"), + gr.update(visible=method != "max_width")), + inputs=expand_method, + outputs=[max_extra_edges, max_tokens]) + + if_trainee_model.change( + lambda use_trainee: [gr.update(visible=use_trainee)] * 5, + inputs=if_trainee_model, + outputs=[trainee_url, trainee_model, quiz_samples, edge_sampling, trainee_api_key]) + + upload_file.change( + lambda x: (gr.update(visible=True)), + inputs=[upload_file], + outputs=[token_counter], + ).then( + count_tokens, + inputs=[upload_file, tokenizer, token_counter], + outputs=[token_counter], + ) + + # run GraphGen + submit_btn.click( + lambda x: (gr.update(visible=False)), + inputs=[token_counter], + outputs=[token_counter], + ) + + submit_btn.click( + lambda *args: run_graphgen(GraphGenParams( + if_trainee_model=args[0], + input_file=args[1], + tokenizer=args[2], + qa_form=args[3], + bidirectional=args[4], + expand_method=args[5], + max_extra_edges=args[6], + max_tokens=args[7], + max_depth=args[8], + edge_sampling=args[9], + isolated_node_strategy=args[10], + loss_strategy=args[11], + synthesizer_url=args[12], + synthesizer_model=args[13], + trainee_model=args[14], + api_key=args[15], + chunk_size=args[16], + rpm=args[17], + tpm=args[18], + quiz_samples=args[19], + trainee_url=args[20], + trainee_api_key=args[21], + token_counter=args[22], + )), + inputs=[ + if_trainee_model, upload_file, tokenizer, qa_form, + bidirectional, expand_method, max_extra_edges, max_tokens, + max_depth, edge_sampling, isolated_node_strategy, + loss_strategy, synthesizer_url, synthesizer_model, trainee_model, + api_key, chunk_size, rpm, tpm, quiz_samples, trainee_url, trainee_api_key, token_counter + ], + outputs=[output, token_counter], + ) + +if __name__ == "__main__": + demo.queue(api_open=False, default_concurrency_limit=2) + demo.launch(server_name='0.0.0.0') diff --git a/webui/base.py b/webui/base.py new file mode 100644 index 0000000000000000000000000000000000000000..32f3ed1094c036108e320d720b6d2ff5ff74daa8 --- /dev/null +++ b/webui/base.py @@ -0,0 +1,31 @@ +from dataclasses import dataclass +from typing import Any + +@dataclass +class GraphGenParams: + """ + GraphGen parameters + """ + if_trainee_model: bool + input_file: str + tokenizer: str + qa_form: str + bidirectional: bool + expand_method: str + max_extra_edges: int + max_tokens: int + max_depth: int + edge_sampling: str + isolated_node_strategy: str + loss_strategy: str + synthesizer_url: str + synthesizer_model: str + trainee_model: str + api_key: str + chunk_size: int + rpm: int + tpm: int + quiz_samples: int + trainee_url: str + trainee_api_key: str + token_counter: Any diff --git a/webui/cache_utils.py b/webui/cache_utils.py new file mode 100644 index 0000000000000000000000000000000000000000..96c7d4d9d414d7c2487f0ebf4f75e12729de5cc0 --- /dev/null +++ b/webui/cache_utils.py @@ -0,0 +1,21 @@ +import os +import uuid +import shutil + +def setup_workspace(folder): + request_id = str(uuid.uuid4()) + os.makedirs(folder, exist_ok=True) + + working_dir = os.path.join(folder, request_id) + os.makedirs(working_dir, exist_ok=True) + + log_dir = os.path.join(folder, "logs") + os.makedirs(log_dir, exist_ok=True) + log_file = os.path.join(log_dir, f"{request_id}.log") + + return log_file, working_dir + + +def cleanup_workspace(folder): + if os.path.exists(folder): + shutil.rmtree(folder) diff --git a/webui/count_tokens.py b/webui/count_tokens.py new file mode 100644 index 0000000000000000000000000000000000000000..53bed59a38dbc65f086d04df6dab376e13683412 --- /dev/null +++ b/webui/count_tokens.py @@ -0,0 +1,60 @@ +import os +import sys +import json +import pandas as pd + +# pylint: disable=wrong-import-position +root_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(root_dir) +from graphgen.models import Tokenizer + +def count_tokens(file, tokenizer_name, data_frame): + if not file or not os.path.exists(file): + return data_frame + + if file.endswith(".jsonl"): + with open(file, "r", encoding='utf-8') as f: + data = [json.loads(line) for line in f] + elif file.endswith(".json"): + with open(file, "r", encoding='utf-8') as f: + data = json.load(f) + data = [item for sublist in data for item in sublist] + elif file.endswith(".txt"): + with open(file, "r", encoding='utf-8') as f: + data = f.read() + chunks = [ + data[i:i + 512] for i in range(0, len(data), 512) + ] + data = [{"content": chunk} for chunk in chunks] + else: + raise ValueError(f"Unsupported file type: {file}") + + tokenizer = Tokenizer(tokenizer_name) + + # Count tokens + token_count = 0 + + for item in data: + if isinstance(item, dict): + content = item.get("content", "") + else: + content = item + token_count += len(tokenizer.encode_string(content)) + + _update_data = [[ + str(token_count), + str(token_count * 50), + "N/A" + ]] + + try: + new_df = pd.DataFrame( + _update_data, + columns=data_frame.columns + ) + data_frame = new_df + + except Exception as e: # pylint: disable=broad-except + print("[ERROR] DataFrame操作异常:", str(e)) + + return data_frame diff --git a/webui/examples/chunked_demo.json b/webui/examples/chunked_demo.json new file mode 100644 index 0000000000000000000000000000000000000000..ad7219a32e7e2e7f67c50ccacb8917e954ec9540 --- /dev/null +++ b/webui/examples/chunked_demo.json @@ -0,0 +1,14 @@ +[ + [ + {"content": "云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。"} + ], + [ + {"content": "隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。"} + ], + [ + {"content": "Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity."} + ], + [ + {"content": "Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture."} + ] +] diff --git a/webui/examples/raw_demo.jsonl b/webui/examples/raw_demo.jsonl new file mode 100644 index 0000000000000000000000000000000000000000..024559a682e5c040a3ee208445ad5b2f1b95266d --- /dev/null +++ b/webui/examples/raw_demo.jsonl @@ -0,0 +1,4 @@ +{"content": "云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。"} +{"content": "隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。"} +{"content": "Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity."} +{"content": "Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture."} diff --git a/webui/examples/txt_demo.txt b/webui/examples/txt_demo.txt new file mode 100644 index 0000000000000000000000000000000000000000..fe8377bc06e8cfac83d9d5aaa1db6e09d7ce3e42 --- /dev/null +++ b/webui/examples/txt_demo.txt @@ -0,0 +1,7 @@ +云南省农业科学院粮食作物研究所于2005年育成早熟品种云粳26号,该品种外观特点为: 颖尖无色、无芒,谷壳黄色,落粒性适中,米粒大,有香味,食味品质好,高抗稻瘟病,适宜在云南中海拔 1 500∼1 800 m 稻区种植。2012年被农业部列为西南稻区农业推广主导品种。 + +隆两优1212 于2017 年引入福建省龙岩市长汀县试种,在长汀县圣丰家庭农场(河田镇南塘村)种植,土壤肥力中等、排灌方便[2],试种面积 0.14 hm^2 ,作烟后稻种植,6 月15 日机播,7月5 日机插,10 月21 日成熟,产量 8.78 t/hm^2 。2018 和2019 年分别在长汀润丰优质稻专业合作社(濯田镇永巫村)和长汀县绿丰优质稻专业合作社(河田镇中街村)作烟后稻进一步扩大示范种植,均采用机播机插机收。2018 年示范面积 4.00 hm^2 ,平均产量 8.72 t/hm^2 ;2019 年示范面积 13.50 hm^2 ,平均产量 8.74 t/hm^2 。经3 a 试种、示范,隆两优1212 表现出分蘖力强、抗性好、抽穗整齐、后期转色好、生育期适中、产量高、适应性好等特点,可作为烟后稻在长汀县推广种植。 + +Grain size is one of the key factors determining grain yield. However, it remains largely unknown how grain size is regulated by developmental signals. Here, we report the identification and characterization of a dominant mutant big grain1 (Bg1-D) that shows an extra-large grain phenotype from our rice T-DNA insertion population. Overexpression of BG1 leads to significantly increased grain size, and the severe lines exhibit obviously perturbed gravitropism. In addition, the mutant has increased sensitivities to both auxin and N-1-naphthylphthalamic acid, an auxin transport inhibitor, whereas knockdown of BG1 results in decreased sensitivities and smaller grains. Moreover, BG1 is specifically induced by auxin treatment, preferentially expresses in the vascular tissue of culms and young panicles, and encodes a novel membrane-localized protein, strongly suggesting its role in regulating auxin transport. Consistent with this finding, the mutant has increased auxin basipetal transport and altered auxin distribution, whereas the knockdown plants have decreased auxin transport. Manipulation of BG1 in both rice and Arabidopsis can enhance plant biomass, seed weight, and yield. Taking these data together, we identify a novel positive regulator of auxin response and transport in a crop plant and demonstrate its role in regulating grain size, thus illuminating a new strategy to improve plant productivity. + +Tiller angle, an important component of plant architecture, greatly influences the grain yield of rice (Oryza sativa L.). Here, we identified Tiller Angle Control 4 (TAC4) as a novel regulator of rice tiller angle. TAC4 encodes a plant-specific, highly conserved nuclear protein. The loss of TAC4 function leads to a significant increase in the tiller angle. TAC4 can regulate rice shoot\n\ngravitropism by increasing the indole acetic acid content and affecting the auxin distribution. A sequence analysis revealed that TAC4 has undergone a bottleneck and become fixed in indica cultivars during domestication and improvement. Our findings facilitate an increased understanding of the regulatory mechanisms of tiller angle and also provide a potential gene resource for the improvement of rice plant architecture. diff --git a/webui/test_api.py b/webui/test_api.py new file mode 100644 index 0000000000000000000000000000000000000000..37727b531fe98bf4b3dff14d453b868a104c4436 --- /dev/null +++ b/webui/test_api.py @@ -0,0 +1,16 @@ +from openai import OpenAI +import gradio as gr + +def test_api_connection(api_base, api_key, model_name): + client = OpenAI(api_key=api_key, base_url=api_base) + try: + response = client.chat.completions.create( + model=model_name, + messages=[{"role": "user", "content": "test"}], + max_tokens=1 + ) + if not response.choices or not response.choices[0].message: + raise gr.Error(f"{model_name}: Invalid response from API") + gr.Success(f"{model_name}: API connection successful") + except Exception as e: + raise gr.Error(f"{model_name}: API connection failed: {str(e)}") diff --git a/webui/translation.json b/webui/translation.json new file mode 100644 index 0000000000000000000000000000000000000000..fef5d57976af98effa50a7e9358210ebdcd80b1e --- /dev/null +++ b/webui/translation.json @@ -0,0 +1,36 @@ +{ + "en": { + "Title": "✨Easy-to-use LLM Training Data Generation Framework✨", + "Intro": "is a framework for synthetic data generation guided by knowledge graphs, designed to tackle challenges for knowledge-intensive QA generation. \n\nBy uploading your text chunks (such as knowledge in agriculture, healthcare, or marine science) and filling in the LLM API key, you can generate the training data required by **[LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory)** and **[xtuner](https://github.com/InternLM/xtuner)** online. We will automatically delete user information after completion.", + "Use Trainee Model": "Use Trainee Model to identify knowledge blind spots, please keep disable for SiliconCloud", + "Synthesizer URL Info": "Base URL for the Synthesizer Model API, use SiliconFlow as default", + "Trainee URL Info": "Base URL for the Trainee Model API, use SiliconFlow as default", + "Synthesizer Model Info": "Model for constructing KGs and generating QAs", + "Trainee Model Info": "Model for training", + "Model Config": "Model Configuration", + "Generation Config": "Generation Config", + "SiliconCloud Token": "SiliconCloud API Key", + "SiliconCloud Token for Trainee Model": "SiliconCloud API Key for Trainee Model", + "Test Connection": "Test Connection", + "Run GraphGen": "Run GraphGen", + "Upload File": "Upload File", + "Example Files": "Example Files" + }, + "zh": { + "Title": "✨开箱即用的LLM训练数据生成框架✨", + "Intro": "是一个基于知识图谱的数据合成框架,旨在知识密集型任务中生成问答。\n\n 上传你的文本块(如农业、医疗、海洋知识),填写 LLM api key,即可在线生成 **[LLaMA-Factory](https://github.com/hiyouga/LLaMA-Factory)**、**[xtuner](https://github.com/InternLM/xtuner)** 所需训练数据。结束后我们将自动删除用户信息。", + "Use Trainee Model": "使用Trainee Model来识别知识盲区,使用硅基流动时请保持禁用", + "Synthesizer URL Info": "调用合成模型API的URL,默认使用硅基流动", + "Trainee URL Info": "调用学生模型API的URL,默认使用硅基流动", + "Synthesizer Model Info": "用于构建知识图谱和生成问答的模型", + "Trainee Model Info": "用于训练的模型", + "Model Config": "模型配置", + "Generation Config": "生成配置", + "SiliconCloud Token": "硅基流动 API Key", + "SiliconCloud Token for Trainee Model": "硅基流动 API Key (学生模型)", + "Test Connection": "测试接口", + "Run GraphGen": "运行GraphGen", + "Upload File": "上传文件", + "Example Files": "示例文件" + } +} \ No newline at end of file