diff --git a/.gitignore b/.gitignore index 2b2b2b35..17f7654f 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,5 @@ caches .fitlog logs/ .fitconfig + +docs/build diff --git a/docs/source/fastNLP.io.loader.rst b/docs/source/fastNLP.io.loader.rst index c1af6c0c..f6c72be8 100644 --- a/docs/source/fastNLP.io.loader.rst +++ b/docs/source/fastNLP.io.loader.rst @@ -2,6 +2,6 @@ fastNLP.io.loader ================= .. automodule:: fastNLP.io.loader - :members: Loader, YelpLoader, YelpFullLoader, YelpPolarityLoader, IMDBLoader, SSTLoader, SST2Loader, ChnSentiCorpLoader, ConllLoader, Conll2003Loader, Conll2003NERLoader, OntoNotesNERLoader, CTBLoader, MsraNERLoader, PeopleDailyNERLoader, WeiboNERLoader, CSVLoader, JsonLoader, CWSLoader, MNLILoader, QuoraLoader, SNLILoader, QNLILoader, RTELoader + :members: Loader, YelpLoader, YelpFullLoader, YelpPolarityLoader, IMDBLoader, SSTLoader, SST2Loader, ChnSentiCorpLoader, ConllLoader, Conll2003Loader, Conll2003NERLoader, OntoNotesNERLoader, CTBLoader, MsraNERLoader, PeopleDailyNERLoader, WeiboNERLoader, CSVLoader, JsonLoader, CWSLoader, MNLILoader, QuoraLoader, SNLILoader, QNLILoader, RTELoader, CoReferenceLoader :inherited-members: diff --git a/docs/source/fastNLP.io.pipe.rst b/docs/source/fastNLP.io.pipe.rst index 3ef9b5a8..ee389e8c 100644 --- a/docs/source/fastNLP.io.pipe.rst +++ b/docs/source/fastNLP.io.pipe.rst @@ -2,6 +2,6 @@ fastNLP.io.pipe =============== .. automodule:: fastNLP.io.pipe - :members: Pipe, CWSPipe, YelpFullPipe, YelpPolarityPipe, SSTPipe, SST2Pipe, IMDBPipe, ChnSentiCorpPipe, Conll2003NERPipe, OntoNotesNERPipe, MsraNERPipe, WeiboNERPipe, PeopleDailyPipe, Conll2003Pipe, MatchingBertPipe, RTEBertPipe, SNLIBertPipe, QuoraBertPipe, QNLIBertPipe, MNLIBertPipe, MatchingPipe, RTEPipe, SNLIPipe, QuoraPipe, QNLIPipe, MNLIPipe + :members: Pipe, CWSPipe, YelpFullPipe, YelpPolarityPipe, SSTPipe, SST2Pipe, IMDBPipe, ChnSentiCorpPipe, Conll2003NERPipe, OntoNotesNERPipe, MsraNERPipe, WeiboNERPipe, PeopleDailyPipe, Conll2003Pipe, MatchingBertPipe, RTEBertPipe, SNLIBertPipe, QuoraBertPipe, QNLIBertPipe, MNLIBertPipe, MatchingPipe, RTEPipe, SNLIPipe, QuoraPipe, QNLIPipe, MNLIPipe, CoReferencePipe :inherited-members: diff --git a/docs/source/fastNLP.modules.encoder.rst b/docs/source/fastNLP.modules.encoder.rst index fceabbdb..cca62d05 100644 --- a/docs/source/fastNLP.modules.encoder.rst +++ b/docs/source/fastNLP.modules.encoder.rst @@ -2,5 +2,5 @@ fastNLP.modules.encoder ======================= .. automodule:: fastNLP.modules.encoder - :members: ConvolutionCharEncoder, LSTMCharEncoder, ConvMaxpool, LSTM, StarTransformer, TransformerEncoder, VarRNN, VarLSTM, VarGRU, MaxPool, MaxPoolWithMask, AvgPool, AvgPoolWithMask, MultiHeadAttention + :members: ConvolutionCharEncoder, LSTMCharEncoder, ConvMaxpool, LSTM, StarTransformer, TransformerEncoder, VarRNN, VarLSTM, VarGRU, MaxPool, MaxPoolWithMask, AvgPool, AvgPoolWithMask, MultiHeadAttention, BiAttention, SelfAttention diff --git a/docs/source/fastNLP.rst b/docs/source/fastNLP.rst index e01817f7..95d77705 100644 --- a/docs/source/fastNLP.rst +++ b/docs/source/fastNLP.rst @@ -2,7 +2,7 @@ fastNLP ======= .. automodule:: fastNLP - :members: Instance, FieldArray, DataSetIter, BatchIter, TorchLoaderIter, Vocabulary, DataSet, Const, Trainer, Tester, Callback, GradientClipCallback, EarlyStopCallback, TensorboardCallback, LRScheduler, ControlC, LRFinder, Padder, AutoPadder, EngChar2DPadder, AccuracyMetric, SpanFPreRecMetric, ExtractiveQAMetric, Optimizer, SGD, Adam, AdamW, Sampler, SequentialSampler, BucketSampler, RandomSampler, LossFunc, CrossEntropyLoss, L1Loss, BCELoss, NLLLoss, LossInForward, cache_results, logger + :members: Instance, FieldArray, DataSetIter, BatchIter, TorchLoaderIter, Vocabulary, DataSet, Const, Trainer, Tester, Callback, GradientClipCallback, EarlyStopCallback, FitlogCallback, EvaluateCallback, LRScheduler, ControlC, LRFinder, TensorboardCallback, WarmupCallback, SaveModelCallback, EchoCallback, TesterCallback, CallbackException, EarlyStopError, Padder, AutoPadder, EngChar2DPadder, AccuracyMetric, SpanFPreRecMetric, ExtractiveQAMetric, Optimizer, SGD, Adam, AdamW, Sampler, SequentialSampler, BucketSampler, RandomSampler, LossFunc, CrossEntropyLoss, L1Loss, BCELoss, NLLLoss, LossInForward, cache_results, logger :inherited-members: 子模块 diff --git a/fastNLP/io/loader/classification.py b/fastNLP/io/loader/classification.py index ac1bba22..51660db5 100644 --- a/fastNLP/io/loader/classification.py +++ b/fastNLP/io/loader/classification.py @@ -7,7 +7,9 @@ __all__ = [ "IMDBLoader", "SSTLoader", "SST2Loader", - "ChnSentiCorpLoader" + "ChnSentiCorpLoader", + "THUCNewsLoader", + "WeiboSenti100kLoader" ] import glob @@ -396,3 +398,123 @@ class ChnSentiCorpLoader(Loader): """ output_dir = self._get_dataset_path('chn-senti-corp') return output_dir + + +class ChnSentiCorpLoader(Loader): + """ + 支持读取的数据的格式为,第一行为标题(具体内容会被忽略),之后一行为一个sample,第一个制表符之前被认为是label,第 + 一个制表符及之后认为是句子 + + Example:: + + label raw_chars + 1 這間酒店環境和服務態度亦算不錯,但房間空間太小~~ + 1 <荐书> 推荐所有喜欢<红楼>的红迷们一定要收藏这本书,要知道... + 0 商品的不足暂时还没发现,京东的订单处理速度实在.......周二就打包完成,周五才发货... + + 读取后的DataSet具有以下的field + + .. csv-table:: + :header: "raw_chars", "target" + + "這間酒店環境和服務態度亦算不錯,但房間空間太小~~", "1" + "<荐书> 推荐所有喜欢<红楼>...", "1" + "..." + + """ + + def __init__(self): + super().__init__() + + def _load(self, path: str): + """ + 从path中读取数据 + + :param path: + :return: + """ + ds = DataSet() + with open(path, 'r', encoding='utf-8') as f: + f.readline() + for line in f: + line = line.strip() + tab_index = line.index('\t') + if tab_index != -1: + target = line[:tab_index] + raw_chars = line[tab_index + 1:] + if raw_chars: + ds.append(Instance(raw_chars=raw_chars, target=target)) + return ds + + def download(self) -> str: + """ + 自动下载数据,该数据取自https://github.com/pengming617/bert_classification/tree/master/data,在 + https://arxiv.org/pdf/1904.09223.pdf与https://arxiv.org/pdf/1906.08101.pdf有使用 + + :return: + """ + output_dir = self._get_dataset_path('chn-senti-corp') + return output_dir + + +class THUCNewsLoader(Loader): + """ + 别名: + 数据集简介:document-level分类任务,新闻10分类 + 原始数据内容为:每行一个sample,第一个'\t'之前为target,第一个'\t'之后为raw_words + 读取后的Dataset将具有以下数据结构: + + .. csv-table:: + :header: "raw_words", "target" + "马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 ... ", "体育" + "...", "..." + + """ + + def __init__(self): + super(THUCNewsLoader, self).__init__() + + def _load(self, path: str = None): + ds = DataSet() + with open(path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + sep_index = line.index('\t') + raw_chars = line[sep_index + 1:] + target = line[:sep_index] + if raw_chars: + ds.append(Instance(raw_chars=raw_chars, target=target)) + return ds + + +class WeiboSenti100kLoader(Loader): + """ + 别名: + 数据集简介:微博sentiment classification,二分类 + 原始数据内容为: + label text + 0 六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒] + 1 听过一场!笑死了昂,一听茄子脱口秀,从此节操是路人![嘻嘻] //@中国梦网官微:@Pencil彭赛 @茄子脱口秀 [圣诞帽][圣诞树][平安果] + 读取后的Dataset将具有以下数据结构: + + .. csv-table:: + :header: "raw_chars", "target" + "六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒]", "0" + "...", "..." + + """ + + def __init__(self): + super(WeiboSenti100kLoader, self).__init__() + + def _load(self, path: str = None): + ds = DataSet() + with open(path, 'r', encoding='utf-8') as f: + next(f) + for line in f: + line = line.strip() + target = line[0] + raw_chars = line[1:] + if raw_chars: + ds.append(Instance(raw_chars=raw_chars, target=target)) + return ds diff --git a/fastNLP/io/loader/matching.py b/fastNLP/io/loader/matching.py index b713fc9a..df60618b 100644 --- a/fastNLP/io/loader/matching.py +++ b/fastNLP/io/loader/matching.py @@ -6,6 +6,9 @@ __all__ = [ "QNLILoader", "RTELoader", "QuoraLoader", + "BQCorpusLoader", + "XNLILoader", + "LCQMCLoader" ] import os @@ -18,6 +21,8 @@ from .. import DataBundle from ...core.const import Const from ...core.dataset import DataSet from ...core.instance import Instance +from .csv import CSVLoader +from ..utils import check_loader_paths class MNLILoader(Loader): @@ -317,3 +322,145 @@ class QuoraLoader(Loader): def download(self): raise RuntimeError("Quora cannot be downloaded automatically.") + + +class XNLILoader(Loader): + """ + 别名: + 数据集简介:中文句对NLI(本为multi-lingual的数据集,但是这里只取了中文的数据集)。原句子已被MOSES tokenizer处理 + 原始数据为: + train中的数据包括premise,hypo和label三个field + dev和test中的数据为csv或json格式,包括十多个field,这里只取与以上三个field中的数据 + 读取后的Dataset将具有以下数据结构: + + .. csv-table:: + :header: "raw_chars1", "raw_chars2", "target" + "从概念上看,奶油收入有两个基本方面产品和地理.", "产品和地理是什么使奶油抹霜工作.", "1" + ""...", "...", "..." + + """ + + def __init__(self): + super(XNLILoader, self).__init__() + + def _load(self, path: str = None): + csv_loader = CSVLoader(sep='\t') + ds_all = csv_loader._load(path) + ds_zh = DataSet() + for i in ds_all: + if i['language'] == 'zh': + ds_zh.append(Instance(raw_chars1=i['sentence1'], raw_chars2=i['sentence2'], target=i['gold_label'])) + + return ds_zh + + def _load_train(self, path: str = None): + csv_loader = CSVLoader(sep='\t') + ds = csv_loader._load(path) + ds.rename_field('label', 'target') + ds.rename_field('premise', 'raw_chars1') + ds.rename_field('hypo', 'raw_chars2') + ds.apply(lambda i: "".join(i['raw_chars1'].split()), new_field_name='raw_chars1') + ds.apply(lambda i: "".join(i['raw_chars2'].split()), new_field_name='raw_chars2') + return ds + + def load(self, paths: Union[str, Dict[str, str]] = None) -> DataBundle: + if paths is None: + paths = self.download() + paths = check_loader_paths(paths) + datasets = {} + for name, path in paths.items(): + if name == 'train': + datasets[name] = self._load_train(path) + else: + datasets[name] = self._load(path) + + data_bundle = DataBundle(datasets=datasets) + return data_bundle + + +class BQCorpusLoader(Loader): + """ + 别名: + 数据集简介:句子对二分类任务(判断是否具有相同的语义) + 原始数据内容为: + 每行一个sample,第一个','之前为text1,第二个','之前为text2,第二个','之后为target + 第一行为sentence1 sentence2 label + 读取后的Dataset将具有以下数据结构: + + .. csv-table:: + :header: "raw_chars1", "raw_chars2", "target" + "不是邀请的如何贷款?", "我不是你们邀请的客人可以贷款吗?", "1" + "如何满足微粒银行的审核", "建设银行有微粒贷的资格吗", "0" + "...", "...", "..." + + """ + + def __init__(self): + super(BQCorpusLoader, self).__init__() + + def _load(self, path: str = None): + ds = DataSet() + with open(path, 'r', encoding='utf-8') as f: + next(f) + for line in f: + line = line.strip() + target = line[-1] + sep_index = line.index(',') + raw_chars1 = line[:sep_index] + raw_chars2 = line[sep_index + 1:] + + if raw_chars1: + ds.append(Instance(raw_chars1=raw_chars1, raw_chars2=raw_chars2, target=target)) + return ds + + +class LCQMCLoader(Loader): + """ + 别名: + 数据集简介:句对匹配(question matching) + 原始数据为: + '喜欢打篮球的男生喜欢什么样的女生\t爱打篮球的男生喜欢什么样的女生\t1\n' + '晚上睡觉带着耳机听音乐有什么害处吗?\t孕妇可以戴耳机听音乐吗?\t0\n' + 读取后的Dataset将具有以下的数据结构: + + .. csv-table:: + :header: "raw_chars1", "raw_chars2", "target" + "喜欢打篮球的男生喜欢什么样的女生?", "爱打篮球的男生喜欢什么样的女生?", "1" + "晚上睡觉带着耳机听音乐有什么害处吗?", "妇可以戴耳机听音乐吗?", "0" + ""...", "...", "..." + + """ + + def __init__(self): + super(LCQMCLoader, self).__init__() + + def _load(self, path: str = None): + ds = DataSet() + with open(path, 'r', encoding='utf-8') as f: + for line in f: + line = line.strip() + line_segments = line.split('\t') + assert len(line_segments) == 3 + + target = line_segments[-1] + + raw_chars1 = line_segments[0] + raw_chars2 = line_segments[1] + + if raw_chars1: + ds.append(Instance(raw_chars1=raw_chars1, raw_chars2=raw_chars2, target=target)) + return ds + + ''' + def download(self)->str: + """ + 自动下载数据,该数据取自论文 LCQMC: A Large-scale Chinese Question Matching Corpus. + InProceedings of the 27thInternational Conference on Computational Linguistics. 1952–1962. + + :return: + """ + output_dir = self._get_dataset_path('chn-senti-corp') + return output_dir + ''' + + diff --git a/fastNLP/io/pipe/classification.py b/fastNLP/io/pipe/classification.py index b1d150aa..db791ae8 100644 --- a/fastNLP/io/pipe/classification.py +++ b/fastNLP/io/pipe/classification.py @@ -6,7 +6,9 @@ __all__ = [ "SSTPipe", "SST2Pipe", 'IMDBPipe', - "ChnSentiCorpPipe" + "ChnSentiCorpPipe", + "THUCNewsPipe", + "WeiboSenti100kPipe" ] import re @@ -17,7 +19,7 @@ from nltk import Tree from .pipe import Pipe from .utils import get_tokenizer, _indexize, _add_words_field, _drop_empty_instance, _add_chars_field from ..data_bundle import DataBundle -from ..loader.classification import ChnSentiCorpLoader +from ..loader.classification import ChnSentiCorpLoader, THUCNewsLoader, WeiboSenti100kLoader from ..loader.classification import IMDBLoader, YelpFullLoader, SSTLoader, SST2Loader, YelpPolarityLoader from ...core.const import Const from ...core.dataset import DataSet @@ -580,4 +582,200 @@ class ChnSentiCorpPipe(Pipe): data_bundle = ChnSentiCorpLoader().load(paths) data_bundle = self.process(data_bundle) - return data_bundle \ No newline at end of file + return data_bundle + + +class THUCNewsPipe(_CLSPipe): + """ + 处理之后的DataSet有以下的结构 + + .. csv-table:: + :header: "raw_chars", "chars", "target", "seq_len" + + "马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道...", "[409, 1197, 2146, 213, ...]", 0, 746 + "..." + + 其中chars, seq_len是input,target是target + + :param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 + 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 + data_bundle.get_vocab('bigrams')获取. + :param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] + 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 + data_bundle.get_vocab('trigrams')获取. + """ + + def __init__(self, bigrams=False, trigrams=False): + super().__init__() + + self.bigrams = bigrams + self.trigrams = trigrams + + def _chracter_split(self, sent): + return list(sent) + # return [w for w in sent] + + def _raw_split(self, sent): + return sent.split() + + def _tokenize(self, data_bundle, field_name=Const.INPUT, new_field_name=None): + new_field_name = new_field_name or field_name + for name, dataset in data_bundle.datasets.items(): + dataset.apply_field(self._chracter_split, field_name=field_name, new_field_name=new_field_name) + return data_bundle + + def process(self, data_bundle: DataBundle): + """ + 可处理的DataSet应具备如下的field + + .. csv-table:: + :header: "raw_words", "target" + "马晓旭意外受伤让国奥警惕 无奈大雨格外青睐殷家军记者傅亚雨沈阳报道 ... ", "体育" + "...", "..." + + :param data_bundle: + :return: + """ + # 根据granularity设置tag + tag_map = {'体育': 0, '财经': 1, '房产': 2, '家居': 3, '教育': 4, '科技': 5, '时尚': 6, '时政': 7, '游戏': 8, '娱乐': 9} + data_bundle = self._granularize(data_bundle=data_bundle, tag_map=tag_map) + + # clean,lower + + # CWS(tokenize) + data_bundle = self._tokenize(data_bundle=data_bundle, field_name='raw_chars', new_field_name='chars') + + input_field_names = [Const.CHAR_INPUT] + + # n-grams + if self.bigrams: + for name, dataset in data_bundle.iter_datasets(): + dataset.apply_field(lambda chars: [c1 + c2 for c1, c2 in zip(chars, chars[1:] + [''])], + field_name=Const.CHAR_INPUT, new_field_name='bigrams') + input_field_names.append('bigrams') + if self.trigrams: + for name, dataset in data_bundle.iter_datasets(): + dataset.apply_field(lambda chars: [c1 + c2 + c3 for c1, c2, c3 in + zip(chars, chars[1:] + [''], chars[2:] + [''] * 2)], + field_name=Const.CHAR_INPUT, new_field_name='trigrams') + input_field_names.append('trigrams') + + # index + data_bundle = _indexize(data_bundle=data_bundle, input_field_names=Const.CHAR_INPUT) + + # add length + for name, dataset in data_bundle.datasets.items(): + dataset.add_seq_len(field_name=Const.CHAR_INPUT, new_field_name=Const.INPUT_LEN) + + input_fields = [Const.TARGET, Const.INPUT_LEN] + input_field_names + target_fields = [Const.TARGET] + + data_bundle.set_input(*input_fields) + data_bundle.set_target(*target_fields) + + return data_bundle + + def process_from_file(self, paths=None): + """ + :param paths: 支持路径类型参见 :class:`fastNLP.io.loader.Loader` 的load函数。 + :return: DataBundle + """ + data_loader = THUCNewsLoader() # 此处需要实例化一个data_loader,否则传入load()的参数为None + data_bundle = data_loader.load(paths) + data_bundle = self.process(data_bundle) + return data_bundle + + +class WeiboSenti100kPipe(_CLSPipe): + """ + 处理之后的DataSet有以下的结构 + + .. csv-table:: + :header: "raw_chars", "chars", "target", "seq_len" + + "六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒]", "[0, 690, 18, ...]", 0, 56 + "..." + + 其中chars, seq_len是input,target是target + + :param bool bigrams: 是否增加一列bigrams. bigrams的构成是['复', '旦', '大', '学', ...]->["复旦", "旦大", ...]。如果 + 设置为True,返回的DataSet将有一列名为bigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 + data_bundle.get_vocab('bigrams')获取. + :param bool trigrams: 是否增加一列trigrams. trigrams的构成是 ['复', '旦', '大', '学', ...]->["复旦大", "旦大学", ...] + 。如果设置为True,返回的DataSet将有一列名为trigrams, 且已经转换为了index并设置为input,对应的vocab可以通过 + data_bundle.get_vocab('trigrams')获取. + """ + + def __init__(self, bigrams=False, trigrams=False): + super().__init__() + + self.bigrams = bigrams + self.trigrams = trigrams + + def _chracter_split(self, sent): + return list(sent) + + def _tokenize(self, data_bundle, field_name=Const.INPUT, new_field_name=None): + new_field_name = new_field_name or field_name + for name, dataset in data_bundle.datasets.items(): + dataset.apply_field(self._chracter_split, field_name=field_name, new_field_name=new_field_name) + return data_bundle + + + def process(self, data_bundle: DataBundle): + """ + 可处理的DataSet应具备以下的field + + .. csv-table:: + :header: "raw_chars", "target" + "六一出生的?好讽刺…… //@祭春姬:他爸爸是外星人吧 //@面孔小高:现在的孩子都怎么了 [怒][怒][怒]", "0" + "...", "..." + + :param data_bundle: + :return: + """ + # clean,lower + + # CWS(tokenize) + data_bundle = self._tokenize(data_bundle=data_bundle, field_name='raw_chars', new_field_name='chars') + + input_field_names = [Const.CHAR_INPUT] + + # n-grams + if self.bigrams: + for name, dataset in data_bundle.iter_datasets(): + dataset.apply_field(lambda chars: [c1 + c2 for c1, c2 in zip(chars, chars[1:] + [''])], + field_name=Const.CHAR_INPUT, new_field_name='bigrams') + input_field_names.append('bigrams') + if self.trigrams: + for name, dataset in data_bundle.iter_datasets(): + dataset.apply_field(lambda chars: [c1 + c2 + c3 for c1, c2, c3 in + zip(chars, chars[1:] + [''], chars[2:] + [''] * 2)], + field_name=Const.CHAR_INPUT, new_field_name='trigrams') + input_field_names.append('trigrams') + + # index + data_bundle = _indexize(data_bundle=data_bundle, input_field_names='chars') + + # add length + for name, dataset in data_bundle.datasets.items(): + dataset.add_seq_len(field_name=Const.CHAR_INPUT, new_field_name=Const.INPUT_LEN) + + input_fields = [Const.TARGET, Const.INPUT_LEN] + input_field_names + target_fields = [Const.TARGET] + + data_bundle.set_input(*input_fields) + data_bundle.set_target(*target_fields) + + return data_bundle + + def process_from_file(self, paths=None): + """ + :param paths: 支持路径类型参见 :class:`fastNLP.io.loader.Loader` 的load函数。 + :return: DataBundle + """ + data_loader = WeiboSenti100kLoader() # 此处需要实例化一个data_loader,否则传入load()的参数为None + data_bundle = data_loader.load(paths) + data_bundle = self.process(data_bundle) + return data_bundle + diff --git a/fastNLP/io/pipe/matching.py b/fastNLP/io/pipe/matching.py index d6506f66..6bf81085 100644 --- a/fastNLP/io/pipe/matching.py +++ b/fastNLP/io/pipe/matching.py @@ -13,16 +13,20 @@ __all__ = [ "QuoraPipe", "QNLIPipe", "MNLIPipe", + "XNLIPipe", + "BQCorpusPipe", + "LCQMCPipe" ] import warnings from .pipe import Pipe from .utils import get_tokenizer -from ..loader.matching import SNLILoader, MNLILoader, QNLILoader, RTELoader, QuoraLoader +from ..loader.matching import SNLILoader, MNLILoader, QNLILoader, RTELoader, QuoraLoader, BQCorpusLoader, XNLILoader, LCQMCLoader from ...core.const import Const from ...core.vocabulary import Vocabulary from ...core._logger import logger +from ..data_bundle import DataBundle class MatchingBertPipe(Pipe): @@ -110,7 +114,7 @@ class MatchingBertPipe(Pipe): if ('train' not in name) and (ds.has_field(Const.TARGET))] ) if len(target_vocab._no_create_word) > 0: - warn_msg = f"There are {len(tgt_vocab._no_create_word)} target labels" \ + warn_msg = f"There are {len(target_vocab._no_create_word)} target labels" \ f" in {[name for name in data_bundle.datasets.keys() if 'train' not in name]} " \ f"data set but not in train data set!." warnings.warn(warn_msg) @@ -247,7 +251,7 @@ class MatchingPipe(Pipe): if ('train' not in name) and (ds.has_field(Const.TARGET))] ) if len(target_vocab._no_create_word) > 0: - warn_msg = f"There are {len(tgt_vocab._no_create_word)} target labels" \ + warn_msg = f"There are {len(target_vocab._no_create_word)} target labels" \ f" in {[name for name in data_bundle.datasets.keys() if 'train' not in name]} " \ f"data set but not in train data set!." warnings.warn(warn_msg) @@ -302,3 +306,140 @@ class MNLIPipe(MatchingPipe): def process_from_file(self, paths=None): data_bundle = MNLILoader().load(paths) return self.process(data_bundle) + +class LCQMCPipe(MatchingPipe): + def process_from_file(self, paths = None): + data_bundle = LCQMCLoader().load(paths) + data_bundle = RenamePipe().process(data_bundle) + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe().process(data_bundle) + return data_bundle + + +class XNLIPipe(MatchingPipe): + def process_from_file(self, paths = None): + data_bundle = XNLILoader().load(paths) + data_bundle = GranularizePipe(task = 'XNLI').process(data_bundle) + data_bundle = RenamePipe().process(data_bundle) #使中文数据的field + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe().process(data_bundle) + return data_bundle + + +class BQCorpusPipe(MatchingPipe): + def process_from_file(self, paths = None): + data_bundle = BQCorpusLoader().load(paths) + data_bundle = RenamePipe().process(data_bundle) + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe().process(data_bundle) + return data_bundle + + +class RenamePipe(Pipe): + def __init__(self, task = 'cn-nli'): + super().__init__() + self.task = task + + def process(self, data_bundle: DataBundle): # rename field name for Chinese Matching dataset + if(self.task == 'cn-nli'): + for name, dataset in data_bundle.datasets.items(): + if (dataset.has_field(Const.RAW_CHARS(0))): + dataset.rename_field(Const.RAW_CHARS(0), Const.RAW_WORDS(0)) # RAW_CHARS->RAW_WORDS + dataset.rename_field(Const.RAW_CHARS(1), Const.RAW_WORDS(1)) + elif (dataset.has_field(Const.INPUTS(0))): + dataset.rename_field(Const.INPUTS(0), Const.CHAR_INPUTS(0)) # WORDS->CHARS + dataset.rename_field(Const.INPUTS(1), Const.CHAR_INPUTS(1)) + dataset.rename_field(Const.RAW_WORDS(0), Const.RAW_CHARS(0)) + dataset.rename_field(Const.RAW_WORDS(1), Const.RAW_CHARS(1)) + else: + raise RuntimeError( + "field name of dataset is not qualified. It should have ether RAW_CHARS or WORDS") + elif(self.task == 'cn-nli-bert'): + for name, dataset in data_bundle.datasets.items(): + if (dataset.has_field(Const.RAW_CHARS(0))): + dataset.rename_field(Const.RAW_CHARS(0), Const.RAW_WORDS(0)) # RAW_CHARS->RAW_WORDS + dataset.rename_field(Const.RAW_CHARS(1), Const.RAW_WORDS(1)) + elif(dataset.has_field(Const.RAW_WORDS(0))): + dataset.rename_field(Const.RAW_WORDS(0), Const.RAW_CHARS(0)) + dataset.rename_field(Const.RAW_WORDS(1), Const.RAW_CHARS(1)) + dataset.rename_field(Const.INPUT, Const.CHAR_INPUT) + else: + raise RuntimeError( + "field name of dataset is not qualified. It should have ether RAW_CHARS or RAW_WORDS" + ) + else: + raise RuntimeError( + "Only support task='cn-nli' or 'cn-nli-bert'" + ) + + return data_bundle + + +class GranularizePipe(Pipe): + def __init__(self, task = None): + super().__init__() + self.task = task + + def _granularize(self, data_bundle, tag_map): + """ + 该函数对data_bundle中'target'列中的内容进行转换。 + + :param data_bundle: + :param dict tag_map: 将target列中的tag做以下的映射,比如{"0":0, "1":0, "3":1, "4":1}, 则会删除target为"2"的instance, + 且将"1"认为是第0类。 + :return: 传入的data_bundle + """ + for name in list(data_bundle.datasets.keys()): + dataset = data_bundle.get_dataset(name) + dataset.apply_field(lambda target: tag_map.get(target, -100), field_name=Const.TARGET, + new_field_name=Const.TARGET) + dataset.drop(lambda ins: ins[Const.TARGET] == -100) + data_bundle.set_dataset(dataset, name) + return data_bundle + + def process(self, data_bundle: DataBundle): + task_tag_dict = { + 'XNLI':{'neutral': 0, 'entailment': 1, 'contradictory': 2, 'contradiction': 2} + } + if self.task in task_tag_dict: + data_bundle = self._granularize(data_bundle=data_bundle, tag_map= task_tag_dict[self.task]) + else: + raise RuntimeError(f"Only support {task_tag_dict.keys()} task_tag_map.") + return data_bundle + + +class MachingTruncatePipe(Pipe): #truncate sentence for bert, modify seq_len + def __init__(self): + super().__init__() + def process(self, data_bundle: DataBundle): + for name, dataset in data_bundle.datasets.items(): + pass + return None + + +class LCQMCBertPipe(MatchingBertPipe): + def process_from_file(self, paths = None): + data_bundle = LCQMCLoader().load(paths) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + return data_bundle + + +class BQCorpusBertPipe(MatchingBertPipe): + def process_from_file(self, paths = None): + data_bundle = BQCorpusLoader().load(paths) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + return data_bundle + + +class XNLIBertPipe(MatchingBertPipe): + def process_from_file(self, paths = None): + data_bundle = XNLILoader().load(paths) + data_bundle = GranularizePipe(task='XNLI').process(data_bundle) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + data_bundle = self.process(data_bundle) + data_bundle = RenamePipe(task='cn-nli-bert').process(data_bundle) + return data_bundle diff --git a/fastNLP/io/utils.py b/fastNLP/io/utils.py index e1de2ae7..496aee77 100644 --- a/fastNLP/io/utils.py +++ b/fastNLP/io/utils.py @@ -76,15 +76,3 @@ def check_loader_paths(paths: Union[str, Dict[str, str]]) -> Dict[str, str]: raise ValueError("Empty paths is not allowed.") else: raise TypeError(f"paths only supports str and dict. not {type(paths)}.") - - -def get_tokenizer(): - try: - import spacy - spacy.prefer_gpu() - en = spacy.load('en') - logger.info('use spacy tokenizer') - return lambda x: [w.text for w in en.tokenizer(x)] - except Exception as e: - logger.error('use raw tokenizer') - return lambda x: x.split() diff --git a/fastNLP/models/snli.py b/fastNLP/models/snli.py index 9a48f967..1661d191 100644 --- a/fastNLP/models/snli.py +++ b/fastNLP/models/snli.py @@ -15,6 +15,7 @@ from .base_model import BaseModel from ..core.const import Const from ..core.utils import seq_len_to_mask from ..embeddings.embedding import TokenEmbedding, Embedding +from ..modules.encoder import BiAttention class ESIM(BaseModel): @@ -50,7 +51,7 @@ class ESIM(BaseModel): nn.Linear(8 * hidden_size, hidden_size), nn.ReLU()) nn.init.xavier_uniform_(self.interfere[1].weight.data) - self.bi_attention = SoftmaxAttention() + self.bi_attention = BiAttention() self.rnn_high = BiRNN(self.embedding.embed_size, hidden_size, dropout_rate=dropout_rate) # self.rnn_high = LSTM(hidden_size, hidden_size, dropout=dropout_rate, bidirectional=True,) @@ -174,48 +175,3 @@ class BiRNN(nn.Module): output = torch.cat([output, padding], 1) return output - -def masked_softmax(tensor, mask): - tensor_shape = tensor.size() - reshaped_tensor = tensor.view(-1, tensor_shape[-1]) - - # Reshape the mask so it matches the size of the input tensor. - while mask.dim() < tensor.dim(): - mask = mask.unsqueeze(1) - mask = mask.expand_as(tensor).contiguous().float() - reshaped_mask = mask.view(-1, mask.size()[-1]) - result = F.softmax(reshaped_tensor * reshaped_mask, dim=-1) - result = result * reshaped_mask - # 1e-13 is added to avoid divisions by zero. - result = result / (result.sum(dim=-1, keepdim=True) + 1e-13) - return result.view(*tensor_shape) - - -def weighted_sum(tensor, weights, mask): - w_sum = weights.bmm(tensor) - while mask.dim() < w_sum.dim(): - mask = mask.unsqueeze(1) - mask = mask.transpose(-1, -2) - mask = mask.expand_as(w_sum).contiguous().float() - return w_sum * mask - - -class SoftmaxAttention(nn.Module): - - def forward(self, premise_batch, premise_mask, hypothesis_batch, hypothesis_mask): - similarity_matrix = premise_batch.bmm(hypothesis_batch.transpose(2, 1) - .contiguous()) - - prem_hyp_attn = masked_softmax(similarity_matrix, hypothesis_mask) - hyp_prem_attn = masked_softmax(similarity_matrix.transpose(1, 2) - .contiguous(), - premise_mask) - - attended_premises = weighted_sum(hypothesis_batch, - prem_hyp_attn, - premise_mask) - attended_hypotheses = weighted_sum(premise_batch, - hyp_prem_attn, - hypothesis_mask) - - return attended_premises, attended_hypotheses diff --git a/fastNLP/modules/__init__.py b/fastNLP/modules/__init__.py index 769dc42a..d72d2022 100644 --- a/fastNLP/modules/__init__.py +++ b/fastNLP/modules/__init__.py @@ -36,6 +36,7 @@ __all__ = [ "MaxPool", "MaxPoolWithMask", + "KMaxPool", "AvgPool", "AvgPoolWithMask", diff --git a/fastNLP/modules/encoder/__init__.py b/fastNLP/modules/encoder/__init__.py index 0dfc18de..cbb42d7e 100644 --- a/fastNLP/modules/encoder/__init__.py +++ b/fastNLP/modules/encoder/__init__.py @@ -23,18 +23,21 @@ __all__ = [ "MaxPool", "MaxPoolWithMask", + "KMaxPool", "AvgPool", "AvgPoolWithMask", "MultiHeadAttention", + "BiAttention", + "SelfAttention", ] -from .attention import MultiHeadAttention +from .attention import MultiHeadAttention, BiAttention, SelfAttention from .bert import BertModel from .char_encoder import ConvolutionCharEncoder, LSTMCharEncoder from .conv_maxpool import ConvMaxpool from .lstm import LSTM -from .pooling import MaxPool, MaxPoolWithMask, AvgPool, AvgPoolWithMask +from .pooling import MaxPool, MaxPoolWithMask, AvgPool, AvgPoolWithMask, KMaxPool from .star_transformer import StarTransformer from .transformer import TransformerEncoder from .variational_rnn import VarRNN, VarLSTM, VarGRU diff --git a/fastNLP/modules/encoder/attention.py b/fastNLP/modules/encoder/attention.py index 32f59c22..fdfcf0fd 100644 --- a/fastNLP/modules/encoder/attention.py +++ b/fastNLP/modules/encoder/attention.py @@ -1,7 +1,9 @@ """undocumented""" __all__ = [ - "MultiHeadAttention" + "MultiHeadAttention", + "BiAttention", + "SelfAttention", ] import math @@ -15,8 +17,7 @@ from fastNLP.modules.utils import initial_parameter class DotAttention(nn.Module): """ - .. todo:: - 补上文档 + Transformer当中的DotAttention """ def __init__(self, key_size, value_size, dropout=0.0): @@ -45,7 +46,7 @@ class DotAttention(nn.Module): class MultiHeadAttention(nn.Module): """ - + Transformer当中的MultiHeadAttention """ def __init__(self, input_size, key_size, value_size, num_head, dropout=0.1): @@ -104,74 +105,78 @@ class MultiHeadAttention(nn.Module): return output +def _masked_softmax(tensor, mask): + tensor_shape = tensor.size() + reshaped_tensor = tensor.view(-1, tensor_shape[-1]) + + # Reshape the mask so it matches the size of the input tensor. + while mask.dim() < tensor.dim(): + mask = mask.unsqueeze(1) + mask = mask.expand_as(tensor).contiguous().float() + reshaped_mask = mask.view(-1, mask.size()[-1]) + result = F.softmax(reshaped_tensor * reshaped_mask, dim=-1) + result = result * reshaped_mask + # 1e-13 is added to avoid divisions by zero. + result = result / (result.sum(dim=-1, keepdim=True) + 1e-13) + return result.view(*tensor_shape) + + +def _weighted_sum(tensor, weights, mask): + w_sum = weights.bmm(tensor) + while mask.dim() < w_sum.dim(): + mask = mask.unsqueeze(1) + mask = mask.transpose(-1, -2) + mask = mask.expand_as(w_sum).contiguous().float() + return w_sum * mask + + class BiAttention(nn.Module): - r"""Bi Attention module - - .. todo:: - 这个模块的负责人来继续完善一下 - - Calculate Bi Attention matrix `e` - + r""" + Bi Attention module + + 对于给定的两个向量序列 :math:`a_i` 和 :math:`b_j` , BiAttention模块将通过以下的公式来计算attention结果 + .. math:: - + \begin{array}{ll} \\ - e_ij = {a}^{\mathbf{T}}_{i}{b}_{j} \\ - a_i = - b_j = + e_{ij} = {a}^{\mathrm{T}}_{i}{b}_{j} \\ + {\hat{a}}_{i} = \sum_{j=1}^{\mathcal{l}_{b}}{\frac{\mathrm{exp}(e_{ij})}{\sum_{k=1}^{\mathcal{l}_{b}}{\mathrm{exp}(e_{ik})}}}{b}_{j} \\ + {\hat{b}}_{j} = \sum_{i=1}^{\mathcal{l}_{a}}{\frac{\mathrm{exp}(e_{ij})}{\sum_{k=1}^{\mathcal{l}_{a}}{\mathrm{exp}(e_{ik})}}}{a}_{i} \\ \end{array} - - """ - def __init__(self): - super(BiAttention, self).__init__() - self.inf = 10e12 + """ - def forward(self, in_x1, in_x2, x1_len, x2_len): + def forward(self, premise_batch, premise_mask, hypothesis_batch, hypothesis_mask): """ - :param torch.Tensor in_x1: [batch_size, x1_seq_len, hidden_size] 第一句的特征表示 - :param torch.Tensor in_x2: [batch_size, x2_seq_len, hidden_size] 第二句的特征表示 - :param torch.Tensor x1_len: [batch_size, x1_seq_len] 第一句的0/1mask矩阵 - :param torch.Tensor x2_len: [batch_size, x2_seq_len] 第二句的0/1mask矩阵 - :return: torch.Tensor out_x1: [batch_size, x1_seq_len, hidden_size] 第一句attend到的特征表示 - torch.Tensor out_x2: [batch_size, x2_seq_len, hidden_size] 第一句attend到的特征表示 - + :param torch.Tensor premise_batch: [batch_size, a_seq_len, hidden_size] + :param torch.Tensor premise_mask: [batch_size, a_seq_len] + :param torch.Tensor hypothesis_batch: [batch_size, b_seq_len, hidden_size] + :param torch.Tensor hypothesis_mask: [batch_size, b_seq_len] + :return: torch.Tensor attended_premises: [batch_size, a_seq_len, hidden_size] + torch.Tensor attended_hypotheses: [batch_size, b_seq_len, hidden_size] """ + similarity_matrix = premise_batch.bmm(hypothesis_batch.transpose(2, 1) + .contiguous()) - assert in_x1.size()[0] == in_x2.size()[0] - assert in_x1.size()[2] == in_x2.size()[2] - # The batch size and hidden size must be equal. - assert in_x1.size()[1] == x1_len.size()[1] and in_x2.size()[1] == x2_len.size()[1] - # The seq len in in_x and x_len must be equal. - assert in_x1.size()[0] == x1_len.size()[0] and x1_len.size()[0] == x2_len.size()[0] - - batch_size = in_x1.size()[0] - x1_max_len = in_x1.size()[1] - x2_max_len = in_x2.size()[1] - - in_x2_t = torch.transpose(in_x2, 1, 2) # [batch_size, hidden_size, x2_seq_len] - - attention_matrix = torch.bmm(in_x1, in_x2_t) # [batch_size, x1_seq_len, x2_seq_len] - - a_mask = x1_len.le(0.5).float() * -self.inf # [batch_size, x1_seq_len] - a_mask = a_mask.view(batch_size, x1_max_len, -1) - a_mask = a_mask.expand(-1, -1, x2_max_len) # [batch_size, x1_seq_len, x2_seq_len] - b_mask = x2_len.le(0.5).float() * -self.inf - b_mask = b_mask.view(batch_size, -1, x2_max_len) - b_mask = b_mask.expand(-1, x1_max_len, -1) # [batch_size, x1_seq_len, x2_seq_len] - - attention_a = F.softmax(attention_matrix + a_mask, dim=2) # [batch_size, x1_seq_len, x2_seq_len] - attention_b = F.softmax(attention_matrix + b_mask, dim=1) # [batch_size, x1_seq_len, x2_seq_len] + prem_hyp_attn = _masked_softmax(similarity_matrix, hypothesis_mask) + hyp_prem_attn = _masked_softmax(similarity_matrix.transpose(1, 2) + .contiguous(), + premise_mask) - out_x1 = torch.bmm(attention_a, in_x2) # [batch_size, x1_seq_len, hidden_size] - attention_b_t = torch.transpose(attention_b, 1, 2) - out_x2 = torch.bmm(attention_b_t, in_x1) # [batch_size, x2_seq_len, hidden_size] + attended_premises = _weighted_sum(hypothesis_batch, + prem_hyp_attn, + premise_mask) + attended_hypotheses = _weighted_sum(premise_batch, + hyp_prem_attn, + hypothesis_mask) - return out_x1, out_x2 + return attended_premises, attended_hypotheses class SelfAttention(nn.Module): """ - Self Attention Module. + 这是一个基于论文 `A structured self-attentive sentence embedding `_ + 的Self Attention Module. """ def __init__(self, input_size, attention_unit=300, attention_hops=10, drop=0.5, initial_method=None, ): @@ -210,9 +215,9 @@ class SelfAttention(nn.Module): def forward(self, input, input_origin): """ - :param torch.Tensor input: [baz, senLen, h_dim] 要做attention的矩阵 - :param torch.Tensor input_origin: [baz , senLen] 原始token的index组成的矩阵,含有pad部分内容 - :return torch.Tensor output1: [baz, multi-head , h_dim] 经过attention操作后输入矩阵的结果 + :param torch.Tensor input: [batch_size, seq_len, hidden_size] 要做attention的矩阵 + :param torch.Tensor input_origin: [batch_size, seq_len] 原始token的index组成的矩阵,含有pad部分内容 + :return torch.Tensor output1: [batch_size, multi-head, hidden_size] 经过attention操作后输入矩阵的结果 :return torch.Tensor output2: [1] attention惩罚项,是一个标量 """ input = input.contiguous() diff --git a/fastNLP/modules/encoder/pooling.py b/fastNLP/modules/encoder/pooling.py index 789b6d26..80ff419d 100644 --- a/fastNLP/modules/encoder/pooling.py +++ b/fastNLP/modules/encoder/pooling.py @@ -3,6 +3,7 @@ __all__ = [ "MaxPool", "MaxPoolWithMask", + "KMaxPool", "AvgPool", "AvgPoolWithMask" ] @@ -27,7 +28,7 @@ class MaxPool(nn.Module): :param ceil_mode: """ super(MaxPool, self).__init__() - assert (1 <= dimension) and (dimension <= 3) + assert dimension in [1, 2, 3], f'Now we only support 1d, 2d, or 3d Pooling' self.dimension = dimension self.stride = stride self.padding = padding @@ -37,12 +38,12 @@ class MaxPool(nn.Module): def forward(self, x): if self.dimension == 1: + x = torch.transpose(x, 1, 2) # [N,L,C] -> [N,C,L] pooling = nn.MaxPool1d( stride=self.stride, padding=self.padding, dilation=self.dilation, kernel_size=self.kernel_size if self.kernel_size is not None else x.size(-1), return_indices=False, ceil_mode=self.ceil_mode ) - x = torch.transpose(x, 1, 2) # [N,L,C] -> [N,C,L] elif self.dimension == 2: pooling = nn.MaxPool2d( stride=self.stride, padding=self.padding, dilation=self.dilation, @@ -50,7 +51,7 @@ class MaxPool(nn.Module): return_indices=False, ceil_mode=self.ceil_mode ) else: - pooling = nn.MaxPool2d( + pooling = nn.MaxPool3d( stride=self.stride, padding=self.padding, dilation=self.dilation, kernel_size=self.kernel_size if self.kernel_size is not None else (x.size(-3), x.size(-2), x.size(-1)), return_indices=False, ceil_mode=self.ceil_mode diff --git a/test/data_for_tests/io/BQCorpus/dev.txt b/test/data_for_tests/io/BQCorpus/dev.txt new file mode 100644 index 00000000..2bd7414e --- /dev/null +++ b/test/data_for_tests/io/BQCorpus/dev.txt @@ -0,0 +1,6 @@ +sentence1,sentence2,label +综合评分不足什么原因,综合评估的依据,0 +什么时候我能使用微粒贷,你就赶快给我开通就行了,0 +如何修改每个月的还款日期,可以申请延期还款日吗?,0 +没什么问的,不能登陆就是我最大的问题了,登录不上,1 +你的意思是不能取现,借到的钱可不可以提出来,1 diff --git a/test/data_for_tests/io/BQCorpus/test.txt b/test/data_for_tests/io/BQCorpus/test.txt new file mode 100644 index 00000000..949583ad --- /dev/null +++ b/test/data_for_tests/io/BQCorpus/test.txt @@ -0,0 +1,6 @@ +sentence1,sentence2,label +你电话号码多少,你们的客服电话是多少?,1 +10000块日利息是多少,0.05%就是借2000块,利息为1块钱一天,1 +17号还款了,我现在想提前几天还,怎么弄,一直按时还款,提前还款,怎么会评估不足,0 +我昨晚申请的,现在钱没到,也没有人联系我,审核多久才会打电话,1 +假如我贷四万还款怎么,18号还款日可以不凌晨扣款,我18日下午还款可以吗,0 diff --git a/test/data_for_tests/io/BQCorpus/train.txt b/test/data_for_tests/io/BQCorpus/train.txt new file mode 100644 index 00000000..f2ac4e84 --- /dev/null +++ b/test/data_for_tests/io/BQCorpus/train.txt @@ -0,0 +1,6 @@ +sentence1,sentence2,label +一天了还是不能登录,你好,用app干嘛但是无法登入,1 +为什么我的钱包点开,没显示微粒贷呀,点击我进入钱包,没有,借款的,提示呀!,1 +什么要求,借款没有,0 +微信注册的手机号停机了,还可以办理吗,没有邀请可以注册嘛,0 +开通微粒贷,开通微粒贷!强烈要求,1 diff --git a/test/data_for_tests/io/ChnSentiCorp/dev.txt b/test/data_for_tests/io/ChnSentiCorp/dev.txt new file mode 100644 index 00000000..9387b569 --- /dev/null +++ b/test/data_for_tests/io/ChnSentiCorp/dev.txt @@ -0,0 +1,7 @@ +label text_a +1 基金痛所有投资项目一样,必须先要有所了解,才能把握分寸,不至于跟风而造成损失。此本基金入门的书是一个不错的选择,不像一般的书一样偏重概念,虽然也涉及到概念,但作者用自己的方式解读,使第一次接触基金的人能更好的理解。内容以非常容易理解的语言象大众普及了基金的很多观念,对于普通基民来说,要想有所收获,必须了解基金界的很多情况,在关键的时候才不会盲目跟风。对于新手,强烈推荐。 +1 系统很好装,LED屏是不错,就是16比9的比例看起来比较长,是14.0的屏。外观比较酷,适合年轻人,键盘模仿SONY的,还不错。 +1 这书的装帧很好的,既适合家庭收藏亦适合阅读了解。了解一个人,通过他的书信,而且是家书,再好不过了,而了解这个人也更了解些那个时代,那个社会,给我们现代人些许启发吧。而我从中也知道了他的学习习惯、方法以及教子方面。比较有收获。软精装的封面,封面要是每个唐老师那个照片就更好了,分上下册便于阅读。内里字体有分别:信是用的启功老师的手写字体,评点是宋体。 +0 屏幕没有坏点和暗点,这个比较不错。配置性价比较高,目前使用已有半个月,基本正常。 +0 典型的国营酒店,管理层缺乏责任心,管理混乱。房间里的大灯镜灯台灯都是坏的,只有一盏床头灯可用,不知道酒店是怎么维护的。最可气的是结帐时竟然要求客人赔偿房间里已损坏很久的鞋盒,简直是讹诈。 +0 普通游客旅馆 还三星 让我伤心 店名好大 奇差无比 补充点评 2006年12月8日 : 还说有地下车库 谁敢下去 晕 狭小 黑暗 要卡壳儿的 CTRIP上怎么让它这么忽悠顾客的 ?!!!!!!! diff --git a/test/data_for_tests/io/ChnSentiCorp/test.txt b/test/data_for_tests/io/ChnSentiCorp/test.txt new file mode 100644 index 00000000..35f7d2c5 --- /dev/null +++ b/test/data_for_tests/io/ChnSentiCorp/test.txt @@ -0,0 +1,7 @@ +label text_a +0 v系统和XP系统能做到二选一就更好了,毕竟大部分人还是更偏爱XP系统。 +0 自带的Linix系统上上网还可以,想玩其他的功能毫无疑问得换XP.偶在京东订的时候为了装XP方便,一起买了阿帕奇的USB光驱。到货后,发现该USB光驱无法引导系统光盘启动,已验证过该光驱读写功能正常。 +1 非常不错的酒店,依山傍水,里面大片森林,散散步很不错,坐在湖边也休息也是不错的选择;房间很幽静,房间的设施很好,服务员态度也很好。 +0 5月8日付款成功,当当网显示5月10日发货,可是至今还没看到货物,也没收到任何通知,简不知怎么说好!!! +1 收到书,还未打开就被封面的鲜艳色彩及版样吸引,迫不急待的打开,书内的设计及彩图也不错,色泽及印刷质量都称的上好,没有味道,贴图也从简入深。价格也不贵。拿回家,小宝贝也很喜欢,我家宝宝只有2岁5个月对于她贴片不太好撕,大一些的贴片要我来帮她撕。不过,今天再玩时已经比昨天撕的好很多了,可以锻炼她的小手呢。等这几本用完了,我想我还会再给她买一些类似的书。 +0 挺失望的,还不如买一本张爱玲文集呢,以<色戒>命名,可这篇文章仅仅10多页,且无头无尾的,完全比不上里面的任意一篇其它文章. diff --git a/test/data_for_tests/io/ChnSentiCorp/train.txt b/test/data_for_tests/io/ChnSentiCorp/train.txt new file mode 100644 index 00000000..9e53f1bd --- /dev/null +++ b/test/data_for_tests/io/ChnSentiCorp/train.txt @@ -0,0 +1,7 @@ +label text_a +1 很好的酒店,很规范植得一住.餐厅一般不应该的,不知道为什么. 宾馆反馈 2008年4月17日 : 餐厅现已重新装修,用餐环境较以前要好的多。谢谢您的宝贵意见! +0 这是我看过文字写得很糟糕的书,因为买了,还是耐着性子看完了,但是总体来说不好,文字、内容、结构都不好 +1 拿房时没大床房了,给我们免费升成套房,这点还蛮满意的。酒店大致不错,有国内五星水准。比国际品牌的要差一点。酒店有点年纪了,维修要加强,比如我们浴室的下水就堵塞不通,这些在客人入住前就该发觉修好。其它都还可以。 +1 开始看了2005年的几位朋友的评价,都不敢去入住。没想到现在改观了很多,房间虽小,但很整洁。下次再来的话,还会选择这个酒店。只是希望宽带能一直免费! +0 本机预装的Vista跟瑞星杀软不兼容,蓝屏,不能进入系统,不能自行卸载!!千万小心别装,用卡巴可以。 +0 跟心灵鸡汤没什么本质区别嘛,至少我不喜欢这样读经典,把经典都解读成这样有点去中国化的味道了 diff --git a/test/data_for_tests/io/LCQMC/dev.txt b/test/data_for_tests/io/LCQMC/dev.txt new file mode 100644 index 00000000..3e253c93 --- /dev/null +++ b/test/data_for_tests/io/LCQMC/dev.txt @@ -0,0 +1,6 @@ +开初婚未育证明怎么弄? 初婚未育情况证明怎么开? 1 +脚气怎么治疗 醋怎么治疗脚气 0 +世界是先有男人还是先有女人 世界上是先有男人还是先有女人 1 +有什么小说软件好用的 那个看小说的阅读器较好 1 +网上兼职是做什么的,手机可以做吗 手机可以做什么网上兼职,拍单子是什么 0 +郑州有什么好玩的地方? 郑州有什么好玩的地方啊 1 diff --git a/test/data_for_tests/io/LCQMC/test.txt b/test/data_for_tests/io/LCQMC/test.txt new file mode 100644 index 00000000..bc694d3a --- /dev/null +++ b/test/data_for_tests/io/LCQMC/test.txt @@ -0,0 +1,5 @@ +谁有狂三这张高清的 这张高清图,谁有 0 +淘宝模特叫什么?急 淘宝的模特她叫什么 1 +不要嘛用韩语怎么说 韩语的请不要走怎么说 0 +倒瓜子脸适合什么发型 额头高又是瓜子脸的女生适合什么刘海 0 +淘宝流量怎么买 刚淘宝店如何才能有流量 0 diff --git a/test/data_for_tests/io/LCQMC/train.txt b/test/data_for_tests/io/LCQMC/train.txt new file mode 100644 index 00000000..9f6d4924 --- /dev/null +++ b/test/data_for_tests/io/LCQMC/train.txt @@ -0,0 +1,6 @@ +喜欢打篮球的男生喜欢什么样的女生 爱打篮球的男生喜欢什么样的女生 1 +你帮我设计小说的封面吧 谁能帮我给小说设计个封面? 0 +移动手机卡刷砖 关于移动手机卡 0 +有什么好听的短信铃声啊 有什么好听的韩剧短信铃声 0 +人生的三大事是什么 人生三大事是什么? 1 +您好是后8位的 您提供后8位即可, 1 diff --git a/test/data_for_tests/io/THUCNews/dev.txt b/test/data_for_tests/io/THUCNews/dev.txt new file mode 100644 index 00000000..e40ee4a0 --- /dev/null +++ b/test/data_for_tests/io/THUCNews/dev.txt @@ -0,0 +1,9 @@ +体育 调查-您如何评价热火客场胜绿军总分3-1夺赛点?新浪体育讯四年了,终于赢球了,热火在凯尔特人的主场经过加时98-90艰难战胜对手,总比分3-1领先,詹姆斯拿下35分14个篮板,韦德28分9篮板,波什20分12个篮板。您如何评价这场比赛? +娱乐 盘点好莱坞明星新年目标 布兰妮迪亚兹在列(图)新年伊始,又是制定新一年目标的时候了。大到关注环保、寻找真爱,小到改掉坏毛病、改变生活习惯,这些都是美国演艺明星在2009年中的目标。●告别烟圈好莱坞女星卡梅隆·迪亚兹计划在新的一年戒烟,和她目标相同者还有《实习医生格蕾》中的凯瑟琳·海格尔及《飞跃贝弗利》中的布莱恩·奥斯汀·格林。格林说:“每年我似乎都说要戒烟,看看今年行不行吧。”●不咬指甲女歌手布兰妮( 听歌)希望自己“改掉咬手指甲的毛病”。此外,她还表示:“我希望自己不再焦虑,以前的我无时无刻不在焦虑中,我要学会让自己幸福。”●寻觅真爱凭借《灵魂歌王》一片夺得2005年奥斯卡()奖的杰米·福克斯希望自己能在2009年找到真爱。●回归平静去年刚刚与男友分手的影星安妮·海瑟薇则希望过上平静的生活。●享受滑雪因出演《灵异第六感》而一举成名的影星黑利·乔尔·奥斯门特的最大愿望就是重拾自己滑雪的爱好,并从美国犹他州的某座高山上直冲而下。●致力环保曾主演《异形》和《冰风暴》等片的女演员西戈尼·威弗表示要为环保事业贡献力量。她说:“我不再使用塑料袋,手头现有的这些我也要循环使用。”●亲近素食《绝望主妇》中的伊娃·朗格利亚的目标是努力尝试吃素。●活络筋骨热门电视剧《汉娜·蒙塔娜》的主角麦莉·赛勒斯关心的问题则是“多做运动”。●回馈世界要说计划最为抽象的当数帕丽斯·希尔顿,她说:“我已经长大了,成熟了,我要怀着一颗感恩的心,开始回馈世界。”●计划“计划”1983年出演《战争游戏》的马修·布罗德里克的新年计划最别具一格,他的计划就是在2009年“拟订计划”。○据新华社 +家居 蓝景丽家尹勃乐居思路清晰 创新开拓(图)     新浪家居谢娟讯  10月16日,易居中国与新浪合资公司中国房产信息集团(简称CRIC)在美国纳斯达克成功上市。此消息一出,家居业界大腕在分享喜悦的同时,纷纷来电来函,向中国房产信息集团成功登陆纳斯达克表示祝贺,同时对CRIC在未来发展提出了中肯的建议和期待。新浪家居电话连线业内数位大腕,倾听他们对此事的看法,以及对中国房产信息集团上市寄语。【CRIC(中国房产信息集团)纳斯达克挂牌上市】       采访嘉宾:蓝景丽家总经理 尹勃         新浪家居:您好,尹总,我是新浪乐居家居频道编辑谢娟,感谢您接受本次访谈。   尹勃:您好。       新浪家居:北京时间2009年10月16日,易居中国与新浪合资公司中国房产信息集团在美国纳斯达克成功上市融资2亿美元。您是否知道此事?您对此有怎样的看法?       尹勃:刚刚知道!对家居很好的促进作用,希望能够加大北京市场支持力度,给予北京市场更高的重视。   新浪家居:感谢您的肯定。同时也希望您能给予建设性的意见。       尹勃:在罗总的带领下做的比较有声势,目前的思路更清晰。希望乐居做到较其他媒体更有高度,活动更有所创新。   新浪家居:您有怎样的祝语?             尹勃:祝新浪乐居越办越好,带动北京家居市场更上一层楼!      【嘉宾简介】       尹勃:(蓝景丽家总经理 北京市建筑装饰协会家装委员会副会长 北京市场协会家居分会副会长 北京家具协会常务理事 中国建材市场协会理事会副理事长)家居流通卖场一路走来,从昔日倒爷式的地摊、棚户到今天品牌型的综合、主题式购物广场,经历了多少时代的洗礼。尹勃作为这个行业中翘楚企业的负责人,见证了整个家具行业的变迁。名字后面这一连串的职务介绍足以说明他在整个行业中举足轻重的影响力,也更加肯定了他对“蓝景丽家”这个行业航母的巨大贡献。      【推荐阅读】        蓝景丽家十一精彩促销撼京城       百城万店无假货蓝景丽家启动       乐居装修日首战告捷 蓝景丽家销售额逆势暴涨       【媒体声音】      中国证券报:新浪易居合资公司CRIC登陆纳市       上证报:新浪易居合资公司CRIC逆市登陆纳市       第一财经日报:CRIC上市首日市值20亿美元       新华网:新浪与易居合资公司CRIC登陆纳斯达克       专访丁祖昱:CRIC在做前人没有做过的事情       专访罗军:CRIC具有巨大的商业潜力       专访曹国伟:在某些垂直领域会做更多尝试 【更多】     上市背景资料:      美国东部时间10月16日(北京时间10月16日)消息,易居中国与新浪合资公司中国房产信息集团(以下简称CRIC)在美国纳斯达克挂牌上市,首日开盘价12.28美元,超出发行价0.28美元。CRIC为易居中国与新浪的合资公司,股票代码为CRIC,发行价12美元,共发行美国存托股票(ADS)1800万股,同时承销商有权在未来30天内,行使总额达到270万股的超额配售权,此次IPO共计募集资金约2.16亿美元。作为中国在美国的地产科技第一股,CRIC是中国最大的专业房地产信息服务公司,并且拥有同时覆盖线上线下的房地产综合信息和服务平台。CRIC的成功上市,也创造了两家在美国上市的中国公司,分拆各自极具成长力的业务后进行合并,并进行二次上市的先河。CRIC联席董事长、CEO周忻表示;“我们很高兴看到CRIC成功上市,此次IPO将确立CRIC作为中国房地产信息服务第一品牌的地位,并有利于CRIC继续推进国内最大和最先进的房地产信息系统建设,使CRIC成为同时覆盖线上和线下的强大中国房地产网络信息服务平台,为房地产开发商、供应商、专业机构以及个人用户提供多元化房地产信息服务。CRIC联席董事长、新浪CEO曹国伟表示:“CRIC的成功上市,是易居中国和新浪合作的重要一步,也是我们在垂直领域商业模式探索的有益尝试,我们很高兴有机会发挥双方的协同效应。而进一步拓展和深化互联网垂直领域的商机,建立公司在细分市场的核心竞争力并做大做强,这也是新浪未来长远战略的重要组成部分。     +房产 弘阳大厦骏馆开盘 首日热销1亿昨天,位于南京大桥北路69号的红太阳销售中心人头攒动,当天开盘的弘阳大厦·骏馆取得了开门红,由于产品品质高端、户型精致总价又低,吸引了一拨又一拨看房者,当天销售额突破了一个亿。弘阳大厦·骏馆位于南京市浦口区大桥北路西侧,紧邻已建成的旭日华庭金棕榈园区旁,用地总面积6万多平米,包括一个包含酒店公寓、商业及办公的综合楼,一个酒店式公寓以及8万平方米的居住建筑和15000平方米的商业。弘阳大厦作为这块地块中的综合楼,主楼高99.65米,共28层,是集办公、商业、餐饮、公寓为一体的泛配套复合多功能商住楼。此次推出的弘阳大厦·骏馆,是弘阳大厦其中5-22层的酒店式公寓,主力户型为41-75平米商住先锋小户型。由于项目地处桥北新城的核心位置,离市区仅一桥之隔,规划中的地铁与过江隧道近在咫尺,兼具成熟配套资源优势。公共交通也非常方便,131、132、鼓珍、鼓扬、汉江、中六、汉六等多条公交线路可以直达该项目。除了地处桥北核心地段,具备传统的生活多方面配套以外,弘阳大厦·骏馆还拥有同属弘阳集团旗下的华东MALL完美商业配套。 我要评论 +教育 名师解析标准读音在四级考试中的重要性对于中国学生而言,都知道口语和听力很重要,但就是怎么也不好过关,究其原因就是他们英语发音不标准。一、口语。一口标准而流利的口语可以立即提升你的形象,给人以很好的第一印象。举例1:汤姆汉克斯主演的电影《幸福终点站》中有一个情节,大家应该很熟悉:他将a man of mystery“一个神秘的人”读成了a man of misery“一个痛苦的人”,意思相差了十万八千里,自然造成理解障碍。举例2:中文中v和w没有任何区别,说“我wo”的时候,如果上齿咬着下唇的话,也无所谓,因为不会产生任何歧义。但是英文中不一样,这两个音区别很大。vine表示“葡萄藤”;而wine则表示“葡萄酒”。green wine表示“新酒”;而green vine则表示“绿色的葡萄藤”。读错了音意思差别可就大了去了。举例3:一位外国人在中国马路上迷了路,见到一位姑娘,立即冲上前去,说道:“我想吻(问)你...”吓得姑娘连忙跑掉,就是因为读音的问题,外国人在中国也会遭遇理解障碍。二、听力。听力在四级考试中占35%的份额,如果听力不如意的话,考试想要及格真的是很难。听力过程中学生可能会有以下几种体会:1. 根本听不清楚读音——因为不熟悉英文的读音规则;2. 听清了读音,但对应不出是哪个单词——词汇量不够,没有好好记单词;3. 听清了读音,也知道是哪个单词,但忘了啥意思了——还是词汇量不够,对于单词不熟悉;4. 对于spot dictation题型而言,听清了,知道是哪个单词,但就是—写就出现拼写错误——还是词汇没记好。第一,注意单词的读音,英式的和美式的。如:It's very hot today. 中hot美语中几乎就读成了hut这个词的读音了。第二,句子一连读、失去爆破等,连单词的影子都找不到了。如:This-is-an ol(d) pi(c)ture-of-a bi(g) car。横线表示连读,连读起来都不知道到底是一个词还是几个词了,括号里是不发音的,所以这个句子一旦读出来就完全走了样了。但听力中这种现象确是很常见的。要想练习好听力,首先要练习好英文的读音,包括词和句的读音规则。尤其对于外地孩子来说,就更重要了。如湖南的孩子说“我来自湖南”,由于方言影响就成了“我来自弗兰”。而这些人都不认为自己的读音是错误的,所以他听别人这样说的时候也认为是正确的。总之,如果我们平时的读音是错误的话,当听到正确读音时反而会不知道是哪个词,所以要想加强听力,首先要加强自己的读音。(党敏) +时尚 组图:10款艳丽泳装熟女穿出少女情怀导语:时下的泳装注重层次和线条感的悠闲设计,流露出自然的气质。 简洁的色彩搭配,甜美感觉凸显少女情怀,抽象概念化的异域花卉,颜色和谐、明快,印花纱裙,感觉轻盈,细致有女人味。 +时政 台“中选会”称12月5日选举时程不变新华网消息 据台联合晚报报道,台“中选会”上午如期召开幕僚选务会议,仍按原定12月5日举办“三合一”选举时程进行相关作业规划。“中选会”将在9月4日发布选举公告。基于考量莫拉克风灾灾后重建,以及H1N1疫情发烧,有部分蓝绿政治人物倡议延后年底“三合一”选举。据了解,到目前为止,年底“三合一”选举的相关选务作业仍如期进行。“中选会”表示,“中选会”是选务机关,是否延选,仍须由政策决定,在政策未改变前,“中选会”将依既定时程,规划年底“三合一”选举的相关选务作业。 +游戏 《天问》国家系统神秘美丽女儿国初探传说在遥远的西域,有一个神秘美丽的国家,上至国王,下至百姓,全国居民都是美丽温婉的女性。唐僧四师徒一路西行,就是来到了这个风光如画的女性之国。粉色帷幔随风飘扬,阳光照耀着的粉色砖墙闪闪发亮;清澈的泉水边,风情万种的女子们悠闲地编制精美的地毯,蝴蝶在花香中起舞……西梁女国就是一位端坐西域的温柔而美丽的少女,带着神秘的微笑注视来来往往的游客。解阳山是全新的练级场景, 山上微风吹拂,仙鹤悠闲地梳理着翎羽,处处透露平和安逸的气氛。但是山顶一座简陋的道观,竟藏着不少金银财宝?西梁女国百姓最珍视的一口泉水,也隐藏在道观山之上,这里到底隐藏着什么秘密?在解阳山上有一个神秘的副本波月洞,里面溶岩密布,石柱高耸,组成了各种美妙的景观。然而,波月洞盘踞着以毒蝎精领导的一群女妖,这帮妖精已与女儿国争战多年。当群侠得知毒蝎精近来甚至企图绑架女儿国太子,以要挟国王就范时,不论是出于怜香惜玉,还是英雄救美,一场的激烈的战争终将不可避免的开始了…… +科技 五彩时尚MP3 三星U5仅售299元 三星YP-U5(2GB)共有蓝、粉、白、红、黑五种时尚漂亮颜色可供选择。色彩感很浓烈。三星YP-U5(2GB)的背面还提供了一个背夹,再加上五颜六色的款式,使它看上去很像一个美发卡。机身很小巧,三围尺寸只有25×88×11.8mm,重量也只有23g,完全可以随身携带。在机身正面可以看到一个OLED冷光屏,显示的字体比较清晰。三星YP-U5(2GB)可以支持mp3、wma、ogg、Flac音频格式文件播放,此外,它支持三星最新的DNSe代3代音效,5种音效,提供自动、正常、工作室、摇滚、节奏及布鲁斯、舞厅、音乐厅7种选择,也可以进行自定义,对EQ和3D进行调节,效果非常好。除了出色的音乐播放功能以外,三星YP-U5(2GB)还支持FM收音机、歌词显示、MIC录音等功能。编辑点评:U系列是三星主打平价市场的产品,主要针对学生、办公室一族。相信这款音质出众、色彩绚丽的时尚MP3,也将为学生和年轻白领一族的个性生活增添亮丽色彩。    三星YP-U5(2GB)      [参考价格] 299元    [联系方式] 13434155009      diff --git a/test/data_for_tests/io/THUCNews/test.txt b/test/data_for_tests/io/THUCNews/test.txt new file mode 100644 index 00000000..81d00e65 --- /dev/null +++ b/test/data_for_tests/io/THUCNews/test.txt @@ -0,0 +1,9 @@ +体育 凯尔特人vs尼克斯前瞻III纽约背水战 甜瓜必杀令新浪体育讯北京时间4月23日上午7点,凯尔特人将迎移师纽约城,挑战尼克斯,这是两队首轮的第三次交锋。前两场比赛中,小斯和安东尼轮番打出现象级的表现,可惜都无法为尼克斯带来一场胜利。目前凯尔特人总比分2-0领先,对尼克斯而言,他们没有退路。“第三场在主场击败,这是一场必胜的战争,我们根本输不起,这是本赛季为止将要面临的最艰难的一场比赛。”安东尼说。然而运气却不在纽约这边,他们接连以小分差输掉两场,与此同时,比卢普斯和小斯又接连出现伤病,第三场比赛两人的状态仍旧未知,小斯缺席了球队的训练,他在第二场下半场因为背部痉挛休战,但小斯仍希望能够在第三场出战,比卢普斯则有膝伤在身,能否复出还要等赛前决定。第二场比赛中,比卢普斯休战,小斯下半场未打,比尔-沃克全场11投0中,但是尼克斯凭借安东尼的42分17个篮板6次助攻,顽强的将比赛拖到最后一秒,直到最后时刻杰弗里斯的传球被KG抢断,才遗憾落败。德安东尼说:“很遗憾他们两不能上场,但从积极方面看,下半场球队打出的顽强表现,让我们信心满满。”小斯在第一场拿到28分11个篮板,但是安东尼在那场饱受犯规困扰,18投5中只拿到15分,下半场11投1中,尼克斯最终85-87落败,纽约人相信,如果安东尼和小斯同时发挥,他们有很大机会扳倒绿巨人。“我想这是一种精神折磨,你知道自己打得有多努力,有多棒,但两次我们都距离胜利差之毫厘。”安东尼说。第三战将是尼克斯自从2004年4月25日以来,首次在麦迪逊广场花园首次举办季后赛,这座举世闻名的篮球麦加殿堂已有七年未曾染指季后赛。对凯尔特人而言,他们的进攻出现了不少问题,季后赛前两场分别是靠雷-阿伦和凯文-加内特的关键球才勉强击败对手。里弗斯表示,球队表现需要提高,奥尼尔第三场能否出战还是谜,雷-阿伦连续两场打出不俗表现,隆多则在第二场砍下30分7次助攻,他们将尼克斯的命中率限制到35.6%,但与此同时,他们也丢失了大量的防守篮板,上场比赛尼克斯抢下了20个进攻篮板,而凯尔特人只有9个。小斯曾在这轮系列赛中和格伦-戴维斯大打口水仗,此战重回纽约,尼克斯急需他的发挥,接下来就看小斯带伤出战,能为尼克斯提供多少支援了。两队预计首发:凯尔特人:隆多、阿伦、皮尔斯、加内特、小奥尼尔尼克斯:道格拉斯、菲尔德斯、图里亚夫、安东尼、小斯(木瓜丁) +娱乐 独家探班李康生蔡明亮短片《自转》(组图)新浪娱乐讯蔡明亮(阿亮)导演、李康生(小康)演出的银幕组合让两人在国际影坛挣出一席地位,如今两人“角色互换”!李康生执导台湾公视《台北异想》影片中的短片──《自转》,请出已20年没站在镜头前的蔡明亮当演员,阿亮为了爱徒再次“下海”演戏,没想到自称对演员施以爱的教育的小康,拍第一场戏就让阿亮吃了18次NG,现场更放催泪音乐,让感情丰富的阿亮流下真情的眼泪。台湾公视的《台北异想》影片,概念将一天从清晨六点起分为八个时段,邀来李康生、郑芬芬、钮承泽、林靖杰等八位导演,拍摄八部十分钟短片,接力诠释24小时的台北故事。小康选了凌晨四时至六时的时段发挥,他说:“2006年,舞蹈家伍国柱、罗曼菲相继过世让我感触很深,蔡明亮拍摄电影《洞》时,罗曼菲担任舞蹈编排,她直率、认真的性格留给大家很深的印象。因此特别选择她凌晨四点多辞世的时段,拍摄《自转》,也希望将这部短片献给她。”蔡明亮自从20年前曾在电视单元剧中饰演乐团主唱后,即不再以演员身分现身萤光幕前,为了挺爱徒再站镜头前,阿亮坦言,剧中虽只需扮演自己,但被拍仍令他紧张,要不是近几年常受访,被媒体训练出减少对镜头的恐惧,不然他不会让自己名列演员名单中。被阿亮指导演戏惯了的小康,如何回过头来对恩师教戏?他虽说:“我让演员自由发挥,采取『爱的教育』!”但光是陆奕静炒咖啡豆,阿亮静坐咖啡厅一隅,这全剧第一个镜头就磨了十八次,现场播放雷光夏广播录音和林怀民舞作《挽歌》音乐,更催出阿亮的男儿泪,阿亮说:“我就是想到了罗曼菲,更感受到美好的事物都会消失,真想再看一次罗曼菲跳舞。”《自转》的最后一场戏,陆奕静衬着音乐转圈跳舞,阿亮也即兴起舞,但连两天熬夜赶戏体力透支,加上不停转圈,她拍到呕吐、阿亮则晕眩不止,小康却满意称赞:“这两人跳得不错嘛!”小康当导演,从第一场戏折腾演员到末场戏,堪称“有始有终”,蔡明亮笑说:“未来我还是选择继续当导演吧。”台湾特派记者郑伟柏/台北报导 声明:新浪网独家稿件,转载请注明出处。 +家居 打好算盘最省钱瓷砖选购法面对导购小姐的微笑更是心中打鼓:人家说的好像挺有道理,但会觉得说得越好,会不会上当啊,是不是有猫腻呢?本文从建筑卫生陶瓷角度来分析,其它建材选购原理也与之相差无几。瓷砖的选购很讲究,要知道瓷砖这玩意儿一旦铺上了要是再发现有问题,后果是很严重的!下面列出的几点问题是在装修前一定要想清楚的,这些问题往往决定了以后选择瓷砖的种类、规格、价位甚至家居的整体风格。1、到底铺什么?这个问题好像问得很白痴,但这却是最基本的,首先你得充分了解哪些空间适合用哪些瓷砖啊!其实这个问题的关键不是用什么铺地,而是各种材料该怎么搭配。比如:有些业主希望在客厅铺瓷砖,同时在卧室选择木地板,这样问题就产生了:如果客厅铺普通玻化砖,卧室铺强化复合地板,那么卧室与客厅就会存在3cm左右的高度差,这主要是由于强化地板下没有打龙骨造成的。那么是不是在卧室选择实木地板就行了呢?当然不是。通常实木地板由厂家安装都会使用3×2cm的龙骨,如果为了和客厅的瓷砖找平最好使用5×4cm规格的龙骨,但是各个地板厂商对于更换龙骨的服务条款可是不同的。所以要充分与业主沟通,毕竟我们的目的是要让业主满意,了解业主的最基本的要求,然后根据业主的原始思路,找出最合适的方案。如果业主希望选择地板与地砖混铺的方式,就一定要规划好,避免不必要的麻烦。下面介绍两种基本搭配方式:瓷砖+强化地板=铺地板的房间用水泥灰浆垫高3cm,瓷砖+实木地板=地板下采用5×4cm规格的龙骨。2、选择什么规格的地砖?是铺600的?800的?还是1000的或是其它规格的?这是一个问题!现在的地砖,尤其是客厅使用的地砖主要是500mm、600mm、 800mm和1000mm(即1米)等规格,其中使用最多的是600mm和800mm两种。那么该如何选择呢?建议根据铺贴的面积及家具的摆放进行选择。由于单位面积中600mm的砖比800mm的砖铺贴数量要多,所以视觉上能产生空间的扩张感,同时在铺贴边角时的废料率要低于800mm的砖,而空间大时铺800甚至1米规格的砖就显得大气。因此建议小于40平米的空间选择600mm规格的地砖;而大于40平米的空间则可以选择800mm或一米的地砖。值得注意的是,如果在房间中家具过多(如卧室),盖住大块地面时,最好也采用600mm的地砖。3、该铺怎样的砖?到底是选择铺怎样的砖呢?是仿古砖还是抛光砖?仿古砖自然、柔务,在复古风格、尤其是拼花上有着玻化砖无法比拟的优势。同时,由于表面釉层的保护,对于茶水、墨水甚至热烟头的抗污能力也优于玻化砖。但是玻化砖也并非一无是处。随着技术的发展,现在玻化砖表面玻化层的密实度、光洁度已经相当的高,不仅能够使居室显得更加亮堂,还决不会像釉面砖由于外力碰撞、摩擦产生釉面破损的现象。所以选择什么样的砖要根据你要体现的风格,要明亮、大气就选抛光砖,要自然、温馨就选仿古砖。建议居室空间、客厅如果采光相对有限选择玻化砖,而光线充足的客厅和和需防滑的厨房和卫生间地面,及阳台等可选择仿古砖或其它釉面砖。4、“微晶玉”、“微晶石”、“微晶钻”都是什么意思?很多人逛建材城最头疼的恐怕就是记录瓷砖的名字了。什么“微晶玉”、“微晶石”、“微晶钻”、“超炫石”、“聚晶玉”等等。其实大家根本没必要记住这些拗口的名字,它们描述的都是同一种东西——玻化砖,这些名字只是厂商为了区分产品的档次,进一步细化市场而使用的代号罢了。在选择时大家只要坚持自己的预算,尽量选择适合自己的产品就行了。微晶石表面很炫,但其硬度只有莫氏五度左右,不耐磨,不适于用在地面,比较适于用在外墙干挂。 +房产 迪拜危机启示录:空中楼阁迟早要倒塌美国拉斯维加斯,又一家奢侈至极的酒店在这个“罪恶之城”绽放。但此次,相较酒店豪华的各种天价服务和开幕典礼上的好莱坞群星璀璨外,似乎其幕后的主人更吸引人们的眼球--迪拜世界。仅仅一周前,迪拜世界这个名词牵动了世界每个角落的神经。11月25日,迪拜主权财富基金迪拜世界宣布,暂缓偿还债务。根据评级机构穆迪的估算,迪拜的债务预计接近1000亿美元。巨大的数额勾起了人们对去年雷曼兄弟倒闭以来那波汹涌澎湃的国际金融危机的回忆。汇丰、渣打、巴克莱、苏格兰皇家银行等在内的多家银行涉及在内。人们开始担心,我国是否也会因此受到波及。庆幸的是,国内几大商业银行随即申明表示,没有涉及迪拜世界、迪拜政府和其他相关迪拜主权基金及机构发行的债权。有所涉及的,比例也相当的小。记者致电多家研究所银行业分析师,均表示认为此事对国内银行业影响不大,目前没有特别关注。因此,公众的目光从银行投向了导致其债务根源的房地产业。迪拜世界的房产项目,现在已经成为了全世界最大的烂尾楼。而就在这债务问题凸显的时刻,其旗下的“重型”项目却闪亮登场。“城市中心”酒店的开幕,似乎使得地产行业最尴尬的一面展现在了公众眼中。反观我国的地产行业,近期拍卖地王频现,房屋交易价格再次飙升,种种迹象也让人们对其产生了许多担忧。有专家对记者表示,在高速成长时期,楼价和地价互相推动的背后,是资金的不断流入。在那些光鲜的大楼后被后默默支撑的是债券、贷款等各种负债工具。一个原本是沙漠中人口只有十几万的小城,在几乎没有任何实业的基础上,居然吸引了世界上各方的资金,建成了一个人口上百万的豪华都市。房地产市场的巨大利益诱惑在其中占据了重大的因素。不断高涨的楼市,加上免税的便利,使得国际游资疯狂涌入。在聚集了巨大资金后,其所投资的项目遍布世界,美国这次的拉斯维加斯“城市中心”项目,迪拜世界就砸了近50亿美元。这种推动与反推动作用,给予了人们一个璀璨的迪拜,但当问题暴露,留下的却是满目疮痍。“迪拜危机对我们而言更多的是警示作用。”中国社科院金融研究所中国经济评价中心主任刘煜辉在接受《证券日报》记者采访时如此表示。他认为,目前为止迪拜危机对我国银行业的影响不多,但由于有过全球金融危机的影响,心理上的波动是会有的。此外,刘煜辉还告诉记者,任何以过度负债支撑起来的价格上涨或资产泡沫都是需要高度警惕。因为一旦泡沫破裂,就会带来破坏性较强的连锁反应。相信通过这次迪拜危机的警示,国内更多的行业会关注本行业内的负债和泡沫,对于投机性行为和高风险项目将会更加冷静。我要评论 +教育 知名美国私立寄宿中学来华招生行程序号 学校 时间 地点 学校情况 1、北野山中学Northfield Mount Hermon School10月26日 星期三PM1:00 美丽园龙都美国教育部认可的示范型学校2、Cranbrook school10月27日 星期四AM8:40-10:20美丽园龙都每年本校学生的AP考试成绩都位列于全国成绩最好的学校之中3、The Storm King School10月29日 星期六PM4:30上海南京西路1515号嘉里中心1809室纽约州一所私立男女混合精英寄宿中学4、Villanova Preparatory School10月30日 星期日PM1:00-4:00虹桥万豪酒店美国唯一一所的男女混合寄宿制天主教教会学校5、Wyoming Seminary Upper School11月1日 星期二AM10:00香格里拉美国著名的百年贵族名校,也是美国东北部最古老的中学及大学预科学校6、胡桃山音乐学校Walnut Hill School11月2日 星期三PM1:00浦东香格里拉美国最古老的艺术高中7、弗莱堡学校Fryeburg Academy11月3日 星期四PM2:00-6:00上海南京西路1515号嘉里中心1809室一所独特的提供寄宿和走读学习的学校8、St.Johnsbury Academy11月8日 星期二AM9:00-12:00上海南京西路1515号嘉里中心1809室美国中学中拥有最棒校园的男女合校寄宿学校9、波特茅斯教会学校Portsmouth Abbey School11月8日 星期二PM1:00-3:00北京朝阳区建外SOHO,A座9层全国首屈一指的天主教混合住宿学校10、波特茅斯教会学校Portsmouth Abbey School11月15日 星期三PM1:00-4:00上海南京西路1515号嘉里中心1809室全国首屈一指的天主教混合住宿学校11、库欣高中Cushing Academy11月第三周待定美国最悠久男女合校寄宿中学之一12、West NottinghamAcademy11月19日 星期六PM2:00上海南京西路1515号嘉里中心1809室美国最早的学校,245年历史13、格瑞尔女子中学The Grier School11月26日 星期六PM9:45明天广场万豪历史悠久的著名女子寄宿学校14、萨菲尔德学院Suffield Academy11月30日 星期三 待定有170多年历史,是一所男女同校的私立中学15、威利斯顿 • 诺塞普顿中学The Williston Northampton School12月1日 星期四PM2:00-4:00上海南京西路1515号嘉里中心1809室学校以其优质的教学质量而闻名16、菲利普斯埃克塞特Philips Exeter Academy12月2日星期五PM6:30-8:30北京建国饭店牡丹厅(北京建国门外大街5号)“美国高中的哈佛” 、全美国最好的私立寄宿制高中17、菲利普斯埃克塞特Philips Exeter Academy12月3日星期六PM2:30-4:30上海浦东香格里拉浦江楼2层青岛厅“美国高中的哈佛” 、全美国最好的私立寄宿制高中18、菲利普斯埃克塞特Philips Exeter Academy12月5日星期一PM6:30-8:30浙江图书馆1楼文澜厅(杭州西湖区曙光路73号)“美国高中的哈佛” 、全美国最好的私立寄宿制高中19、坎特伯雷中学Canterbury School12月5日  星期一AM9:00-12:00 待定走读与寄宿都有的男女合校20、西城中学/威斯顿中学Westtown School12月5日 星期一AM9:00待定一所拥有205年悠远传统的中学21菲利普斯埃克塞特Philips Exeter Academy12月6日 星期二PM6:30-8:30广州天河区林和中路6号海肮威斯汀酒店5楼蓝厅“美国高中的哈佛” 、全美国最好的私立寄宿制高中22菲利普斯埃克塞特Philips Exeter Academy12月7日 星期三PM6:30-8:30深圳格兰云天酒店26楼云河厅(福田区深南中路3024号)“美国高中的哈佛” 、全美国最好的私立寄宿制高中23Cheshire Academy12月18日 星期日待定美国最早的传统寄宿中学24The Governor’s Academy待定待定美国最古老的寄宿高中之一25Peddie School待定待定著名的具有悠久历史的男女混合寄宿学校26Westover School待定待定美国著名的大学预备女子私立寄宿中学27Rabun Gap-Nacoochee School待定待定一所6-12年级的大学预备住宿走读中学28Ben Lippen School待定待定一所为学生提供大学准备课程的教会学院29George Stevens Academy待定待定一所拥有200多年历史的学校 +时尚 组图:纽约2011时装周 博主编辑街拍自成风景导语:纽约2011春夏时装秀正在如火如荼地进行着,打开任何时尚网站,你都可以看到这RUNWAY秀的图片,所以我不想在这里赘述了,反而我觉得秀场外这些赶赴现场的模特们和时尚博主以及时尚编辑的街拍更有意思。 +时政 台当局开放大陆银联卡在台刷卡消费中国台湾网7月16日消息 据台湾《联合报》报道,台当局“金管会”昨天发布修正“两岸金融业务往来许可办法”,开放大陆银联卡在台刷卡消费。最快9月初大陆民众就可以持银联卡在台刷卡消费,将可提高大陆游客赴台观光、消费意愿,并为台湾每年新增1000亿元(新台币,下同)刷卡商机。岛内银行也将可办理相关收单业务,对收单银行的手续费年收益至少可多出20亿元的贡献。报道称,台当局“金管会银行局副局长”萧长瑞表示,办法发布生效后,“金管会”就可开始受理岛内收单银行、联合信用卡中心等申请,台湾的联合信用卡中心也要跟大陆银联公司签约,估计最快9月初银联卡就可进入台湾。大陆银联卡赴台使用研议多时,消算等技术层面问题一直待克服,昨天“金管会”正式发布相关规定开放银联卡赴台,也代表技术面问题都已解决。根据“金管会”昨天发布的两岸金融业务往来许可办法第二条及第七条之一修正案,明定岛内信用卡业务机构经主管机关许可者,可以与银联公司从事信用卡或转帐卡的业务往来。主要包括银联卡在岛内刷卡消费的收单业务,以及交易授权与清算业务等两项。至于岛内银行发行银联卡的发卡业务则未开放。(高大林) +游戏 腾讯手游在线 《幻想西游》勇创新高根据腾讯QQ游戏中心2009年11月26日显示的在线数据,由腾讯和广州银汉联合运营的《幻想西游》再创新高,同时在线达到54336!54336同时在线一举打破之前的在线记录,创造手机游戏在线新高,这是《幻想西游》的光荣,也是手机游戏界的光荣!罗马不是一天建成的,《幻想西游》运营三年以前,开发组一直注重提升游戏品质和馈玩家,做属于玩家自己的游戏。这次创造在线人数新高,就是对开发组最高的褒奖。11月期间,《幻想西游》举行了“美在西游”系列活动吸引了数千美女玩家报名,6万多玩家参与了本次活动,掀起了11月的活动高潮。11月25日感恩节,开发组成员更是身怀感恩之心,化身GM来到游戏中倾听玩家的心声,并且心甘情愿地被玩家击败后奉上了感恩节礼物。12月将进入“美在西游”决赛阶段,广州银汉笑迎八方客,热情地邀请来自全国各地的美女玩家和跨服帮战优秀代表共聚羊城,共叙三年幻想情,畅谈西游未来路。《幻想西游》是根据名著《西游记》改编的手机网络游戏,具有操作简洁,界面美观,互动性好,娱乐性强的特点,营造出一个充满梦幻的西游世界。进入游戏:手机访问 http://3g.qq.com,选择游戏-网游-幻想手机官网 http://wap.01234.com.cn,选择快速进入 +科技 配18-135mm镜头 佳能7D国庆带票促销中(中关村在线数码影像行情报道)佳能EOS-7D是一款拥有1800万像素成像能力,每秒钟8张连怕性能,并具备高清摄像功能的单反相机。这款单反相机于上周登陆中关村市场,是目前APS-C规格单反中的旗舰机型。今天笔者在市场上了解到,配备有18-135mm防抖镜头的7D套机,价格为13800元带发票。EOS 7D实现了在约1800万有效像素的高画质下,高达约8张/秒的连拍速度。并搭载了高速智能的自动对焦系统等众多新功能。EOS 7D不仅达到了约1800万的有效像素,还实现了低噪点的精细图像表现。其搭载的CMOS图像感应器是佳能自行研发生产的产品。在提高像素感光度的同时,对像素内的晶体管进行了改良实现了更高的S/N(信噪)比。7D的常用ISO感光度为100-6400,扩展ISO感光度最高为12800。图像信号传输是在将单通道序列读取高速化的同时,采用8通道进行高速读取。与EOS 50D相比要快约1.3倍,实现了约8张/秒的高速连拍。另外,对更换镜头时以及反光镜、快门等动作时产生的感应器灰尘也采用了相应的综合除尘措施;同时还搭载了可从相机硬件和附带软件两方面进行除尘的“EOS综合除尘系统”,在除尘功能上考虑得十分周到。快门单元和机身盖采用了不易产生碎屑的特殊材料;即便是不小心进入了灰尘,也可以通过超声波使图像感应器最前面的低通滤镜产生振动将灰尘抖落。低通滤镜表面进行了氟涂层处理,不论是对难以脱落的具有较高粘度的灰尘还是潮湿的灰尘都有着很好的除尘效果。双DIGIC 4数字影像处理器实现了对通过8个通道从图像感应器中高速读取出的,具有约1800万像素的庞大数据的迅速且高精度处理。搭载了2个高性能数字影像处理器DIGIC 4,能够对各种数据进行并行处理,即使是约1800万有效像素也可以实现最高约8张/秒连拍的高速图像处理。EOS 7D搭载了多达19个的自动对焦点,并且提高了每个对焦点的对焦精度。19个对焦点全部采用对应F5.6光束的十字型自动对焦感应器。将用于检测纵向线条的横向线型自动对焦感应器与用于检测横向线条的纵向线型自动对焦感应器呈十字型排列,从而实现了很高的被摄体捕捉能力。中央对焦点在相对于F5.6光束十字型自动对焦感应器的斜方向上配置了对应F2.8光束精度更高的十字型自动对焦感应器。通过中央八向双十字自动对焦感应器的协同工作,实现了高速且高精度的合焦。追踪被摄体的人工智能伺服自动对焦功能也在EOS 7D上得到了大幅的进化。EOS 7D的光学取景器具有约100%的视野率和约1倍(100%)的放大倍率,同时具有29.4°的视角和22毫米的眼点,其光学性能在历代EOS单反相机中也名列前茅。通过视野率约100%的光学取景器观察到的范围与实际拍摄的范围基本一致,因此能够得到非常精确的构图。此外,EOS 7D还在光学取景器内搭载了具有背透型液晶面板的“智能信息显示光学取景器”,它能够在对焦屏上显示网格线和三维电子水准仪等内容。EOS 7D的机身外壳采用了重量轻,刚性高且具有电磁屏蔽效果的镁合金材料。表面涂层采用了与EOS数码单反相机中顶级的EOS-1D系列相同的涂层材料及工艺。此外,EOS 7D还具有防水滴防尘构造,镁合金的外部部件变为高精度接缝构造,电池仓、存储卡插槽盖以及各操作按钮周围等都采用了密封部件,来保护相机的内部。EOS 7D背面的液晶监视器采用了具有160°的广视角(上下左右方向)及高清晰的92万点新型液晶监视器——“3.0"清晰显示液晶监视器II型”,其内部构造也经过重新研发,采用了新技术。7D机身上分别设置了专用的“实时显示/短片拍摄开关 ”和相应的“开始/停止按钮 ”,并且短片拍摄时能够在手动模式下对曝光进行控制。此外,可实现每秒30/25/24帧,分辨率1920×1080像素的全高清短片拍摄,在使用高清画质(分辨率1280×720像素)及标清画质(分辨率640×480像素)时,能够以每秒60/50帧进行拍摄。编辑观点:佳能7D的出现,再一次丰富了E0S产品系列中APS-C规格单反的阵营。佳能也终于有了可以和尼康D300级别单反正面对抗的产品。而出色的性能表现,不论是摄影爱好者还是专业人士,都会对其青睐有加。而上市价格也比较合理,只是希望7D不要重蹈5D II缺货涨价的覆辙。 diff --git a/test/data_for_tests/io/THUCNews/train.txt b/test/data_for_tests/io/THUCNews/train.txt new file mode 100644 index 00000000..65ca8a36 --- /dev/null +++ b/test/data_for_tests/io/THUCNews/train.txt @@ -0,0 +1,9 @@ +体育 火箭这一胜有更多意义 这是联盟最差击败联盟王者根据ESPN记者亨利-艾伯特的报道,对于一支NBA球队来说,在比赛最后24秒落后一两分或者和对方打成平局,这时候得分能力的高下就将决定最后的胜负。根据近五年来的统计,在这样的关键时刻下,联盟里最擅长得分的球队是黄蜂队,而最不擅长得分的球队则是火箭队。今天这两支球队狭路相逢,最后的24秒正是这样的情形。如果根据近5年火箭和黄蜂的表现来开,那火箭输定了。可是,奇迹出现了,火箭在距离比赛还有22秒的时候以88-87领先对手1分,但是他们并未停下得分的脚步,通过马丁和科特尼-李的三次罚球,他们最终让联盟最会把握最后时刻的王者球队黄蜂最终只是在临近终场的时候由大卫-韦斯特投进了无关紧要的一球,而以2分的优势胜出。一向不善于打关键球的火箭队今天却在最后时刻顶住了压力,力挽狂澜,这相当于火箭用自己最差的技能战胜了全联盟此项技能最强的球队。这和我们以往印象中的火箭截然不同。以往火箭总是在最后时刻无人挺身而出。然而马丁的出色发挥保证了火箭在最后时刻对对手篮筐的冲击力,他不断地抢断、造对手犯规,让黄蜂无法跟上火箭的得分脚步。在今天的比赛中,我们没有看到那支曾经缩手缩脚的球队,也许交易截止日期过了之后,所有的球员终于能安心稳定下来打球了吧。所以一度拥有巨大领先优势、穿着庆祝节日盛装队服的黄蜂最后俨然不敢接受这样的现实,我们至少从保罗的眼神中读出了这失望。所以,这场比赛的胜利对于火箭来说有着更深一层的意义。不论火箭是否已经达到脱胎换骨的境界,至少全明星后的四连胜对火箭冲击季后赛这个短期目标来说,是个极好的兆头。(大猩猩) +娱乐 《山楂树》电影比原著还干净 删减情节曝光(图)《山楂树之恋》小说有20万字,要将原著的全部内容压缩到一部110分钟的电影里,实属不易。事实上,电影里删掉了小说原著中的几场吻戏和激情戏的大部分内容,比小说原著还“干净”。张艺谋自己在说到改编的时候也表示,“其实原作中很多情节我都拍了,但是实在是太长了,我希望能将更多的笔墨放在老三和静秋身上,又能让故事平静地娓娓道来,所以剪掉了大半,后来还做了一些字幕将一些年代关系简化掉。 ”删除部分——长林喜欢静秋小说:静秋刚到生产队长家时,队长老婆希望把她说给自己的二儿子长林,而憨厚的长林也确实喜欢静秋。于是他偷偷地以自己的方式表达着他的爱,然而当他知道老三喜欢静秋时,也觉得自己配不上静秋,默默地就收回了自己的这份感情。影片:影片中这个分支被彻底删掉了,长林到静秋家送过一次核桃和冰糖,但都是老三让他去的。不过静秋在队长家吃饭时,队长一一介绍大哥二哥三哥的时候,长林突然间站起来的反常表现,还是可以看出他面对静秋时候的紧张。很显然,张艺谋其实拍了长林这段,但后来剪掉了。大量枝杈人物小说:为了让故事更丰满,小说中有很多配角在不同的阶段出现。例如,为了表现静秋被欺负,安排了王长生、万驼子这样的反面角色,也安排了成医生一家的出场,静秋对于白血病的一些知识都是从成医生那儿得来的。书中的静秋有个哥哥,为了能让哥哥顺利娶媳妇,这一家人也是做了不少牺牲和努力。影片:这些人物不复存在,张艺谋明确表示,为了有充分空间描述静秋和老三的爱情,不得不舍弃。老三的告别信小说:静秋无意中得知老三得了白血病。两人在医院度过了难忘的一夜,静秋向老三表示:“如果你死了,我也去死。 ”因此,老三选择了离开,并留下一封告别信,表示自己根本没得白血病,只是感冒了,而他不打算要静秋了。影片:老三早早就就澄清自己只是感冒,而之后又不告而别,令静秋既迷惑又伤心,那封告别信并没有出现。更多亲密片段小说:虽然号称“史上最干净的爱情”,小说中也有老三亲吻静秋的描写,包括二人在医院度过难忘一夜中“床戏”的描写。影片:张艺谋拍得比作者写得更干净,能算得上亲密的只有老三用军大衣拥静秋入怀,在医院难忘一夜里,老三和静秋手握着手和衣而眠。对此,张艺谋的解释是,对于影片来说,小说中某些场面还是较为“露骨”,毕竟要考虑到国内电影的审查制度,而且两张清纯的面庞经不起附加太多的“性”。作者有话——改编忠实度把握不好而小说《山楂树之恋》的作者艾米,在接受专访时曾表示,电影删掉的原著中的几场吻戏,没什么道理。《山楂树之恋》的主线就是静秋由惧怕“失足”到主动要求“失足”的转变过程,每场吻戏都是这个过程不可或缺的部分。如果去掉,就等于去掉了故事的主线,静秋后来的要求“失足”就会显得突兀。艾米同时指出:“我以为,这两位导演改编的忠实度把握得不好。仅从现在已经透露出的信息来看,就做了几个很没水平的改编。 ”记者 王琳娜 陈妍妮 +家居 物业交地产公司 以月租10万英镑放盘一年(图)   丹尼尔明年9月担纲演百老汇剧《恋马狂》时,正好方便落脚,但他似乎并非如此打算,因为他已把物业交地产公司,以月租10万英镑(150万人民币)放盘一年。租客将可享用会所设施,包括泳池和蒸气浴室,以及酒店公寓服务。 +房产 开发商频频拿地 市场复苏谨防再起炒作风10日,经过50次举牌,广州市城市建设有限公司以总价34500万元夺得广州天河区珠江新城一地块,折合楼面地价15324元/平方米,而此前珠江新城最高楼面地价为11912元/平方米。 今年2月份以来,随着楼市“小阳春”的到来,沉寂了多个月的土地交易市场再起波澜,开发商们在土地收储上的集体爆发引人关注。再露繁荣景象的土地市场反映出房地产企业充足的资本和对后市的信心,同时,随之高涨的地价、房价也让人们担心,新一轮炒地提价的闸门是否已经悄然打开。 信心加资本撬动土地市场全面复苏 从绿地集团(企业专区,旗下楼盘)分别以9.57亿元和12亿元的价格接连拿下上海松江区辰花路15号B地块和徐汇区斜土街道107街坊,创今年上海土地出让价格的新高,到富力地产(企业专区,旗下楼盘)10.22亿元拿下北京广渠门外10号地,再到中洲宝城26.1亿元拿下深圳3宗捆绑商住地块,雅戈尔10.28亿元拿下宁波“地王”。一个多月的时间内,国内“地王”频现。 中国指数研究院最新的统计数据显示,6月1日至7日,全国20个重点城市共推出土地124宗,环比增加25%,推出土地面积608万平方米,环比增加25%,成交土地面积173万平方米,环比增加14%。 “优质地块一直是开发商们收储的对象,只不过去年楼市的低迷抑制了开发商的热情。”易居中国房地产研究院综合部部长杨红旭在接受采访时指出,目前的情况表明冷落已久的土地市场开始复苏,地产商对后市的预期正在转好,信心正在增强。 国内地产巨头万科近日发布的公告显示,在过去的一个多月中,公司已斥资23亿元多处拿地。这与其两个月前对于国内楼市“尚需进一步观察”的谨慎表态形成了鲜明的对比。 万科能在短时间内连连出手,表明公司“不差钱”。上述公告显示,5月份万科实现销售面积69.7万平方米,销售金额64.1亿元,同比分别增长19.3%和19.7%。这一销售额已经接近2007年高峰时期的单月最高纪录。而今年1至5月,万科的销售总额已达238.9亿元,较2008年同期大涨20.9%。 嘉华(中国)投资有限公司总经理助理谷文胜表示,近期国内楼市十分活跃,开发商在短时间内回笼了大量资金,而开发项目资本金比例也降低了15个百分点,这都使开发商的财务状况大大改善,现金流增加,出于持续发展的需要,买地是很自然的。 地价楼价再入上升通道引发担忧 然而伴随着土地市场的不断回暖,房地产市场成交价格的不断冲高也越来越成为人们关心的问题。 根据国家发展改革委、国家统计局调查显示,5月份,全国70个大中城市房屋销售价格同比下降0.6%,降幅比上月缩小0.5个百分点;环比上涨0.6%,涨幅比上月扩大0.2个百分点。 北京、上海、深圳等地不断传出各类楼市涨价新闻,其中北京朝阳区一处楼盘一个月内每平方米房价上涨5000元的消息更是加重了购房者对后市的担忧。就在富力集团高价拿下广渠门外10号地之后,周边的二手房价格就开始跟风上涨,虽然尚无准确的统计数据,但据业内人士透露,部分业主跟风涨价的行为已经在京城房地产市场上营造出了浓浓的涨价氛围。 “现在开发商又在大量买地,土地市场和楼市会不会再像2007年一样被炒出一波高涨的行情?”正准备买房的丁先生向记者表达了自己的担忧。 丁先生的担忧不无道理,一边是高调拿地,一边是悄悄涨价。虽然综合全国土地收储和开发的情况看,开发商先前收储的土地并没有完全消化,市场供求关系也没有发生根本性的变化。但主要开发商在土地市场上的频频出手,还是很容易让人联想起2007年地价、房价交替上涨的火暴局面。 市场复苏谨防再起炒作之风 “目前的土地市场仍处于恢复性增长阶段,尚未到达繁荣期。”面对地产商纷纷布局土地市场的现状,杨红旭表示,现在还处于宏观经济的低谷期,很多开发商仍旧不敢对后市过于乐观。开发商们在土地市场上频频出手、高价成交,虽然客观上会使楼市预期升温。但土地市场的回暖和楼市的回暖毕竟还是两回事。在宏观经济形势没有发生根本性变化之前,盲目看高后市的地产商有可能碰壁。 北京我爱我家市场研究部高级研究员秦瑞表示,开发商高价拿地之后,地块周边二手房的业主常常会盲目跟风追涨,但从目前的市场环境来看,较高的房价只可能吓退对价格特别敏感的刚性需求,进而导致成交量的萎缩,加重市场的观望情绪。 对于一季度的楼市暖春,再次走上炒地涨价之路,无论是对开发商还是中小业主都不一定是件好事。机构分析人士认为,造成目前房价普涨、开发商收地加快的原因,一方面是市场回暖,另一方面是开发商的去库存已接近尾声,开发商注意力将转向购地、新开工面积和涨价上。 不过“去年以来的经验让购房者变聪明了”,秦瑞告诉记者,如果现在开发商或是中小业主盲目利用市场回暖的时机涨价,那么购房者很可能会再次持币观望,交易量的回落不可避免,房价的持续上涨也不会有市场的依托。 把握推地节奏警惕泡沫出现 谷文胜表示,企业决定买地与否的主要根据是对宏观经济形势的判断和对未来的预期,但“也可能是在全球性通胀预期的驱动下进行资产保值的一种选择,毕竟,持有土地的风险要小于持有现金的风险”。 尽管对购买土地是否真能规避通胀风险存有不同意见。但业内人士还是普遍认为,当土地交易市场成为投资市场,泡沫就随时可能浮现。在全球经济尚未好转、国内信贷相对宽松的背景下,如果将土地进行资本化杠杆运作,频频制造高价抢地的现象,泡沫便会被迅速吹大。 目前看来,地方政府较好地掌握了推地节奏,企业也还比较理性,没有盲目抢地的现象。不少房地产企业判断,“只要政府调控得当,今年应该不会出现像2007年那么多的‘地王’”。 长期调研楼市的上海市政协人资环建委员会专职副主任孙钟炬认为,要让房地产业回归理性、减少泡沫,就需要降低房产成本,而地价成本是房价成本的一个重要组成部分。 “拿地还是要谨慎,现在把地价抬得过高,未来可能心生悔意,就如2007年很多高价拿地企业一样。”杨红旭说。(记者 罗宇凡 叶锋) 我要评论 +教育 澳驻华使馆:政府公布多项国际教育新规澳大利亚驻华使领馆教育处17日通报称,澳大利亚移民与公民事务部长克里斯·鲍恩(Chris Bowen)议员及教育、技能、工作和劳资关系部长克里斯·埃文斯(Chris Evans)参议员今日宣布将对学生签证项目进行复审以及为国际教育行业制订的多项具体措施。埃文斯表示,澳币升值,全球金融危机在一些国家的持续影响,以及逐步加剧的来自美国、新西兰和加拿大等国为吸引国际学生而形成的竞争,给澳大利亚国际教育行业带来的压力在不断增加。他说,国际教育行业的规模和性质在过去十年中也发生了剧大的变化,因此我们采取政府各部门间通力合作的方式来应对这些变化是至关重要的。复审担负着提高国际教育行业的持续竞争力和加强优化学生签证项目两项任务,将为教育机构和各利益相关方提供机会,阐述他们对国际教育行业未来的远见卓识。据介绍,吉拉德政府已任命了澳大利亚勋章获得者迈克尔(Michael Knight)负责复审工作,并于2011年中旬向鲍恩和埃文斯提交复审报告。鲍恩指出,复审工作将考察主要利益相关方与学生签证申请要求之间所建立起来的合作伙伴框架,并将就如何建立一个更加有效的合作伙伴框架提出建议。同时还将审视各种更好的针对学生签证案例中移民风险的管理方法,遏制违规及滥用学生签证项目的行为,并考虑各类学生签证对不同教育类别的适宜性。他介绍说,政府还将采取多项措施,在继续坚持优化学生签证项目的同时,精简低风险人群的签证申请审理程序。这些措施有力支撑了政府近期为优化学生签证项目而采取的改革措施,并再次强调技术移民项目应为澳大利亚中长期经济发展提供所需的高端技能。这些措施包括:——按照近期澳大利亚移民与公民事务部进行的评估等级复审的建议,从2011年4月起,降低一些学生签证评估等级。作为这项决策的一部分,来自中国和印度的高等教育类别的学生签证申请评估等级将会被降低;——调整规定使预付的寄宿学校住宿费可以从签证申请所要求的生活费中扣除;——促进政府和国际教育行业间的信息交流,这包括即将在移民部网站上公布学生签证季度统计数据,以便院校跟踪了解学生签证新趋势;——使职业教育与培训(VET)学生签证评估等级(AL)4的签证申请人能够就读证书级别的配套课程,并能满足获得学生签证的要求。使馆介绍说,今天的这项宣布是对最近澳大利亚政府为加强国际教育行业而实施的多项措施的补充。这些措施包括:针对《2000年海外学生教育服务(ESOS)法案》的贝尔德复审(BairdReview),要求所有提供国际教育的院校于2010年底前重新注册的《海外学生教育服务(ESOS)法案》修正案,以及发布由澳大利亚政府理事会(Councilof Australian Government)制订的《澳大利亚国际学生战略》。埃文斯说:“保持澳大利亚教育继续被高度公认为能够为赴澳留学的国际学生提供高质量课程是十分重要的。”即将于明年成立的国家职业教育与培训规范局(National VET Regulator)和高等教育质量和标准署(Tertiary Education Quality Standards Agency)将保障职业教育与培训和高等教育行业继续保持高质量。 +时尚 组图:香肩美锁骨 性感不张扬女人哪个部位最美最性感?不是红唇,不是翘臀,更不是波胸,而是肩膀。锁骨,是你身着斜肩上装引来同性羡慕的地方,是被抹胸曳地长礼服衬托得最耀眼的地方,它的美充满灵性,让女人立刻有了一种轻盈的气质。它堪称女人身上一道最美的风景线。今夏,单肩装将低调并一枝独秀地流行着,一抹香肩半边锁骨的靓丽,同时造就了几个层次的美感,不对称、错落感、优雅、性感……一切都在那微微倾斜的一道色彩。单肩休闲衫 搭配牛仔最IN如果你认为,单肩风潮仅仅适用于相对正式的礼服或小洋装,那你就大错特错了,一款棉质的普通T恤,只需在剪裁上作一些调整,同时将领口开大,就能轻松呈现出当季最In的单肩感觉,在斜肩处露出细细的肩带,搭配牛仔裤就很好看。时尚女王凯特-摩丝永远懂得美的定义,就连最普通的T恤,一样可以穿出最Fashion的感觉。单肩小洋装 呈现多样风格短款单肩连衣裙根据面料、剪裁的不同,往往可以展现出多样、多变的风格。礼服型的单肩连衣裙充满野性;而缎面、丝绸材质的连衣裙则散发着迷人的青春气息。“绯闻女孩”布莱克-莱弗利一袭玫红色缎面单肩小洋装,玲珑曲线凸显无遗。 +时政 全国95%以上地市建立特邀监察员制度新华网北京3月13日电(记者李亚杰)记者日前从监察部获悉,自1989年以来,监察部已聘请了四批特邀监察员,共计130人次。目前,全国31个省、自治区、直辖市,95%以上的地(市)、65%以上的县和中央国家机关的十多个部委,建立了特邀监察员制度。特邀监察员制度是中国共产党领导的多党合作和政治协商制度的重要组成部分,也是民主监督、参政议政在反腐败领域的成功实践。监察部有关负责人表示,自1989年建立特邀监察员制度以来,监察部一直高度重视,把这项工作作为监察机关的一项重要工作来抓,明确把专门监督与群众监督相结合的制度坚持得如何、特邀监察员工作是加强了还是削弱了,作为衡量和判断在纪检监察机关合署办公体制下行政监察职能是否得到加强的六条标准之一。特邀监察员工作开展近20年来,特邀监察员制度在实践中进一步得到完善和发展,特邀监察员队伍不断壮大,工作领域逐步拓宽,在党风廉政建设和反腐败工作中的作用也越来越明显。1989年5月,经过充分酝酿并经中央同意,监察部作出建立特邀监察员制度的决定。同年12月,监察部从民革、民盟、民建、民进、农工党、致公党、九三学社、台盟8个民主党派和全国工商联聘请了21位专家、学者为监察部首批特邀监察员。之后,特邀监察员工作在全国各级纪检监察机关逐步推开。1996年11月,监察部召开了全国纪检监察机关特邀监察员工作座谈会,这是特邀监察员制度建立以来召开的第一次全国性会议,总结交流了全国纪检监察机关开展特邀监察员工作的经验和做法,有力地推动了特邀监察员工作的深入开展。2004年10月颁布实施的《中华人民共和国行政监察法实施条例》进一步明确:监察机关根据工作需要,可以在国家行政机关、企业、事业单位、社会团体中聘请特邀监察员。聘请特邀监察员的具体办法由国务院监察机关规定。之后,监察部先后制定颁布了《监察部关于聘请特邀监察员的几点意见》、《关于改进特邀监察员工作的几点意见》、《中央纪委监察部关于加强和改进行政监察工作的意见》等一系列法规、文件和规定,明确了特邀监察员工作的总体要求和主要内容。即将颁布施行的《中国人民共和国行政监察法》,将进一步明确特邀监察员选聘程序、职责权限等,为特邀监察员全面履行职责提供法律依据。各地也结合工作实际,纷纷制定颁布了切实可行的工作制度。北京、上海、河南、广东、广西、山东、福建、四川、深圳等地还根据实践发展不断修订、完善特邀监察员工作办法等制度规定,特邀监察员工作的规范化、制度化水平不断提高。 +游戏 经典无法复制!《神鬼寓言3》PC版评析《神鬼寓言3》在一个异彩纷呈的虚拟世界,人类在电脑治下民主共存 -- 再没有什么比这更能激发想象的火花了。我的一个小巧玲珑的世界,我可以予取予求。力量感在我周身涌起,因为这结果完全由我来主宰。若是不想眼看着那帮狼人们凌虐镇子,我或者施法送出火球,或者挥舞宝剑,怎样都能拯救世界。我也可以将镇子寻求保护的一丝光芒熄灭干净,看着怪物们把尖叫的无辜百姓给撕成碎片。这些方面,《神鬼寓言3》做得可圈可点,但是 -- 太罕见了。在阿尔比昂大陆最新的故事里,纵然Lionhead工作室用令人荡气回肠的道德抉择设置了无数奇思妙想和激动时刻,它们却被深埋在了一堆毫不丰满的人物形象、冗长的故事和狗血情节里。如果你从来没玩儿过《神鬼寓言》,Xbox-360独占的《神鬼寓言2》也错过了 -- 没关系的,别担心为了了解《神鬼寓言3》而做好功课的事儿。所有需要你知道的,开篇全交代了:国王是个恶棍,需要被干掉。并不是遵循着最初的故事,总之我 -- 就是主角,从城堡里跑了,混迹市井之中,在阿尔比昂这个奇妙的大陆中徘徊,以期攒足人气资本,把国王搞下来,我自己坐这把交椅。《神鬼寓言3》所耍的手段在于,并不是我戴上王冠就终章了。那些我帮过的人,我还得给出承诺来;一旦取得王位,我得决定是旧账一律不认,还是一律兑现。这事儿让我真的很不舒服。我费大力气拯救出的那些人,敢情谁都不是跑龙套的,都等着最后来向我讨债,都等着我登基之后捎只胳膊带把手儿去拉他们一把。而且大多数的这种事儿都跟王国的安全这种更高层次的要求是冲突的。我不得不在践行诺言与保证阿尔比昂的安全之间竭力求取平衡,小心翼翼如履薄冰。这种构思其实挺不错,但是本来挺好的一件事儿,感觉怎么就这么恶心呢。首先这些人物就有问题。绝大多数的这些角色都同样地逡巡。相比行动来说,还是口音和衣着能有些区分。置他们的吁求不顾而去推广童工或者把妓院夷为平地,我这是多么撕心裂肺的抉择啊!除了我的导师与伙伴沃特,以及暴君洛根之外,剩下的角色全都一个心眼儿,根本就不比普通的三维物件强到哪里去。作为国王而背弃承诺之时,我真是毫无任何感觉,仅仅按下键盘命令,让他们滚,如是而已。穿插在《神鬼寓言3》的主线故事之中,有很多招募的任务 -- 几乎就没有哪个有意思。也有分支任务,可大部分都是教科书一般的护送或者刺杀任务。我可以购置实业,但是只有最基本的项目可供自定义。一个饶有趣味的帝国管理游戏就这样被剥夺了,成了一个单调、乏味的流程,仅仅在金钱进入游戏里钱包的那轻轻一声响更是放大了这一点。我可以杀死或者审判阿尔比昂的百姓,但是与此一道的各种冷笑话和莫名其妙的大打出手,完全把这种感受给毁了。哪怕是黎民们当面儿大喊大叫说我是“刽子手”,我也照旧可以傻乎乎地跳舞、做支线任务、去约会,搞不好就结婚了,还拖家带口的。游戏中的形成、发展和关系的维系,全因为这个设定被束缚住了。就算是《神鬼寓言3》在某些方面引入了阴谋和神秘的元素,例如我被丢到一个黑暗荒芜的洞穴之后,我不得不面对各种恐惧,这使得我无法探索每一个角落。恐惧在这个大陆上是最强大的邪恶,而且大约会在游戏进程的三分之二处出现,而且仅仅会遭遇几次而已。游戏给人的感觉就是完成度不高,而且赶工迹象明显。寻找游戏中的收集元素、参与小鸡快跑比赛、镇压地精等等事情都让人很难一直保持兴趣。而当我最终坐上王座之后,《神鬼寓言3》所能提供的选择少得可怜。还好《神鬼寓言3》有一些时尚和幽默。有些台词写得还是非常有意思的。虽然这样的台词对塑造人物没有任何意义,但是会让你一直一直笑。阿尔比昂仍然是个美丽的地方,而且角色模型、动画和环境光跟随构造除了这个美丽的世界。从墓地的薄雾到荒漠的午后阳光,这样一个充满生机的地方非常令人赞叹。配音做的很专业。任务繁多,讲述了一个宏大的故事,而且还有很多娱乐元素,不过所有这些都相互孤立,让本该成为一款佳作的《神鬼寓言3》就这样沦为了一款毫不出彩的作品。战斗过程令人兴奋,但是缺乏打击感。由于战斗过程的乏味,所以战斗无法使玩家的注意力从游戏剧情和肤浅的人物问题上转移开。格斗武器,枪支和魔法本质上来说都是一样的。基本上都是闪躲和攻击,这样的方法可以用来对付所有遇到的敌人。说实话,这样的战斗系统着实令人失望。武器升级所带来的外观和属性上的改变让我切实感受到了游戏的进程,不过由于战斗系统的失败,这样的设定也让人感到无聊。整体感觉6.5分:漂亮的界面,不过与PC平台毫不相称。杂乱无章的故事与游戏节奏画面表现7.5分:一些很棒的动画和特效,还有多彩和谐的艺术风格声效表现8.0分:令人振奋的音乐,配音表演相当完美上手体验6.0分:有很多可以做的内容,但只有很小部分令人兴奋。单调的战斗,重复的任务,只有很小部分值得情感投入耐玩性5.5分:你或许从合作游戏和大量的收集感到愉悦,但这也无法更改核心游戏体验总评6.0分:还行吧 +科技 摩托罗拉:GPON在FTTH中比EPON更有优势作 者:鲁义轩2009年,在国内光进铜退的火热趋势下,摩托罗拉携其在国际市场上已经获得丰富运营经验的GPON解决方案,大举进入中国的光通信市场。对于这一个时间点的选择,摩托罗拉宽带及移动网络事业部网络接入解决方案部全球营销与传播总监FloydWagoner的解释是:中国利用GPON推进光线到户的时机正在趋于成熟,而摩托罗拉在国际上的GPON研发和运营经验,可以更好地提升国内运营商推进FTTH的效率。GPON的国际性优势在亚洲地区,推进光线到户的多种技术中,EPON一直是非常强大并且主流的技术。而在亚洲以外的国际很多地区,运营商都开始越来越多地关注GPON,今年GPON预计占到全球光纤到户市场的40%。在FloydWagoner看来,EPON虽然仍然强大,而GPON的实力在显著加强。在带宽方面,GPON比EPON上下行带宽都加强了至少一倍。因为EPON利用率相对于GPON要低一些,在相同的用户部署、相同终端情况下,统计数据表明EPON支持上、下行29Mbit/s的带宽,而GPON可以达到下行79Mbit/s上行37Mbit/s的实际带宽,从根本上提升了对数据业务的支持。在服务的质量保证(QoS)上,目前EPON的业务主要是数据业务,而运营商要推广三网融合等复杂的业务,服务质量保证要求会更高。在这方面,GPON有了更好的机制来保证多业务服务质量的实现。此外,在部署的方便性上,光线路中的光功率意味着传输距离的长短。EPON的速率是24dB,而GPON是28dB,在相同的条件下,GPON的传输距离更远。运营商可以把ONT布置在更远的位置,节省线路的成本,将来可以覆盖更多、更远的终端单元。综合比较,无论在技术方面还是在业务保障方面以及在材料方面,GPON到现在为止所体现的趋势更加地优于EPON。而且GPON的成本价格已经下降很多,得到越来越多的运营商的青睐。目前国内中国电信、中国联通以及中国移动都已经表示过把GPON作为下一步光网络发展的优选。创新性的GPONONT和OLT据FloydWagoner介绍,凭借在全球FTTH领域积累的经验,摩托罗拉开发了创新产品,以满足服务供应商提供更低密度的OLT、满足更高密度的 MDU环境以及具集成功能的室内ONT等方面的需求。创新性的GPONONT和OLT,可以将光纤延伸至服务供应商网络的边缘,从而保证用户在任何地方都能享用端到端的超宽带服务。同时,摩托罗拉的FTTH网元管理系统AXSvision,还能简化网管界面,并帮助运营商加速新型、丰富的个性化娱乐业务推出速度。 diff --git a/test/data_for_tests/io/WeiboSenti100k/dev.txt b/test/data_for_tests/io/WeiboSenti100k/dev.txt new file mode 100644 index 00000000..fdca0212 --- /dev/null +++ b/test/data_for_tests/io/WeiboSenti100k/dev.txt @@ -0,0 +1,7 @@ +label text +1 多谢小莲,好运满满[爱你] +1 能在他乡遇老友真不赖,哈哈,珠儿,我也要用这个拼图软件!BTW,小飞人儿终于要飞回家啦,深圳行,谢谢每位工作人员的照顾![爱你] +0 [衰]补鞋的说鞋子是进口的,质量太好,刀子都切不进去!所以说大家以后别买进口,到时补都没的补![爱你] +0 第五季都没看了[泪]要补起来 +1 美图好诗![鼓掌] //@言家楼:回复@俺叫老鬼:【七律。感时】 叶随风舞身何处, 鸟逆风行觅树梢。 岁月风来无退路, 激流风助有波涛。 寒微风动曾言志, 富贵风骚似不牢。 雪竹风梅诗未尽, 休云风雨剪春刀。//鸢肩格:藏珠“风”。 +0 没敢问,她男朋友在旁边呢。。[泪]//@好饭换坏饭: 你问问她能不能调成静音模式 diff --git a/test/data_for_tests/io/WeiboSenti100k/test.txt b/test/data_for_tests/io/WeiboSenti100k/test.txt new file mode 100644 index 00000000..3d071fb2 --- /dev/null +++ b/test/data_for_tests/io/WeiboSenti100k/test.txt @@ -0,0 +1,8 @@ +label text +1 钟爱大粉的亲们,这一茬我们又种大粉了,座果也不错,能吃上了[嘻嘻] +0 //@北京全攻略: 我擦。。。牛逼~果断收藏[衰] +1 都有我都有我~~~我的2012注定是美美的精彩的不得了啊~哈哈哈[太开心]//@哆啦胖兔梦: 转发微博。 +1 这周的成果就是这样 刻的好累但是很喜欢[嘻嘻]#我的橡皮章# +1 你把我整?了。[抓狂] //@窦智耀:开 往大稿艺术区店开 带上祝贺的花篮。。。昨夜 杨家火锅 你把我灌醉。。。今夜 我要学会排队等位。再贺开业大吉![鼓掌][鼓掌][鼓掌] +1 [爱你]亲们,我刚刚发表了一篇文章,有图有真相,速来围观![围观]||#蚂蜂窝游记#《新疆,雨中的野核桃沟》,查看更多精彩>>> http://t.cn/zR4BMN3 (分享自 @蚂蜂窝旅游攻略) +0 [泪]//@平安北京: 珍爱生命,小心驾驶,驾车时请勿接打电话! diff --git a/test/data_for_tests/io/WeiboSenti100k/train.txt b/test/data_for_tests/io/WeiboSenti100k/train.txt new file mode 100644 index 00000000..4f0adf27 --- /dev/null +++ b/test/data_for_tests/io/WeiboSenti100k/train.txt @@ -0,0 +1,7 @@ +label text +1 //@实用小百科:这才是吃货本色[哈哈] +0 回复@邋遢大王诗文:好的[ok] //@邋遢大王诗文:回复@静冈叔叔:[ok]木有问题!回来了和我联系 //@静冈叔叔:回复@西瓜叫高荔蜒啊:在富士山静冈机场有很多小丸子的土产啊[嘻嘻] //@西瓜叫高荔蜒啊:祝你一路顺风~ 想要小丸子的お土?~[泪] +1 我花了两年最后被抢的只剩下一枚,情何以堪! //@自由橙的小窝:@程诗然 同学集卡速度最快,我花了两年时间才集全 //@怯弱的狮子Susan: 回复@阮导:@墙墙-墙根俱乐部 看你多抢手!快给我们各发一套吧![嘻嘻] //@阮导:回复@怯弱的狮子Susan:所以。。。。你要给我找一套撒。。哈哈哈哈哈!!! +1 KIMSCLOSET的年会,海鲜自助餐,太丰盛了!大家吃的HIGH,喝的HIGH,聊的HIGH!太开心了![哈哈][爱你] +1 在iPhone的便携鱼眼镜头之下,扣肉蝴蝶饱子显得多诱人呀![围观][馋嘴][嘻嘻] +0 英织,你知道不知道,他是我最最最爱的大叔,你跟他靠这么近,我的心都碎了!!!你说你说你说,你有没有他的签名![泪] diff --git a/test/data_for_tests/io/XNLI/dev.txt b/test/data_for_tests/io/XNLI/dev.txt new file mode 100644 index 00000000..eced8fac --- /dev/null +++ b/test/data_for_tests/io/XNLI/dev.txt @@ -0,0 +1,7 @@ +language gold_label sentence1_binary_parse sentence2_binary_parse sentence1_parse sentence2_parse sentence1 sentence2 promptID pairID genre label1 label2 label3 label4 label5 sentence1_tokenized sentence2_tokenized match +zh neutral 他说,妈妈,我回来了。 校车把他放下后,他立即给他妈妈打了电话。 1 1 facetoface neutral contradiction neutral neutral neutral 他 说 , 妈妈 , 我 回来 了 。 校车 把 他 放下 后 , 他 立即 给 他 妈妈 打 了 电话 。 True +zh contradiction 他说,妈妈,我回来了。 他没说一句话。 1 2 facetoface contradiction contradiction contradiction contradiction contradiction 他 说 , 妈妈 , 我 回来 了 。 他 没 说 一 句 话 。 True +zh entailment 他说,妈妈,我回来了。 他告诉他的妈妈他已经回到家了。 1 3 facetoface entailment entailment neutral entailment entailment 他 说 , 妈妈 , 我 回来 了 。 他 告诉 他 的 妈妈 他 已经 回到家 了 。 True +zh neutral 他们停止了跟这家交朋友,因为他们决定了当白人。 种族紧张局势开始时,他们不再探望这家人。 13 39 facetoface neutral entailment entailment entailment entailment 他们 停止 了 跟 这家 交朋友 , 因为 他们 决定 了 当 白人 。 种族 紧张 局势 开始 时 , 他们 不再 探望 这家 人 。 False +zh contradiction 老太太以前常说她姐姐和姐丈是如何决定要搬到奥古斯塔城里去,并且被当做白人看待。 奶奶的妹妹是白人,搬到了德克萨斯州。 17 49 facetoface contradiction contradiction contradiction contradiction neutral 老太太 以前 常 说 她 姐姐 和 姐丈 是 如何 决定 要 搬 到 奥古斯塔 城里 去 , 并且 被 当做 白人 看待 。 奶奶 的 妹妹 是 白人 , 搬 到 了 德克萨斯州 。 True +zh entailment 老太太以前常说她姐姐和姐丈是如何决定要搬到奥古斯塔城里去,并且被当做白人看待。 奶奶的姐姐不是白人。 17 50 facetoface entailment entailment contradiction neutral entailment 老太太 以前 常 说 她 姐姐 和 姐丈 是 如何 决定 要 搬 到 奥古斯塔 城里 去 , 并且 被 当做 白人 看待 。 奶奶 的 姐姐 不 是 白人 。 True diff --git a/test/data_for_tests/io/XNLI/test.txt b/test/data_for_tests/io/XNLI/test.txt new file mode 100644 index 00000000..d5ff4c24 --- /dev/null +++ b/test/data_for_tests/io/XNLI/test.txt @@ -0,0 +1,7 @@ +language gold_label sentence1_binary_parse sentence2_binary_parse sentence1_parse sentence2_parse sentence1 sentence2 promptID pairID genre label1 label2 label3 label4 label5 sentence1_tokenized sentence2_tokenized match +zh contradiction 嗯,我根本没想过,但是我很沮丧,最后我又和他说话了。 我还没有和他再次谈论。 2 4 facetoface contradiction contradiction contradiction contradiction contradiction 嗯 , 我 根本 没 想 过 , 但是 我 很 沮丧 , 最后 我 又 和 他 说话 了 。 我 还 没有 和 他 再次 谈论 。 True +zh entailment 嗯,我根本没想过,但是我很沮丧,最后我又和他说话了。 我非常沮丧,我刚刚开始跟他说话。 2 5 facetoface entailment entailment entailment entailment entailment 嗯 , 我 根本 没 想 过 , 但是 我 很 沮丧 , 最后 我 又 和 他 说话 了 。 我 非常 沮丧 , 我 刚刚 开始 跟 他 说话 。 True +zh neutral 嗯,我根本没想过,但是我很沮丧,最后我又和他说话了。 我们谈得很好。 2 6 facetoface neutral neutral neutral neutral neutral 嗯 , 我 根本 没 想 过 , 但是 我 很 沮丧 , 最后 我 又 和 他 说话 了 。 我们 谈 得 很 好 。 True +zh neutral 而我当初认为这是一个特权,我现在仍然这样想,我是唯一的922 Ex-O,也是我的AFFC空军职业生涯。 我不知道那天我不是唯一一个在场的人。 3 7 facetoface neutral contradiction contradiction contradiction contradiction 而 我 当初 认为 这 是 一个 特权 , 我 现在 仍然 这样 想 , 我 是 唯一 的 922 Ex-O , 也 是 我 的 AFFC 空军 职业生涯 。 我 不 知道 那天 我 不 是 唯一 一个 在场 的 人 。 False +zh contradiction 而我当初认为这是一个特权,我现在仍然这样想,我是唯一的922 Ex-O,也是我的AFFC空军职业生涯。 我们都被赋予了相同的确切数字,无论我们被许诺了何种特权,都是谎言。 3 9 facetoface contradiction contradiction entailment contradiction contradiction 而 我 当初 认为 这 是 一个 特权 , 我 现在 仍然 这样 想 , 我 是 唯一 的 922 Ex-O , 也 是 我 的 AFFC 空军 职业生涯 。 我们 都 被 赋予 了 相同 的 确切 数字 , 无论 我们 被 许诺 了 何种 特权 , 都 是 谎言 。 True +zh entailment 这是Fannie Flono,她在佐治亚州奥古斯塔长大,她会讲述她童年时的一些故事。 Fannie Flono就在这里,她将与我们分享她在奥古斯塔成长的童年故事。 12 35 facetoface entailment entailment entailment entailment entailment 这 是 Fannie Flono , 她 在 佐治亚州 奥古斯塔 长大 , 她 会讲 述 她 童年 时 的 一些 故事 。 Fannie Flono 就 在 这里 , 她 将 与 我们 分享 她 在 奥古斯塔 成 长 的 童年 故事 。 True diff --git a/test/data_for_tests/io/XNLI/train.txt b/test/data_for_tests/io/XNLI/train.txt new file mode 100644 index 00000000..45d1ce9e --- /dev/null +++ b/test/data_for_tests/io/XNLI/train.txt @@ -0,0 +1,8 @@ +premise hypo label +我们 家里 有 一个 但 我 没 找到 我 可以 用 的 时间 我们 家里 有 一个 但 我 从来 没有 时间 使用 它 . entailment +该镇 仍然 充满 雕塑家 , piazza alberica 是 一个 夏季 雕塑 比赛 的 现场 14 天 来 制作 一个 杰作 . 几乎 所有 的 雕塑家 都 离开 了 piazza alberica 为 其他 城市 . contradictory +土耳其 的 面包车 是 自己 坐 下 来 的 , 但 他们 喜欢 玩和呃 , 他们 喜欢 和 他们 一起 玩 , 他们 把 他们 的 社会 从 它 . neutral +好 吗 ? 我 问 benignantly , 因为 她 犹豫 了 . 我 抓住 她 的 胳膊 和 她 愤怒地 , 问 , 好 吗 ? contradictory +一 段 时间 来 看 , 这 一 运动 似乎 要 取得 成功 , 但 政治 事件 , 加 上 帕内尔 在 一个 令 人 愤慨 的 离婚案 中 被 称为 共同 答辩人 , 导致 许多 人 撤回 他们 的 支持 . 帕内尔 在 一个 令 人 愤慨 的 离婚 问题 上 的 法律 问题 使 这 场 运动 受到 了 影响 . entailment +看 在 这里 , 他 说 我们 不 希望 任何 律师 混在 这 一 点 . 他 说 看看 那 张 纸 neutral +Soderstrom 在 创伤 中心 进行 了 多次 筛选 测试 . 测试 必须 在 创伤 中心 进行 比较 , 否则 就 会 无效 . neutral diff --git a/test/data_for_tests/io/cws_as/dev.txt b/test/data_for_tests/io/cws_as/dev.txt new file mode 100755 index 00000000..f4c96e9e --- /dev/null +++ b/test/data_for_tests/io/cws_as/dev.txt @@ -0,0 +1,6 @@ +時間 : +三月 十日 ( 星期四 ) 上午 十時 。 +並 辦理 加州 大學 退休 等 手續 。 +包括 一九七八年 獲有 數學 諾貝爾 之 稱 的 費爾茲獎 , +在 台大 的 四 年 裡 , +他 語重心長 的 勉勵 同學 們 一 番 話 , diff --git a/test/data_for_tests/io/cws_as/test.txt b/test/data_for_tests/io/cws_as/test.txt new file mode 100755 index 00000000..a61009b2 --- /dev/null +++ b/test/data_for_tests/io/cws_as/test.txt @@ -0,0 +1,6 @@ +許多 社區 長青 學苑 多 開設 有 書法 、 插花 、 土風舞班 , +文山區 長青 學苑 則 有 個 十分 特別 的 「 英文 歌唱班 」 , +成員 年齡 均 超過 六十 歲 , +這 群 白髮蒼蒼 , +爺爺 、 奶奶級 的 學員 唱起 英文 歌 來 字正腔圓 , +有模有樣 。 diff --git a/test/data_for_tests/io/cws_as/train.txt b/test/data_for_tests/io/cws_as/train.txt new file mode 100755 index 00000000..b6eab6a3 --- /dev/null +++ b/test/data_for_tests/io/cws_as/train.txt @@ -0,0 +1,6 @@ +地點 : +學術 活動 中心 一樓 簡報室 。 +主講 : +民族所 所長 莊英章 先生 。 +講題 : +閩 、 台 漢人 社會 研究 的 若干 考察 。 diff --git a/test/data_for_tests/io/cws_cityu/dev.txt b/test/data_for_tests/io/cws_cityu/dev.txt new file mode 100755 index 00000000..eac550f2 --- /dev/null +++ b/test/data_for_tests/io/cws_cityu/dev.txt @@ -0,0 +1,6 @@ +立會 選情 告一段落 民主 進程 還 看 明天 +所謂 「 左 」 的 勢力 , 是 指 以 鄭經翰 、 梁國雄 ( 長毛 ) 為 代表 的 激進 民主 勢力 , 他們 尖銳 批評 中央 和 特區 政府 , 積極 為 基層 勞工 爭取 福利 , 可能 會 為 民主派 與 中央 和解 增加 困難 , 牽制 民主黨 走 中產 溫和 路線 。 +特區 政府 應該 積極 與 民主派 改善 關係 , 尤其 要 爭取 中間 及 「 右 」 翼 的 民主 勢力 , 因為 這些 人 背後 反映 的 是 香港 的 主流 民意 , 除了 民主 步伐 和 涉及 中央 的 敏感 政治 議題 , 他們 和 建制派 的 溫和 力量 沒有 基本 不同 , 很 容易 達成 跨 黨派 的 共識 , 令 特區 政府 處於 不得不 從 的 被動 位置 , 23 條 立法 撤回 、 追究 SARS 責任 等 , 都 是 記憶猶新 的 例子 。 +為 何秀蘭 喝彩 為 香港 人 神傷 +單說 立法會 , 自 91 年 以來 , 經歷 5 次 類似 的 地區 直選 。 +點票 過程 出現 的 笑話 更 多 。 diff --git a/test/data_for_tests/io/cws_cityu/test.txt b/test/data_for_tests/io/cws_cityu/test.txt new file mode 100755 index 00000000..aa838fe2 --- /dev/null +++ b/test/data_for_tests/io/cws_cityu/test.txt @@ -0,0 +1,6 @@ +「 練 得 銅皮鐵骨 」 露宿 早 慣 蚊叮 +本 港 約 有 450 至 600 名 露宿者 , 其中 近 四分之一 , 即 約 150 人 露宿 在 深水埗 。 +有 外展 社工 稱 , 露宿者 日間 多 到 商場 等 冷氣 場所 避暑 , 流連 至 晚上 11 、 12 時 , 才 用 紙皮 在 公園 外 「 打地鋪 」 , 他們 早已 「 練 得 一 身 銅皮鐵骨 」 , 徹夜 被 蚊 叮 也 習以為常 , 但 社工 在 炎夏 仍 會 頻頻 給 他們 派發 蚊香 。 +基督教 關懷 無家者 協會 的 外展 社工 , 過去 一直 有 探訪 李鄭屋 遊樂場 外 的 露宿者 , 該 會 總幹事 賴淑芬 說 , 該 處 的 露宿者 只 有 數 人 , 且 流動性 很 大 。 +不管 被 多少 蚊 叮 也 沒 什 感覺 +她 指 這些 露宿者 日間 都 會 流連 於 冷氣 場所 , 晚上 才 到 遊樂場 露宿 , 但 礙於 遊樂場 晚上 關門 , 他們 只 可 在 外圍 「 打地鋪 」 。 diff --git a/test/data_for_tests/io/cws_cityu/train.txt b/test/data_for_tests/io/cws_cityu/train.txt new file mode 100755 index 00000000..6338621c --- /dev/null +++ b/test/data_for_tests/io/cws_cityu/train.txt @@ -0,0 +1,6 @@ +立法會 選舉 出現 了 戲劇性 的 結果 , 儘管 投票率 創下 新高 , 而 過去 經驗 顯示 高 投票率 對 民主派 較 有利 , 但 由於 名單 協調 不當 及 配票 策略 失誤 , 加上 醜聞 影響 選情 , 民主黨 的 議席 比 上 一 屆 減少 , 由 第 一 大 黨 跌 至 第 三 ; +而 泛民主派 在 30 席 普選 中 亦 只能 取得 18 席 , 比 選前 預期 的 20 席 少 ; +但 在 功能 組別 選舉 卻 有 意外 收穫 , 除 保住 原有 的 5 個 議席 , 還 搶佔 了 醫學 和 會計 兩 個 專業 界別 , 令 議席 總數 達到 25 席 , 比 上 一 屆 多 了 3 席 。 +更 值得 注意 的 是 , 泛民主派 候選人 在 普選 中 合共 取得 110萬 張 選票 , 佔 178萬 選票 總數 的 62 % , 顯示 多數 市民 認同 早日 實現 全面 普選 的 民主 訴求 , 這 一 點 應 為 政府 及 各 黨派 人士 所 尊重 。 +須 為 2012 全面 普選 創造 條件 +親 建制 陣營 方面 , 民建聯 和 自由黨 都 取得 佳績 , 分別 取得 12 席 和 11 席 , 成為 立法會 內 的 第 一 及 第 二 大 黨 。 diff --git a/test/data_for_tests/io/cws_pku/dev.txt b/test/data_for_tests/io/cws_pku/dev.txt new file mode 100755 index 00000000..df77c5ca --- /dev/null +++ b/test/data_for_tests/io/cws_pku/dev.txt @@ -0,0 +1,6 @@ +在 十五大 精神 指引 下 胜利 前进 —— 元旦 献辞 +我们 即将 以 丰收 的 喜悦 送 走 牛年 , 以 昂扬 的 斗志 迎来 虎年 。 我们 伟大 祖国 在 新 的 一 年 , 将 是 充满 生机 、 充满 希望 的 一 年 。 +李 鹏 在 北京 考察 企业 +李 鹏 说 : “ 作为 首都 的 电力 工作者 , 你们 为 首都 的 各项 重大 活动 的 顺利 进行 , 为 保障 人民 群众 的 工作 、 生活 和 学习 , 为 促进 首都 经济 的 发展 作出 了 自己 的 贡献 。 明天 就 是 元旦 , 你们 还有 许多 同志 要 坚守 岗位 , 我 向 你们 、 向 全体 电力 工作者 表示 感谢 。 现在 , 我们 的 首都 已经 结束 了 拉 闸 限 电 的 历史 , 希望 依靠 大家 , 使 拉 闸 限 电 的 历史 永远 不再 重演 。 同时 , 也 希望 你们 安全 生产 、 经济 调度 , 实现 经济 增长 方式 的 转变 。 ” 李 鹏 最后 向 电业 职工 , 向 全 北京市 的 人民 拜年 , 向 大家 致以 新春 的 问候 , 祝愿 电力 事业 取得 新 的 成绩 , 祝愿 北京市 在 改革 、 发展 和 稳定 的 各项 工作 中 取得 新 的 成就 。 +( 附 图片 1 张 ) +据 介绍 , 播音员 、 主持人 持证 上岗 工作 , 是 在 1996年 全国 广播 影视 系统 语言 工作 会议 上 提 出来 的 , 它 是 加强 宣传 队伍 建设 , 促进 语言 文字 走向 标准化 、 规范化 的 重要 举措 。 播音员 、 主持人 只有 通过 汉语 普通话 水平 测试 和 政治 、 业务 考核 后 才 能 获得 上岗 资格 证书 。 diff --git a/test/data_for_tests/io/cws_pku/test.txt b/test/data_for_tests/io/cws_pku/test.txt new file mode 100755 index 00000000..c7ad3e85 --- /dev/null +++ b/test/data_for_tests/io/cws_pku/test.txt @@ -0,0 +1,6 @@ +共同 创造 美好 的 新 世纪 —— 二○○一年 新年 贺词 +( 二○○○年 十二月 三十一日 ) ( 附 图片 1 张 ) +女士 们 , 先生 们 , 同志 们 , 朋友 们 : +2001年 新年 钟声 即将 敲响 。 人类 社会 前进 的 航船 就要 驶入 21 世纪 的 新 航程 。 中国 人民 进入 了 向 现代化 建设 第三 步 战略 目标 迈进 的 新 征程 。 +在 这个 激动人心 的 时刻 , 我 很 高兴 通过 中国 国际 广播 电台 、 中央 人民 广播 电台 和 中央 电视台 , 向 全国 各族 人民 , 向 香港 特别 行政区 同胞 、 澳门 特别 行政区 同胞 和 台湾 同胞 、 海外 侨胞 , 向 世界 各国 的 朋友 们 , 致以 新 世纪 第一 个 新年 的 祝贺 ! +过去 的 一 年 , 是 我国 社会主义 改革 开放 和 现代化 建设 进程 中 具有 标志 意义 的 一 年 。 在 中国 共产党 的 领导 下 , 全国 各族 人民 团结 奋斗 , 国民经济 继续 保持 较 快 的 发展 势头 , 经济 结构 的 战略性 调整 顺利 部署 实施 。 西部 大 开发 取得 良好 开端 。 精神文明 建设 和 民主 法制 建设 进一步 加强 。 我们 在 过去 几 年 取得 成绩 的 基础 上 , 胜利 完成 了 第九 个 五年计划 。 我国 已 进入 了 全面 建设 小康 社会 , 加快 社会主义 现代化 建设 的 新 的 发展 阶段 。 diff --git a/test/data_for_tests/io/cws_pku/train.txt b/test/data_for_tests/io/cws_pku/train.txt new file mode 100755 index 00000000..d28dbd8b --- /dev/null +++ b/test/data_for_tests/io/cws_pku/train.txt @@ -0,0 +1,6 @@ +迈向 充满 希望 的 新 世纪 —— 一九九八年 新年 讲话 ( 附 图片 1 张 ) +中共中央 总书记 、 国家 主席 江 泽民 +( 一九九七年 十二月 三十一日 ) +12月 31日 , 中共中央 总书记 、 国家 主席 江 泽民 发表 1998年 新年 讲话 《 迈向 充满 希望 的 新 世纪 》 。 ( 新华社 记者 兰 红光 摄 ) +同胞 们 、 朋友 们 、 女士 们 、 先生 们 : +在 1998年 来临 之际 , 我 十分 高兴 地 通过 中央 人民 广播 电台 、 中国 国际 广播 电台 和 中央 电视台 , 向 全国 各族 人民 , 向 香港 特别 行政区 同胞 、 澳门 和 台湾 同胞 、 海外 侨胞 , 向 世界 各国 的 朋友 们 , 致以 诚挚 的 问候 和 良好 的 祝愿 ! diff --git a/test/io/loader/test_cws_loader.py b/test/io/loader/test_cws_loader.py index 55e48910..80ca0406 100644 --- a/test/io/loader/test_cws_loader.py +++ b/test/io/loader/test_cws_loader.py @@ -15,7 +15,7 @@ class TestCWSLoader(unittest.TestCase): class TestRunCWSLoader(unittest.TestCase): def test_cws_loader(self): - dataset_names = ['msra'] + dataset_names = ['msra', 'cityu', 'as', 'msra'] for dataset_name in dataset_names: with self.subTest(dataset_name=dataset_name): data_bundle = CWSLoader(dataset_name=dataset_name).load( diff --git a/test/io/loader/test_matching_loader.py b/test/io/loader/test_matching_loader.py index 8d6e182c..eb4ec2ba 100644 --- a/test/io/loader/test_matching_loader.py +++ b/test/io/loader/test_matching_loader.py @@ -1,14 +1,13 @@ import unittest -from fastNLP.io import DataBundle -from fastNLP.io.loader.matching import RTELoader -from fastNLP.io.loader.matching import QNLILoader -from fastNLP.io.loader.matching import SNLILoader -from fastNLP.io.loader.matching import QuoraLoader -from fastNLP.io.loader.matching import MNLILoader import os +from fastNLP.io import DataBundle +from fastNLP.io.loader.matching import RTELoader, QNLILoader, SNLILoader, QuoraLoader, MNLILoader, \ + BQCorpusLoader, XNLILoader, LCQMCLoader + + @unittest.skipIf('TRAVIS' in os.environ, "Skip in travis") class TestMatchingDownload(unittest.TestCase): def test_download(self): @@ -30,6 +29,9 @@ class TestMatchingLoad(unittest.TestCase): 'SNLI': ('test/data_for_tests/io/SNLI', SNLILoader, (5, 5, 5), False), 'QNLI': ('test/data_for_tests/io/QNLI', QNLILoader, (5, 5, 5), True), 'MNLI': ('test/data_for_tests/io/MNLI', MNLILoader, (5, 5, 5, 5, 6), True), + 'BQCorpus': ('test/data_for_tests/io/BQCorpus', BQCorpusLoader, (5, 5, 5), False), + 'XNLI': ('test/data_for_tests/io/XNLI', XNLILoader, (6, 7, 6), False), + 'LCQMC': ('test/data_for_tests/io/LCQMC', LCQMCLoader, (5, 6, 6), False), } for k, v in data_set_dict.items(): path, loader, instance, warns = v diff --git a/test/io/pipe/test_cws.py b/test/io/pipe/test_cws.py index 063b6d9a..993c16c0 100644 --- a/test/io/pipe/test_cws.py +++ b/test/io/pipe/test_cws.py @@ -16,7 +16,7 @@ class TestCWSPipe(unittest.TestCase): class TestRunCWSPipe(unittest.TestCase): def test_process_from_file(self): - dataset_names = ['msra'] + dataset_names = ['msra', 'cityu', 'as', 'pku'] for dataset_name in dataset_names: with self.subTest(dataset_name=dataset_name): data_bundle = CWSPipe().process_from_file(f'test/data_for_tests/io/cws_{dataset_name}') diff --git a/test/io/pipe/test_matching.py b/test/io/pipe/test_matching.py index 8b0076c2..785d44bb 100644 --- a/test/io/pipe/test_matching.py +++ b/test/io/pipe/test_matching.py @@ -3,8 +3,10 @@ import unittest import os from fastNLP.io import DataBundle -from fastNLP.io.pipe.matching import SNLIPipe, RTEPipe, QNLIPipe, MNLIPipe -from fastNLP.io.pipe.matching import SNLIBertPipe, RTEBertPipe, QNLIBertPipe, MNLIBertPipe +from fastNLP.io.pipe.matching import SNLIPipe, RTEPipe, QNLIPipe, MNLIPipe, \ + XNLIPipe, BQCorpusPipe, LCQMCPipe +from fastNLP.io.pipe.matching import SNLIBertPipe, RTEBertPipe, QNLIBertPipe, MNLIBertPipe, \ + XNLIBertPipe, BQCorpusBertPipe, LCQMCBertPipe @unittest.skipIf('TRAVIS' in os.environ, "Skip in travis") @@ -35,6 +37,9 @@ class TestRunMatchingPipe(unittest.TestCase): 'SNLI': ('test/data_for_tests/io/SNLI', SNLIPipe, SNLIBertPipe, (5, 5, 5), (110, 3), False), 'QNLI': ('test/data_for_tests/io/QNLI', QNLIPipe, QNLIBertPipe, (5, 5, 5), (372, 2), True), 'MNLI': ('test/data_for_tests/io/MNLI', MNLIPipe, MNLIBertPipe, (5, 5, 5, 5, 6), (459, 3), True), + 'BQCorpus': ('test/data_for_tests/io/BQCorpus', BQCorpusPipe, BQCorpusBertPipe, (5, 5, 5), (32, 2), False), + 'XNLI': ('test/data_for_tests/io/XNLI', XNLIPipe, XNLIBertPipe, (6, 7, 6), (37, 3), False), + 'LCQMC': ('test/data_for_tests/io/LCQMC', LCQMCPipe, LCQMCBertPipe, (5, 6, 6), (36, 2), False), } for k, v in data_set_dict.items(): path, pipe1, pipe2, data_set, vocab, warns = v @@ -48,6 +53,9 @@ class TestRunMatchingPipe(unittest.TestCase): self.assertTrue(isinstance(data_bundle1, DataBundle)) self.assertEqual(len(data_set), data_bundle1.num_dataset) + print(k) + print(data_bundle1) + print(data_bundle2) for x, y in zip(data_set, data_bundle1.iter_datasets()): name, dataset = y self.assertEqual(x, len(dataset)) diff --git a/test/modules/encoder/test_pooling.py b/test/modules/encoder/test_pooling.py new file mode 100644 index 00000000..5adca4ff --- /dev/null +++ b/test/modules/encoder/test_pooling.py @@ -0,0 +1,41 @@ +import unittest + +import torch + +from fastNLP.modules.encoder.pooling import MaxPool, MaxPoolWithMask, KMaxPool, AvgPool, AvgPoolWithMask + + +class TestPooling(unittest.TestCase): + def test_MaxPool(self): + max_pool_1d = MaxPool(dimension=1) + x = torch.randn(5, 6, 7) + self.assertEqual(max_pool_1d(x).size(), (5, 7)) + + max_pool_2d = MaxPool(dimension=2) + self.assertEqual(max_pool_2d(x).size(), (5, 1)) + + max_pool_3d = MaxPool(dimension=3) + x = torch.randn(4, 5, 6, 7) + self.assertEqual(max_pool_3d(x).size(), (4, 1, 1)) + + def test_MaxPoolWithMask(self): + pool = MaxPoolWithMask() + x = torch.randn(5, 6, 7) + mask = (torch.randn(5, 6) > 0).long() + self.assertEqual(pool(x, mask).size(), (5, 7)) + + def test_KMaxPool(self): + k_pool = KMaxPool(k=3) + x = torch.randn(4, 5, 6) + self.assertEqual(k_pool(x).size(), (4, 15)) + + def test_AvgPool(self): + pool = AvgPool() + x = torch.randn(4, 5, 6) + self.assertEqual(pool(x).size(), (4, 5)) + + def test_AvgPoolWithMask(self): + pool = AvgPoolWithMask() + x = torch.randn(5, 6, 7) + mask = (torch.randn(5, 6) > 0).long() + self.assertEqual(pool(x, mask).size(), (5, 7))