From 8610de4cc4fc3c5a3f399ef035b84b2d1f1bdebb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Pszenny?= <pszenny@e-science.pl>
Date: Wed, 21 Feb 2024 20:32:01 +0000
Subject: [PATCH] Ner integration

---
 .idea/combolightning.iml                      |     2 +-
 .idea/misc.xml                                |     2 +-
 README.md                                     |    21 +
 combo/data/tokenizers/token.py                |    10 +-
 combo/ner_modules/NerDataModule.py            |   100 +
 combo/ner_modules/NerModel.py                 |   303 +
 combo/ner_modules/__init__.py                 |     0
 .../ner_modules/callbacks/FixedProgressBar.py |    72 +
 combo/ner_modules/callbacks/__init__.py       |     0
 .../ner_modules/classifiers/CrfClassifier.py  |   324 +
 .../classifiers/VanillaClassifier.py          |    59 +
 combo/ner_modules/classifiers/__init__.py     |     0
 combo/ner_modules/data/NerDataset.py          |   130 +
 combo/ner_modules/data/NerTokenizer.py        |   404 +
 combo/ner_modules/data/SpecialTokens.py       |    30 +
 combo/ner_modules/data/__init__.py            |     0
 combo/ner_modules/data/utils.py               |   134 +
 combo/ner_modules/embedders/BertEmbedder.py   |   111 +
 .../embedders/ComboCharEmbedder.py            |   115 +
 combo/ner_modules/embedders/TokenPooling.py   |    90 +
 combo/ner_modules/embedders/__init__.py       |     0
 combo/ner_modules/loss/FocalLoss.py           |   157 +
 combo/ner_modules/loss/__init__.py            |     0
 combo/ner_modules/metrics/MetricHolder.py     |   124 +
 combo/ner_modules/metrics/__init__.py         |     0
 combo/ner_modules/utils/__init__.py           |     0
 combo/ner_modules/utils/constructors.py       |   134 +
 combo/ner_modules/utils/default_config.py     |    52 +
 combo/ner_modules/utils/download.py           |    73 +
 combo/ner_modules/utils/utils.py              |   175 +
 combo/predict.py                              |    53 +-
 docs/NerBuilder.png                           |   Bin 0 -> 24775 bytes
 docs/Ner_config_files.md                      |   111 +
 docs/Ner_docs.md                              |   275 +
 ner_scripts/eval.py                           |   112 +
 ner_scripts/find_lr.py                        |    95 +
 ner_scripts/train.py                          |   157 +
 notebooks/NER_inference.ipynb                 |   400 +
 notebooks/NER_training.ipynb                  |   882 ++
 notebooks/example_data/dev.txt                |  2515 ++++
 notebooks/example_data/test.txt               |  2062 +++
 notebooks/example_data/train.txt              | 12562 ++++++++++++++++
 pyproject.toml                                |     2 +-
 requirements.txt                              |     4 +-
 44 files changed, 21843 insertions(+), 9 deletions(-)
 create mode 100644 combo/ner_modules/NerDataModule.py
 create mode 100644 combo/ner_modules/NerModel.py
 create mode 100644 combo/ner_modules/__init__.py
 create mode 100644 combo/ner_modules/callbacks/FixedProgressBar.py
 create mode 100644 combo/ner_modules/callbacks/__init__.py
 create mode 100644 combo/ner_modules/classifiers/CrfClassifier.py
 create mode 100644 combo/ner_modules/classifiers/VanillaClassifier.py
 create mode 100644 combo/ner_modules/classifiers/__init__.py
 create mode 100644 combo/ner_modules/data/NerDataset.py
 create mode 100644 combo/ner_modules/data/NerTokenizer.py
 create mode 100644 combo/ner_modules/data/SpecialTokens.py
 create mode 100644 combo/ner_modules/data/__init__.py
 create mode 100644 combo/ner_modules/data/utils.py
 create mode 100644 combo/ner_modules/embedders/BertEmbedder.py
 create mode 100644 combo/ner_modules/embedders/ComboCharEmbedder.py
 create mode 100644 combo/ner_modules/embedders/TokenPooling.py
 create mode 100644 combo/ner_modules/embedders/__init__.py
 create mode 100644 combo/ner_modules/loss/FocalLoss.py
 create mode 100644 combo/ner_modules/loss/__init__.py
 create mode 100644 combo/ner_modules/metrics/MetricHolder.py
 create mode 100644 combo/ner_modules/metrics/__init__.py
 create mode 100644 combo/ner_modules/utils/__init__.py
 create mode 100644 combo/ner_modules/utils/constructors.py
 create mode 100644 combo/ner_modules/utils/default_config.py
 create mode 100644 combo/ner_modules/utils/download.py
 create mode 100644 combo/ner_modules/utils/utils.py
 create mode 100644 docs/NerBuilder.png
 create mode 100644 docs/Ner_config_files.md
 create mode 100644 docs/Ner_docs.md
 create mode 100644 ner_scripts/eval.py
 create mode 100644 ner_scripts/find_lr.py
 create mode 100644 ner_scripts/train.py
 create mode 100644 notebooks/NER_inference.ipynb
 create mode 100644 notebooks/NER_training.ipynb
 create mode 100644 notebooks/example_data/dev.txt
 create mode 100644 notebooks/example_data/test.txt
 create mode 100644 notebooks/example_data/train.txt

diff --git a/.idea/combolightning.iml b/.idea/combolightning.iml
index 3578d35..d633123 100644
--- a/.idea/combolightning.iml
+++ b/.idea/combolightning.iml
@@ -4,7 +4,7 @@
     <content url="file://$MODULE_DIR$">
       <sourceFolder url="file://$MODULE_DIR$/combo" isTestSource="false" />
     </content>
-    <orderEntry type="jdk" jdkName="combo" jdkType="Python SDK" />
+    <orderEntry type="jdk" jdkName="combo-newest" jdkType="Python SDK" />
     <orderEntry type="sourceFolder" forTests="false" />
   </component>
   <component name="TestRunnerService">
diff --git a/.idea/misc.xml b/.idea/misc.xml
index d1d59e6..51ebff0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,4 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
-  <component name="ProjectRootManager" version="2" project-jdk-name="combo" project-jdk-type="Python SDK" />
+  <component name="ProjectRootManager" version="2" project-jdk-name="combo-newest" project-jdk-type="Python SDK" />
 </project>
\ No newline at end of file
diff --git a/README.md b/README.md
index c7055dc..63bc2af 100644
--- a/README.md
+++ b/README.md
@@ -69,6 +69,27 @@ combo --mode train --training_data_path <training conllu> --validation_data_path
 
 You can find more examples in ```docs/Training.md```
 
+## Perform Named Entity Recognition with COMBO
+
+COMBO has a NER module. Currently, three languages are supported: English (base and large version), Polish (base and large version) and Spanish (base version). However, it is possible to train your own NER models. Refer to documentation for more information [here](docs/Ner_docs.md).
+
+Performance of the pretrained models:
+
+| name      | dataset                                                                           | language | F1 score <br/> on devset | F1 score <br/> on testset | Precision <br/> on devset | Precision <br/> on testset | Recall <br/> on devset | Recall <br/> on testset |
+|-----------|-----------------------------------------------------------------------------------|----------|--------------------------|---------------------------|---------------------------|----------------------------|------------------------|-------------------------|
+| pl_base   | [kpwe-n82](https://github.com/CLARIN-PL/PolDeepNer/tree/master/poldeepner/data )  | polish   | 73,58                    | 72,39                     | 73,58                     | 72,84                      | 73,58                  | 71,94                   |
+| pl_large  | [kpwe-n82](https://github.com/CLARIN-PL/PolDeepNer/tree/master/poldeepner/data )  | polish   | 74,97                    | 74,34                     | 74,70                     | 74,59                      | 75,24                  | 74,089                  | 
+| eng_base  | [ConLL03](https://github.com/ZihanWangKi/CrossWeigh/tree/master/data )            | english  | 95,25                    | 92,06                     | 95,20                     | 92,42                      | 95,30                  | 91,69                   | 
+| eng_large | [ConLL03](https://github.com/ZihanWangKi/CrossWeigh/tree/master/data )            | english  | 95,17                    | 92,11                     | 95,04                     | 92,49                      | 95,30                  | 91,73                   |
+| es_base   | [ConLL02](https://www.clips.uantwerpen.be/conll2002/ner/ )                        | spanish  | 85,48                    | 87,38                     | 85,89                     | 87,01                      | 85,08                  | 87,74                   |
+
+More granular data about performance can be found [here](https://docs.google.com/spreadsheets/d/1RbcID6Yq-cNXrUmN4Ogujt_6_t6XKlIVjaPXEzBkVvU/edit?usp=sharing)
+
+There are two example notebooks that show how to use the NER module:
+- Training a NER model [here](notebooks/NER_training.ipynb)
+- Using a pretrained NER model [here](notebooks/NER_inference.ipynb)
+
+
 ## COMBO tutorial
 
 We encourage you to use the [beginner's tutorial](https://colab.research.google.com/drive/1-yYwOb9uOTygGhHdaJK_LKedHf_RnvYa) (colab notebook).
diff --git a/combo/data/tokenizers/token.py b/combo/data/tokenizers/token.py
index 319a5bd..e0726e4 100644
--- a/combo/data/tokenizers/token.py
+++ b/combo/data/tokenizers/token.py
@@ -33,7 +33,8 @@ class Token:
         "semrel",
         "embeddings",
         "text_id",
-        "type_id"
+        "type_id",
+        "ner_tag"
     ]
 
     text: Optional[str]
@@ -53,6 +54,7 @@ class Token:
     embeddings: Dict[str, List[float]]
     text_id: Optional[int]
     type_id: Optional[int]
+    ner_tag: Optional[str]
 
     def __init__(self,
                  text: str = None,
@@ -71,7 +73,9 @@ class Token:
                  semrel: str = None,
                  embeddings: Dict[str, List[float]] = None,
                  text_id: int = None,
-                 type_id: int = None,) -> None:
+                 type_id: int = None,
+                 ner_tag: str = None) -> None:
+
         _assert_none_or_type(text, str)
 
         self.text = text
@@ -88,6 +92,7 @@ class Token:
         self.subwords = subwords if subwords else []
         self.multiword = multiword
         self.semrel = semrel
+        self.ner_tag = ner_tag
 
         if embeddings is None:
             # what?
@@ -154,6 +159,7 @@ class Token:
             f"(embeddings: {self.embeddings}) "
             f"(text_id: {self.text_id}) "
             f"(type_id: {self.type_id}) "
+            f"(ner_tag: {self.ner_tag}) "
         )
 
     @classmethod
diff --git a/combo/ner_modules/NerDataModule.py b/combo/ner_modules/NerDataModule.py
new file mode 100644
index 0000000..f8ccc95
--- /dev/null
+++ b/combo/ner_modules/NerDataModule.py
@@ -0,0 +1,100 @@
+import pytorch_lightning as pl
+from torch.utils.data import DataLoader
+from .data.NerDataset import NerDataset
+from pathlib import Path
+from .data.NerTokenizer import NerTokenizer
+
+
+class NerDataModule(pl.LightningDataModule):
+    """
+    NerDataModule is a PyTorch Lightning DataModule designed for Named Entity Recognition (NER) tasks.
+    It handles data loading and preprocessing for training, validation, and testing datasets.
+
+    Attributes:
+    ----------
+    path_data : Path
+        The path to the directory containing NER dataset files.
+    tokenizer : NerTokenizer
+        An instance of the NerTokenizer class used for tokenizing the text data.
+    batch_size : int, optional
+        The batch size for data loading. Default is 32.
+    encoding : str, optional
+        The character encoding to use when reading dataset files. Default is 'utf-8'.
+    num_workers : int, optional
+        The number of CPU processes to use for data loading. Default is 1.
+
+    """
+    def __init__(self,
+                 path_data: Path,
+                 tokenizer: NerTokenizer,
+                 batch_size: int = 32,
+                 encoding: str = 'utf-8',
+                 num_workers: int = 1):
+        super().__init__()
+
+        # Dataloader variables
+        self.num_workers = num_workers
+        self.batch_size = batch_size
+
+        # Dataset variables
+        self.path_data = path_data
+        self.tokenizer = tokenizer
+        self.encoding = encoding
+
+        # Data
+        self.train_dataset = None
+        self.test_dataset = None
+        self.dev_dataset = None
+
+    def setup(self,
+              stage=None) -> None:
+        """
+        Set up datasets for training, validation, and testing.
+        """
+        # Checking whether there is train data inside directory
+        file_path = self.path_data / "train.txt"
+        if file_path.is_file():
+            self.train_dataset = NerDataset(tokenizer=self.tokenizer,
+                                            file_path=file_path,
+                                            encoding=self.encoding)
+
+        # Checking whether there is dev data inside directory
+        file_path = self.path_data / "dev.txt"
+        if file_path.is_file():
+            self.dev_dataset = NerDataset(tokenizer=self.tokenizer,
+                                          file_path=file_path,
+                                          encoding=self.encoding)
+
+        # Checking whether there is test data inside directory
+        file_path = self.path_data / "test.txt"
+        if file_path.is_file():
+            self.test_dataset = NerDataset(tokenizer=self.tokenizer,
+                                           file_path=file_path,
+                                           encoding=self.encoding)
+
+    def train_dataloader(self) -> DataLoader:
+        """
+        Returns a PyTorch DataLoader for the training dataset.
+        """
+        return DataLoader(self.train_dataset,
+                          batch_size=self.batch_size,
+                          shuffle=True,
+                          num_workers=self.num_workers)
+
+    def val_dataloader(self) -> DataLoader:
+        """
+        Returns a PyTorch DataLoader for the validation  dataset.
+        """
+        return DataLoader(self.dev_dataset,
+                          batch_size=self.batch_size,
+                          shuffle=False,
+                          num_workers=self.num_workers)
+
+    def test_dataloader(self) -> DataLoader:
+        """
+        Returns a PyTorch DataLoader for the testing dataset.
+        """
+        return DataLoader(self.test_dataset,
+                          batch_size=self.batch_size,
+                          shuffle=False,
+                          num_workers=self.num_workers)
diff --git a/combo/ner_modules/NerModel.py b/combo/ner_modules/NerModel.py
new file mode 100644
index 0000000..6b35c50
--- /dev/null
+++ b/combo/ner_modules/NerModel.py
@@ -0,0 +1,303 @@
+import pytorch_lightning as pl
+from .metrics.MetricHolder import MetricHolder
+import torch.nn as nn
+import torch
+from .data.SpecialTokens import SpecialTokens
+from .embedders.BertEmbedder import BertEmbedder
+from .embedders.ComboCharEmbedder import ComboCharEmbedder
+from .classifiers.VanillaClassifier import VanillaClassifier
+from .classifiers.CrfClassifier import CrfClassifier
+from .utils.download import download_file
+from .utils.constructors import construct_loss_from_config
+from pathlib import Path
+import json
+from transformers import logging
+# Fixing the issue with transformers BERT some weights being not used and causing warnings
+logging.set_verbosity_error()
+
+CHAR_PAD_TOKEN, CHAR_START_TOKEN, CHAR_END_TOKEN, CHAR_UNKNOWN_TOKEN, PAD_TOKEN, START_TOKEN, END_TOKEN = \
+    SpecialTokens.CHAR_PAD_TOKEN, SpecialTokens.CHAR_START_TOKEN, SpecialTokens.CHAR_END_TOKEN, \
+    SpecialTokens.CHAR_UNKNOWN_TOKEN, SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+class NerModel(pl.LightningModule):
+    def __init__(self,
+                 loss_fn,
+                 char_to_id_map: dict = None,
+                 label_to_id_map: dict = None,
+                 config: dict = None):
+        super().__init__()
+
+        ### Define architecture ###
+        # Define Bert Embedder
+        bert_embedder_params = config["model"]["bert_embedder"]
+        self.bert_embedder = BertEmbedder(use_start_end_token=config["data"]["use_start_end_token"],
+                                          **bert_embedder_params)
+
+        # Define Character Embedder
+        if config["data"]["use_char_level_embeddings"]:
+            if config["model"]["char_embedder"]["type"] == "combo":
+                char_embedding_dim = config["model"]["char_embedder"]["char_embedding_dim"]
+                self.char_embedder = ComboCharEmbedder(vocab_size=len(char_to_id_map),
+                                                       char_embedding_dim=char_embedding_dim,
+                                                       padding_idx=char_to_id_map[CHAR_PAD_TOKEN])
+        else:
+            self.char_embedder = None
+
+        # Define Classifier
+        bert_output_dim = self.bert_embedder.output_dimension
+        char_output_dim = self.char_embedder.output_dimension if self.char_embedder is not None else 0
+        input_dim = bert_output_dim + char_output_dim
+        classifier_params = config["model"]["classifier"]
+        if config["model"]["classifier"]["type"] == "vanilla":
+            self.classifier = VanillaClassifier(label_to_id_map=label_to_id_map,
+                                                input_dim=input_dim,
+                                                to_tag_space=classifier_params["to_tag_space"])
+        elif config["model"]["classifier"]["type"] == "crf":
+            self.classifier = CrfClassifier(label_to_id_map=label_to_id_map,
+                                            input_dim=input_dim,
+                                            to_tag_space=classifier_params["to_tag_space"])
+        if "dropout" in config["model"]:
+            self.dropout = nn.Dropout(p=config["model"]["dropout"])
+        else:
+            self.dropout = None
+        ### End of architecture definition ###
+
+        # Define metric holder
+        self.train_metrics_holder = MetricHolder(label_to_idx=label_to_id_map)
+        self.val_metrics_holder = MetricHolder(label_to_idx=label_to_id_map)
+        self.test_metrics_holder = MetricHolder(label_to_idx=label_to_id_map)
+
+        # Define optimization parameters
+        self.learning_rate = config["learning_rate"]
+        self.loss_fn = "crf" if config["model"]["classifier"]["type"] == "crf" else loss_fn
+
+        # Save label to id map
+        self.label_to_idx_map = label_to_id_map
+
+        # save config
+        self.config = config
+
+    def forward(self, batch):
+        input_ids = batch["input_ids"]
+        attention_mask = batch["attention_mask"]
+        word_ids = batch["word_ids"] if "word_ids" in batch else None
+
+        # get BERT embeddings
+        outputs = self.bert_embedder(input_ids=input_ids,
+                                     attention_mask=attention_mask,
+                                     word_ids=word_ids)
+        # apply dropout
+        if self.dropout:
+            outputs = self.dropout(outputs)
+
+        # adding character embeddings to the output of BERT
+        if self.char_embedder:
+            char_ids = batch["char_ids"]
+            char_embeddings = self.char_embedder(char_ids)
+            outputs = torch.cat((outputs, char_embeddings), dim=2)
+
+        # Apply the classifier layer to obtain logits
+        if self.loss_fn == "crf":
+            _, logits = self.classifier(encoder_outputs=outputs)
+        else:
+            logits = self.classifier(outputs)
+
+        return logits, outputs
+
+    def training_step(self, batch, batch_idx):
+        loss, preds, labels = self._common_step(batch)
+
+        self.train_metrics_holder.update(predictions=preds,
+                                         targets=labels)
+
+        self.log(f"train_loss", loss, on_step=True, on_epoch=False, prog_bar=True, logger=True)
+        return loss
+
+    def on_train_epoch_end(self):
+        # compute metrics with bio tags
+        metrics_dict = self.train_metrics_holder.get_metrics(stage="train")
+        metrics_dict["epoch"] = float(self.current_epoch + 1)
+
+        # log metrics
+        self.log_dict(metrics_dict, on_step=False, on_epoch=True, prog_bar=True, logger=True)
+
+        # reset all metrics
+        self.train_metrics_holder.reset()
+
+    def validation_step(self, batch, batch_idx):
+        loss, preds, labels = self._common_step(batch)
+
+        self.val_metrics_holder.update(predictions=preds,
+                                       targets=labels)
+
+        self.log(f"validation_loss", loss, on_step=True, on_epoch=False, prog_bar=True, logger=True)
+        return loss
+
+    def on_validation_epoch_end(self):
+        # compute metrics with bio tags
+        metrics_dict = self.val_metrics_holder.get_metrics(stage="validation")
+        metrics_dict["epoch"] = float(self.current_epoch + 1)
+
+        # log metrics
+        self.log_dict(metrics_dict, on_step=False, on_epoch=True, prog_bar=True, logger=True)
+
+        # reset all metrics
+        self.val_metrics_holder.reset()
+
+    def test_step(self, batch, batch_idx):
+        loss, preds, labels = self._common_step(batch)
+
+        self.test_metrics_holder.update(predictions=preds,
+                                        targets=labels)
+        return loss
+
+    def on_test_epoch_end(self):
+        # compute metrics with bio tags
+        metrics_dict = self.test_metrics_holder.get_metrics(stage="test")
+        metrics_dict["epoch"] = float(self.current_epoch + 1)
+
+        # log metrics
+        self.log_dict(metrics_dict, on_step=False, on_epoch=True, prog_bar=True, logger=True)
+
+        print(self.test_metrics_holder.get_classification_report())
+
+        # reset all metrics
+        self.test_metrics_holder.reset()
+
+    def configure_optimizers(self):
+        optimizer = torch.optim.Adam(self.parameters(),
+                                     lr=self.learning_rate)
+
+        scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,
+                                                               mode="max",
+                                                               patience=3,
+                                                               factor=0.1,
+                                                               threshold_mode="abs",
+                                                               threshold=0.002)
+        return {"optimizer": optimizer,
+                "lr_scheduler": scheduler,
+                "monitor": "validation_f1"}
+
+    def _common_step(self, batch):
+        labels = batch["labels_ids"]
+        prediction_mask = batch["prediction_mask"]
+
+        # Forward pass
+        logits, encoder_outputs = self.forward(batch)
+
+        # if CRF is used, we don't need to calculate the loss
+        if self.loss_fn != "crf":
+            # Get predictions
+            preds = torch.argmax(logits, dim=2)
+            # Permute the logits to conform loss requirements (batch_size, numb_classes, sequence_length)
+            logits = logits.permute(0, 2, 1)
+            # Change labels of PAD START and END tokens to -100
+            labels = self.mask_labels(labels,prediction_mask)
+            # Calculate the loss
+            loss = self.loss_fn(logits, labels)
+        else:
+            loss = self.classifier.neg_log_likelihood(encoder_outputs, labels)
+            # Change labels of PAD START and END tokens to -100
+            labels = self.mask_labels(labels, prediction_mask)
+            preds = logits
+
+        return loss, preds, labels
+
+    @staticmethod
+    def mask_labels(labels,
+                    prediction_mask):
+        # for torch gradient computation we need to do it on copy
+        label_copy = labels.clone()
+        label_copy[prediction_mask == 0] = -100
+        return label_copy
+
+    def predict(self, batch):
+        # Forward pass
+        logits, _ = self.forward(batch)
+        prediction_mask = batch["prediction_mask"]
+
+        if self.loss_fn != "crf":
+            # Get predictions
+            preds = torch.argmax(logits, dim=2)
+        else:
+            preds = logits
+
+        batch_size, sequence_length = preds.shape
+        result = [[preds[i, j].item() for j in range(sequence_length) if prediction_mask[i, j] == 1] for i in range(batch_size)]
+        return result
+
+    @classmethod
+    def get(cls, model_name):
+        """
+        Downloads and loads pretrained model from MinIO
+        """
+        # Downloading files and loading jsons
+        PATH_CONFIG = Path(download_file(model_name, "config.json"))
+        config = json.load(open(PATH_CONFIG))
+
+        try:
+            PATH_CHAR_TO_ID = Path(download_file(model_name, "char_to_id.json"))
+            char_to_id = json.load(open(PATH_CHAR_TO_ID))
+        except:
+            char_to_id = {}
+
+        PATH_LABEL_TO_ID = Path(download_file(model_name, "label_to_id.json"))
+        label_to_id = json.load(open(PATH_LABEL_TO_ID))
+
+        PATH_MODEL = Path(download_file(model_name, "best_model.ckpt"))
+        # define model
+        loss_fn = construct_loss_from_config(config=config,
+                                             label_to_id=label_to_id)
+
+        if torch.cuda.is_available():
+            device = "cuda"
+        else:
+            device = "cpu"
+
+        # load model
+        model = NerModel.load_from_checkpoint(PATH_MODEL,
+                                              loss_fn=loss_fn,
+                                              char_to_id_map=char_to_id,
+                                              map_location=torch.device(device),
+                                              label_to_id_map=label_to_id,
+                                              config=config)
+        return model
+
+    @classmethod
+    def load_from_disc(cls,
+                       folder_path: Path):
+        """
+        Loads pretrained model from disc
+        """
+        # Loading jsons
+        PATH_CONFIG = folder_path / "config.json"
+        config = json.load(open(PATH_CONFIG))
+
+        try:
+            PATH_CHAR_TO_ID = folder_path / "char_to_id.json"
+            char_to_id = json.load(open(PATH_CHAR_TO_ID))
+        except:
+            char_to_id = {}
+
+        PATH_LABEL_TO_ID = folder_path / "label_to_id.json"
+        label_to_id = json.load(open(PATH_LABEL_TO_ID))
+
+        PATH_MODEL = folder_path / "best_model.ckpt"
+        # define model
+        loss_fn = construct_loss_from_config(config=config,
+                                             label_to_id=label_to_id)
+
+        if torch.cuda.is_available():
+            device = "cuda"
+        else:
+            device = "cpu"
+
+        # load model
+        model = NerModel.load_from_checkpoint(PATH_MODEL,
+                                              loss_fn=loss_fn,
+                                              char_to_id_map=char_to_id,
+                                              map_location=torch.device(device),
+                                              label_to_id_map=label_to_id,
+                                              config=config)
+        return model
diff --git a/combo/ner_modules/__init__.py b/combo/ner_modules/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/callbacks/FixedProgressBar.py b/combo/ner_modules/callbacks/FixedProgressBar.py
new file mode 100644
index 0000000..a0c262d
--- /dev/null
+++ b/combo/ner_modules/callbacks/FixedProgressBar.py
@@ -0,0 +1,72 @@
+import sys
+from pytorch_lightning.callbacks import TQDMProgressBar
+
+
+class FixedProgressBar(TQDMProgressBar):
+    """
+    A custom progress bar for PyTorch Lightning which addresses potential compatibility issues with some IDEs that
+    do not display the default progress bar properly.
+
+    This progress bar inherits from the default TQDMProgressBar provided by PyTorch Lightning and modifies the
+    initialization of the progress bars for validation, prediction, and testing.
+
+    Example Usage
+    --------------
+    ```python
+
+    callbacks = []
+    callbacks.append(FixedProgressBar())
+
+    # add any other callbacks if needed
+
+    trainer = pl.Trainer(callbacks=callbacks,
+                         **params)
+    --------------
+    """
+    def init_validation_tqdm(self):
+        """
+        Initialize the progress bar for validation phase.
+
+        Returns
+        ----------
+        bar : tqdm.tqdm
+            The tqdm progress bar object for validation.
+        """
+        bar = super().init_validation_tqdm()
+
+        # Disable the progress bar if stdout is not a TTY (i.e., it's not an interactive terminal)
+        if not sys.stdout.isatty():
+            bar.disable = True
+        return bar
+
+    def init_predict_tqdm(self):
+        """
+        Initialize the progress bar for prediction phase.
+
+        Returns
+        ----------
+        bar : tqdm.tqdm
+            The tqdm progress bar object for predicting.
+        """
+        bar = super().init_predict_tqdm()
+
+        # Disable the progress bar if stdout is not a TTY (i.e., it's not an interactive terminal)
+        if not sys.stdout.isatty():
+            bar.disable = True
+        return bar
+
+    def init_test_tqdm(self):
+        """
+        Initialize the progress bar for testing phase.
+
+        Returns
+        ----------
+        bar : tqdm.tqdm
+            TThe tqdm progress bar object for testing.
+        """
+        bar = super().init_test_tqdm()
+
+        # Disable the progress bar if stdout is not a TTY (i.e., it's not an interactive terminal)
+        if not sys.stdout.isatty():
+            bar.disable = True
+        return bar
diff --git a/combo/ner_modules/callbacks/__init__.py b/combo/ner_modules/callbacks/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/classifiers/CrfClassifier.py b/combo/ner_modules/classifiers/CrfClassifier.py
new file mode 100644
index 0000000..8712934
--- /dev/null
+++ b/combo/ner_modules/classifiers/CrfClassifier.py
@@ -0,0 +1,324 @@
+import torch
+import torch.nn as nn
+from ..data.SpecialTokens import SpecialTokens
+
+START_TOKEN, END_TOKEN, PAD_TOKEN = SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN, SpecialTokens.PAD_TOKEN
+
+
+class CrfClassifier(nn.Module):
+    """
+    A class that defines a Conditional Random Field (CRF) classifier layer.
+    The model is capable of transforming the encoder's output into the tag space, considering different strategies
+    like "bilstm", "transformer", or "linear". It also includes methods for the forward algorithm, Viterbi decoding,
+    and negative log likelihood calculation for training and prediction.
+
+    Attributes:
+    ----------
+    label_to_id_map : dict
+        Mapping of labels to their respective unique identifiers.
+    input_dim : int
+        Dimension of the output of the encoder.
+    to_tag_space : str, optional (default: 'linear')
+        The strategy to map the output of the encoder into the tag space.
+        Choices: 'linear', 'bilstm', 'transformer'.
+    start_label_id : int
+        Identifier for the start token label.
+    stop_label_id : int
+        Identifier for the end token label.
+    num_labels : int
+        Total number of labels.
+    hidden2tag : torch.nn.Linear
+        Linear layer to transform the encoder's output into the tag space.
+    BiLSTM : torch.nn.LSTM (optional)
+        Bi-directional LSTM layer, if 'bilstm' is chosen for 'to_tag_space'.
+    Transformer : torch.nn.TransformerEncoderLayer (optional)
+        Transformer layer, if 'transformer' is chosen for 'to_tag_space'.
+    transitions : torch.nn.Parameter
+        Matrix of transition parameters, representing scores for transitioning from one state to another.
+
+    Methods:
+    ----------
+    init_transition(self):
+        Initializes transition constraints according to specific rules.
+    _forward_alg(self, feats):
+        Forward algorithm to calculate log probabilities.
+    _score_sentence(self, feats, label_ids):
+        Gives the score of a provided label sequence.
+    _viterbi_decode(self, feats):
+        Performs Viterbi decoding to find the best path, given the features.
+    neg_log_likelihood(self, encoder_outputs, label_ids):
+        Computes the negative log likelihood for the given encoder outputs and label sequence.
+    forward(self, encoder_outputs):
+        Performs forward computation to find the score and label sequence IDs, used for prediction.
+    log_sum_exp_batch(log_Tensor, axis=-1):
+        A static method that computes the log sum exponential operation.
+    """
+    def __init__(self,
+                 label_to_id_map: dict,
+                 input_dim: int,
+                 to_tag_space: str = "linear") -> None:
+        super(CrfClassifier, self).__init__()
+        self.input_dim = input_dim  # dimension of output of the encoder
+
+        # Tag space
+        self.label_to_id_map = label_to_id_map
+        self.start_label_id = label_to_id_map[START_TOKEN]
+        self.stop_label_id = label_to_id_map[END_TOKEN]
+        self.num_labels = len(label_to_id_map)
+
+        # Maps the output of the encoder into tag space.
+        self.to_tag_space = to_tag_space
+        self.hidden2tag = nn.Linear(input_dim, self.num_labels)
+
+        if to_tag_space == "bilstm":
+            self.BiLSTM = nn.LSTM(bidirectional=True,
+                                  num_layers=2,
+                                  input_size=input_dim,
+                                  hidden_size=input_dim // 2,
+                                  batch_first=True)
+        elif to_tag_space == "transformer":
+            self.Transformer = torch.nn.TransformerEncoderLayer(d_model=input_dim,
+                                                                nhead=16,
+                                                                batch_first=True)
+        elif to_tag_space == "bigru":
+            self.BiLSTM = nn.GRU(bidirectional=True,
+                                 num_layers=2,
+                                 input_size=input_dim,
+                                 hidden_size=input_dim // 2,
+                                 batch_first=True)
+
+        # Matrix of transition parameters.  Entry i,j is the score of
+        # transitioning *to* i *from* j.
+        self.transitions = nn.Parameter(
+            torch.randn(self.num_labels, self.num_labels))
+
+        self.init_transition()
+
+    def init_transition(self) -> None:
+        """
+        Initializes the transition constraints for the CRF model according to specific rules regarding start, stop,
+        padding tokens, and transitions between different entity tags. Enforced rules are:
+        1. We never transfer to the start tag.
+        2. We never transfer from the stop tag unless to pad tag.
+        3. After B-x going to I-y is impossible.
+        4. After O going to I-x is impossible.
+        5. Going to <PAD> tag from different tag than stop tag or <PAD>.
+        """
+        # create entity name list
+        entity_list = [entity.split("-")[-1] for entity in self.label_to_id_map.keys() if entity.startswith("B-")]
+
+        # We never transfer to the start tag
+        self.transitions.data[self.start_label_id, :] = -10000.
+        # We never transfer from the stop tag unless to pad tag
+        for entity in self.label_to_id_map.keys():
+            if entity != PAD_TOKEN:
+                self.transitions.data[self.label_to_id_map[entity], self.stop_label_id] = -10000.
+
+        # after B-x going to I-y is impossible
+        for previous_tag in entity_list:
+            for next_tag in entity_list:
+                if "I-"+next_tag not in self.label_to_id_map.keys() or "B-"+previous_tag not in self.label_to_id_map.keys():
+                    continue
+                if previous_tag != next_tag:
+                    self.transitions.data[self.label_to_id_map["I-" + next_tag], self.label_to_id_map["B-" + previous_tag]] = -10000.
+
+        # after O going to I-x is impossible
+        for next_tag in entity_list:
+            if "I-"+next_tag not in self.label_to_id_map.keys():
+                continue
+            self.transitions.data[self.label_to_id_map["I-" + next_tag], self.label_to_id_map["O"]] = -10000.
+
+        # going to <PAD> tag from different tag than stop tag or <PAD> tag is impossible
+        for previous_tag in self.label_to_id_map.keys():
+            if previous_tag != PAD_TOKEN and previous_tag != END_TOKEN:
+                self.transitions.data[self.label_to_id_map[PAD_TOKEN], self.label_to_id_map[previous_tag]] = -10000.
+
+    def _forward_alg(self, feats) -> torch.Tensor:
+        """
+         Implements the forward algorithm to calculate log probabilities for a sequence.
+
+        Parameters:
+        ----------
+        feats : torch.Tensor
+            Features from the previous layer.
+
+        Returns:
+        -------
+        torch.Tensor
+            Log probabilities for the sequence.
+        """
+        # T = self.max_seq_length
+        T = feats.shape[1]
+        batch_size = feats.shape[0]
+
+        # alpha_recursion,forward, alpha(zt)=p(zt,bar_x_1:t)
+        log_alpha = torch.Tensor(batch_size, 1, self.num_labels).fill_(-10000.)
+        # normal_alpha_0 : alpha[0]=Ot[0]*self.PIs
+        # self.start_label has all of the score. it is log,0 is p=1
+        log_alpha[:, 0, self.start_label_id] = 0
+
+        # feats: sentences -> word embedding -> lstm -> MLP -> feats
+        # feats is the probability of emission, feat.shape=(1,tag_size)
+        for t in range(1, T):
+            log_alpha = (self.log_sum_exp_batch(self.transitions + log_alpha.to(self.transitions.device), axis=-1) + feats[:, t]).unsqueeze(1)
+
+        # log_prob of all barX
+        log_prob_all_barX = self.log_sum_exp_batch(log_alpha)
+        return log_prob_all_barX
+
+    def _score_sentence(self, feats, label_ids) -> torch.Tensor:
+        """
+        Gives the score of a provided label sequence
+        p(X=w1:t,Zt=tag1:t)=...p(Zt=tag_t|Zt-1=tag_t-1)p(xt|Zt=tag_t)...
+            Gives the score of a provided label sequence based on the CRF's parameters.
+        Parameters:
+        ----------
+        feats : torch.Tensor
+            Features from the previous layer.
+        label_ids : torch.Tensor
+            Tensor of label IDs for the sequence.
+
+        Returns:
+        -------
+        torch.Tensor
+            Score for the provided label sequence.
+        """
+
+        T = feats.shape[1]
+        batch_size = feats.shape[0]
+
+        batch_transitions = self.transitions.expand(batch_size, self.num_labels, self.num_labels)
+        batch_transitions = batch_transitions.flatten(1)
+
+        score = torch.zeros((feats.shape[0], 1)).to(label_ids.device)
+        # the 0th node is start_label->start_word,the probability of them=1. so t begin with 1.
+        # label_ids = torch.where(label_ids == -100, torch.tensor(self.tag_to_ix[PAD_TOKEN]), label_ids)
+
+        for t in range(1, T):
+            score = score + \
+                    batch_transitions.gather(-1, (label_ids[:, t] * self.num_labels + label_ids[:, t - 1]).view(-1, 1)) + \
+                    feats[:, t].gather(-1, label_ids[:, t].view(-1, 1)).view(-1, 1)
+        return score
+
+    def _viterbi_decode(self, feats):
+        """
+        Viterbi decoding algorithm to find the best path through the CRF's states.
+        Parameters:
+        ----------
+        feats : torch.Tensor
+            Features from the previous layer.
+
+        Returns:
+        -------
+        torch.Tensor
+            Maximum log likelihood for the sequence.
+        torch.Tensor
+            The best path through the CRF's states.
+        """
+
+        T = feats.shape[1]
+        batch_size = feats.shape[0]
+
+        log_delta = torch.Tensor(batch_size, 1, self.num_labels).fill_(-10000.).to(feats.device)
+        log_delta[:, 0, self.start_label_id] = 0
+
+        # psi is for the vaule of the last latent that make P(this_latent) maximum.
+        psi = torch.zeros((batch_size, T, self.num_labels), dtype=torch.long).to(feats.device) # psi[0]=0000 useless
+        for t in range(1, T):
+            # delta[t][k]=max_z1:t-1( p(x1,x2,...,xt,z1,z2,...,zt-1,zt=k|theta) )
+            # delta[t] is the max prob of the path from  z_t-1 to z_t[k]
+            log_delta, psi[:, t] = torch.max(self.transitions + log_delta, -1)
+            # psi[t][k]=argmax_z1:t-1( p(x1,x2,...,xt,z1,z2,...,zt-1,zt=k|theta) )
+            # psi[t][k] is the path chosen from z_t-1 to z_t[k],the value is the z_state(is k) index of z_t-1
+            log_delta = (log_delta + feats[:, t]).unsqueeze(1)
+
+        # trace back
+        path = torch.zeros((batch_size, T), dtype=torch.long).to(feats.device)
+
+        # max p(z1:t,all_x|theta)
+        max_logLL_allz_allx, path[:, -1] = torch.max(log_delta.squeeze(), -1)
+
+        for t in range(T - 2, -1, -1):
+            # choose the state of z_t according the state choosed of z_t+1.
+            path[:, t] = psi[:, t + 1].gather(-1, path[:, t + 1].view(-1, 1)).squeeze()
+
+        return max_logLL_allz_allx, path
+
+    def neg_log_likelihood(self, encoder_outputs, label_ids):
+        """
+        Computes the negative log likelihood for the given encoder outputs and label sequence.
+
+        Parameters:
+        ----------
+        encoder_outputs : torch.Tensor
+            Outputs from the encoder.
+        label_ids : torch.Tensor
+            Tensor of label IDs for the sequence.
+
+        Returns:
+        -------
+        torch.Tensor
+            Negative log likelihood.
+        """
+        if self.to_tag_space == "transformer":
+            encoder_outputs = self.Transformer(encoder_outputs)
+        elif self.to_tag_space == "bilstm":
+            encoder_outputs, _ = self.BiLSTM(encoder_outputs)
+
+        # transform to tag space
+        outputs = self.hidden2tag(encoder_outputs)
+
+        forward_score = self._forward_alg(outputs)
+        # p(X=w1:t,Zt=tag1:t)=...p(Zt=tag_t|Zt-1=tag_t-1)p(xt|Zt=tag_t)...
+        gold_score = self._score_sentence(outputs, label_ids)
+        # - log[ p(X=w1:t,Zt=tag1:t)/p(X=w1:t) ] = - log[ p(Zt=tag1:t|X=w1:t) ]
+        return torch.mean(forward_score - gold_score)
+
+    def forward(self, encoder_outputs):
+        """
+        Forward computation to find the score and label sequence IDs, used for prediction.
+
+        Parameters:
+        ----------
+        encoder_outputs : torch.Tensor
+            Outputs from the encoder.
+
+        Returns:
+        -------
+        torch.Tensor
+            Score for the sequence.
+        torch.Tensor
+            Label sequence IDs for the sequence.
+        """
+        if self.to_tag_space == "transformer":
+            encoder_outputs = self.Transformer(encoder_outputs)
+        elif self.to_tag_space == "bilstm":
+            encoder_outputs, _ = self.BiLSTM(encoder_outputs)
+
+        # transform to tag space
+        encoder_outputs = self.hidden2tag(encoder_outputs)
+
+        # Find the best path, given the features.
+        score, label_seq_ids = self._viterbi_decode(encoder_outputs)
+        return score, label_seq_ids
+
+    @staticmethod
+    def log_sum_exp_batch(log_Tensor, axis=-1) -> torch.Tensor:  # shape (batch_size,n,m)
+        """
+        A static method that computes the log sum exponential operation for a given tensor along a specific axis.
+
+        Parameters:
+        ----------
+        log_Tensor : torch.Tensor
+            Input tensor.
+        axis : int, optional (default: -1)
+            Axis along which to compute the log sum exponential.
+
+        Returns:
+        -------
+        torch.Tensor
+            Result of the log sum exponential operation.
+        """
+        return torch.max(log_Tensor, axis)[0] + torch.log(
+            torch.exp(log_Tensor - torch.max(log_Tensor, axis)[0].view(log_Tensor.shape[0], -1, 1)).sum(axis))
+
diff --git a/combo/ner_modules/classifiers/VanillaClassifier.py b/combo/ner_modules/classifiers/VanillaClassifier.py
new file mode 100644
index 0000000..be762b8
--- /dev/null
+++ b/combo/ner_modules/classifiers/VanillaClassifier.py
@@ -0,0 +1,59 @@
+import torch.nn as nn
+from ..data.SpecialTokens import SpecialTokens
+
+PAD_TOKEN, START_TOKEN, END_TOKEN = SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+class VanillaClassifier(nn.Module):
+    """
+    A customizable classifier that supports Linear, BiLSTM, or Transformer layers to map input features to a fixed
+    number of labels.
+
+    Attributes:
+    ----------
+    tag_mapper : torch.nn.Module, optional
+        Layer for mapping to the tag space. Can be LSTM, Transformer, or None (for a linear mapping).
+    linear : torch.nn.Linear
+        Linear layer mapping the input (or the output of tag_mapper) to the label space.
+
+    """
+    def __init__(self,
+                 label_to_id_map: dict,
+                 input_dim: int,
+                 to_tag_space: str = "linear"):
+        """
+        Parameters:
+        ----------
+        label_to_id_map : dict
+            Mapping of labels to their respective unique identifiers
+        input_dim : int
+            Dimensionality of the input features.
+        to_tag_space : str, optional (default: "linear")
+            Specifies the tag space mapping, either "linear", "bilstm", or "transformer".
+
+        """
+        super(VanillaClassifier, self).__init__()
+        num_labels = len(label_to_id_map) - len({START_TOKEN, END_TOKEN, PAD_TOKEN} & set(label_to_id_map.keys()))
+
+        if to_tag_space == "bilstm":
+            self.tag_mapper = nn.LSTM(input_dim, input_dim, bidirectional=True, batch_first=True)
+            self.linear = nn.Linear(in_features=input_dim * 2, out_features=num_labels)
+        elif to_tag_space == "transformer":
+            self.tag_mapper = nn.Transformer(input_dim, input_dim)
+            self.linear = nn.Linear(in_features=input_dim, out_features=num_labels)
+        else:  # "linear"
+            self.tag_mapper = None
+            self.linear = nn.Linear(in_features=input_dim, out_features=num_labels)
+
+    def forward(self, x):
+        """
+        Parameters:
+        ----------
+        x : torch.Tensor
+            Input tensor with features which should output of encoder on the word level.
+        """
+        if self.tag_mapper:
+            x, _ = self.tag_mapper(x)
+        out = self.linear(x)
+        return out
+
diff --git a/combo/ner_modules/classifiers/__init__.py b/combo/ner_modules/classifiers/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/data/NerDataset.py b/combo/ner_modules/data/NerDataset.py
new file mode 100644
index 0000000..83887aa
--- /dev/null
+++ b/combo/ner_modules/data/NerDataset.py
@@ -0,0 +1,130 @@
+from torch.utils.data import Dataset
+from pathlib import Path
+from .SpecialTokens import SpecialTokens
+from .NerTokenizer import NerTokenizer
+from typing import Dict
+
+CHAR_PAD_TOKEN, CHAR_START_TOKEN, CHAR_END_TOKEN, CHAR_UNKNOWN_TOKEN, PAD_TOKEN, START_TOKEN, END_TOKEN = \
+    SpecialTokens.CHAR_PAD_TOKEN, SpecialTokens.CHAR_START_TOKEN, SpecialTokens.CHAR_END_TOKEN, \
+    SpecialTokens.CHAR_UNKNOWN_TOKEN, SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+class NerDataset(Dataset):
+    """
+    Named Entity Recognition (NER) Dataset.
+    A PyTorch dataset class for reading and tokenizing NER data from a file. The file with data should adhere to the
+    following structure:
+    - Each line consists of an <entity> <tag> pair, delimited by a space.
+    - Consecutive lines represent words in the same sentence, in their original order.
+    - The start of a new sentence is indicated by a metadata line: `# sent_id = <n>`, where `<n>` is a unique
+      sentence identifier within the file.
+    - A newline character demarcates the end of each sentence.
+
+    Attributes:
+    ----------
+    tokenizer : NerTokenizer
+        Custom NerTokenizer object for encoding the entities.
+    sentences : List[List]
+        List of list of entities - strings. Inner list can be understood as sentence.
+    sentence_id : List[int]
+        List of unique sentence IDs.
+    labels : List[List]
+        List of lists of labels corresponding to each tokenized sentence.
+    max_sentence_len : int
+        Length of the longest sentence in the dataset.
+    max_word_len : int
+        Length of the longest word in the dataset.
+
+    """
+
+    def __init__(self,
+                 tokenizer: NerTokenizer,
+                 file_path: Path,
+                 encoding: str = 'utf-8') -> None:
+        """
+        Initializes the dataset with a tokenizer, reads the data, and processes it. Tokenizer is expected to be a custom
+        NerTokenizer. Other tokenizers were not tested.
+
+        Parameters:
+        ----------
+        tokenizer : NerTokenizer
+            The tokenizer for encoding entities and labels.
+        file_path : Path
+            File path to the data.
+        encoding : str (optional)
+            Encoding of the data file. Defaults to 'utf-8'.
+        """
+        # save tokenizer
+        self.tokenizer = tokenizer
+
+        # data holders
+        self.sentences = []
+        self.sentence_id = []
+        self.labels = []
+
+        # additional information about data
+        self.max_sentence_len = 0
+        self.max_word_len = 0
+
+        # read data
+        self._read_file(file_path=file_path,
+                        encoding=encoding)
+
+    def __len__(self) -> int:
+        return len(self.sentences)
+
+    def __getitem__(self,
+                    index: int) -> Dict:
+        # retrieve data
+        words = self.sentences[index]
+        labels = self.labels[index]
+
+        # use tokenizer to encode it
+        output = self.tokenizer.encode(input_entities=words,
+                                       labels=labels)
+        return output
+
+    def _read_file(self,
+                   file_path: Path,
+                   encoding: str) -> None:
+        """
+        Reads the data file and processes it, populating sentences, labels, and other metadata.
+
+        Parameters:
+        ----------
+        file_path : Path
+            Path to the data file.
+        encoding : str
+            Encoding of the data file.
+        """
+        # Reading file
+        with open(file_path, 'r', encoding=encoding) as f:
+            words = []
+            labels = []
+
+            for line in f:
+                # at the end of each sequence of entities from the same sentence there should be "\n"
+                if line == '\n':
+                    # update longest sentence
+                    self.max_sentence_len = max(self.max_sentence_len, len(words))
+
+                    # save labels and words
+                    self.sentences.append(words)
+                    self.labels.append(labels)
+                    words = []
+                    labels = []
+
+                # save sentence id at the beginning of every sequence of entities
+                elif line.startswith("# sent_id ="):
+                    self.sentence_id.append(line.split()[3])
+
+                # otherwise it should be entity and tag separated by space
+                else:
+                    parts = line.strip().split()
+                    words.append(parts[0])
+                    labels.append(parts[-1])
+
+                    # update longest word length
+                    self.max_word_len = max(self.max_word_len, len(parts[0]))
+
+        self.max_word_len += 2  # for <b> and <e> tokens
diff --git a/combo/ner_modules/data/NerTokenizer.py b/combo/ner_modules/data/NerTokenizer.py
new file mode 100644
index 0000000..001b7d9
--- /dev/null
+++ b/combo/ner_modules/data/NerTokenizer.py
@@ -0,0 +1,404 @@
+import torch
+from transformers import BertTokenizer, AutoTokenizer
+from typing import Dict, List, Optional
+from .SpecialTokens import SpecialTokens
+from ..utils.download import download_file
+from lambo.segmenter.lambo import Lambo
+from pathlib import Path
+import json
+
+CHAR_PAD_TOKEN, CHAR_START_TOKEN, CHAR_END_TOKEN, CHAR_UNKNOWN_TOKEN, PAD_TOKEN, START_TOKEN, END_TOKEN = \
+    SpecialTokens.CHAR_PAD_TOKEN, SpecialTokens.CHAR_START_TOKEN, SpecialTokens.CHAR_END_TOKEN, \
+    SpecialTokens.CHAR_UNKNOWN_TOKEN, SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+class NerTokenizer:
+    """
+       Named Entity Recognition (NER) Tokenizer.
+
+       A tokenizer tailored for tokenizing entities and their corresponding labels.
+       This tokenizer provides the flexibility to encode characters, entities, and
+       labels. It can utilize pre-trained tokenizers, such as BERT and AutoTokenizer,
+       and augment them with custom tokenization techniques. Based on specification passed
+       in initialization it will return
+
+       Attributes:
+       ----------
+       backbone_tokenizer : transformers.PreTrainedTokenizer
+          The tokenizer from transformers BertTokenizer or AutoTokenizer.
+       char_to_id : Dict[str, int]
+           Mapping of characters to their respective unique identifiers.
+       label_to_id : Dict[str, int]
+           Mapping of labels to their respective unique identifiers.
+       max_word_len : int
+           Maximum length of word, used for padding.
+       use_start_end_token : bool
+           Indicates whether to append special start and end tokens to a sentence.
+       tokenize_entities : bool
+           Indicates whether to additionaly tokenize entities. If True, entities like "Doing" will be tokenized to "Do"
+            and "##ing" to fit BERT model's vocabulary. If False, entities will be left as they are which can result
+            in entities represented by BERT <unk> token.
+       use_char_level_embeddings : bool
+           Indicates whether to generate character-level embeddings.
+
+       Methods:
+       --------
+       encode(input_entities, labels=None) -> Dict:
+           Tokenizes and encodes input entities and their corresponding labels.
+       encode_sentence(words: List[str]) -> Tuple:
+           Encodes a sentence of words.
+       _encode_labels(labels: List[str], max_word_index: int) -> torch.Tensor:
+           Encodes labels into a tensor of label IDs.
+       _encode_characters(words: List[str], max_word_index: int) -> torch.Tensor:
+           Encodes characters of words into a tensor of character IDs.
+       _create_prediction_mask(words: List[str], max_word_index: int) -> List[int]:
+           Creates a prediction mask for the words.
+    """
+    def __init__(self,
+                 pretrained_model_type: str,
+                 pretrained_model_name: str,
+                 char_to_id_map: Dict[str, int] = None,
+                 label_to_id_map: Dict[str, int] = None,
+                 use_char_level_embeddings: bool = False,
+                 use_start_end_token: bool = False,
+                 tokenize_entities: bool = False,
+                 language: str = "pl",
+                 max_word_len: int = 69,
+                 load_lambo_tokenizer: bool = True):
+        """
+        Parameters:
+        ----------
+        pretrained_model_type : str
+            Type of the pre-trained model to be used for tokenization (e.g., "BertModel", "AutoModel").
+        pretrained_model_name : str
+            Name of the pre-trained model or path.
+        char_to_id_map : Dict[str, int], optional
+            Mapping of characters to unique IDs.
+        label_to_id_map : Dict[str, int], optional
+            Mapping of labels to unique IDs.
+        use_char_level_embeddings : bool, default=False
+            If True, character-level embeddings will be used.
+        use_start_end_token : bool, default=False
+            If True, special start and end tokens will be appended.
+        tokenize_entities : bool, default=False
+            If True, entities will be tokenized.
+         """
+
+        assert label_to_id_map, "Specify label_to_id_map"
+        assert char_to_id_map or not use_char_level_embeddings, \
+            "Specify char_to_id_map if you want to use character embeddings"
+
+        # define backbone tokenizer
+        if pretrained_model_type == "BertModel":
+            self.backbone_tokenizer = BertTokenizer.from_pretrained(pretrained_model_name)
+        elif pretrained_model_type == "AutoModel":
+            self.backbone_tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name)
+        else:
+            raise ValueError("Not supported pretrained_model_type")
+
+        # save mapping to ids
+        self.char_to_id = char_to_id_map
+        self.label_to_id = label_to_id_map
+
+        # maximum word length
+        self.max_word_len = max_word_len
+
+        # information about what needs to be returned
+        self.use_start_end_token = use_start_end_token
+        self.tokenize_entities = tokenize_entities
+        self.use_char_level_embeddings = use_char_level_embeddings
+
+        # lambo segmenter
+        if load_lambo_tokenizer:
+            self.segmenter = Lambo.get(language, with_splitter=False)
+
+    def encode(self,
+               input_entities,
+               labels: Optional[List[str]] = None,
+               batchify: bool = False):
+        """
+        Tokenizes and encodes input entities and their corresponding labels if provided. If batchify is True returned
+        dictionary with tensors will be batchified.
+        """
+        if isinstance(input_entities, list):
+            # If input is a list of entities which happens during training this encoding is done
+            input_ids, attention_mask, word_ids, max_word_index = self.encode_sentence(words=input_entities)
+
+            output = dict(
+                input_ids=input_ids,
+                attention_mask=attention_mask)
+
+            # if labels are provided we encode them
+            if labels:
+                label_ids = self._encode_labels(labels=labels,
+                                                max_word_index=max_word_index)
+                output["labels_ids"] = label_ids
+
+            # when entities are not additionaly tokenized word_ids won't be provided
+            if word_ids is not None:
+                output["word_ids"] = word_ids
+
+            # if character embeddings are used we encode words
+            if self.use_char_level_embeddings:
+                char_ids = self._encode_characters(words=input_entities, max_word_index=max_word_index)
+                output["char_ids"] = char_ids
+
+            output["prediction_mask"] = self._create_prediction_mask(words=input_entities,
+                                                                     max_word_index=max_word_index)
+
+            # when we use tokenizer for prediction we need to batchify data
+            if batchify:
+                output = {key: value.unsqueeze(0) for key, value in output.items()}
+
+            return output
+        elif isinstance(input_entities, str):
+            # This is for custom prediction on strings. Segmentation using lambo has to be done before prediction
+            document = self.segmenter.segment(input_entities)
+            data = []
+            entities = []
+            for turn in document.turns:
+                for sentence in turn.sentences:
+                    sentence_tokens = [token.text for token in sentence.tokens]
+                    entities.append(sentence_tokens)
+
+                    # encoding
+                    input_ids, attention_mask, word_ids, max_word_index = self.encode_sentence(words=sentence_tokens)
+
+                    output = dict(
+                        input_ids=input_ids,
+                        attention_mask=attention_mask)
+
+                    if word_ids is not None:
+                        output["word_ids"] = word_ids
+
+                    if self.use_char_level_embeddings:
+                        char_ids = self._encode_characters(words=sentence_tokens, max_word_index=max_word_index)
+                        output["char_ids"] = char_ids
+
+                    output["prediction_mask"] = self._create_prediction_mask(words=sentence_tokens,
+                                                                             max_word_index=max_word_index)
+                    data.append(output)
+
+            batched_data = {key: torch.stack([d[key] for d in data]) for key in data[0].keys()}
+            return batched_data, entities
+        else:
+            # This is for custom prediction on strings
+            raise ValueError("Not supported input type")
+
+    def encode_sentence(self,
+                        words: List[str]):
+        """Transforms list of words/entities into a sequence of token ids, attentin mask for BERT model, mapping from
+         tokens to words and maximal word index. Also pads data and adds special tokens if needed."""
+        word_ids = None
+        if not self.tokenize_entities:
+            # if entities are not to be tokenized we encode them using tokenizer at once
+            # this method will only work on BertTokenizer but not AutoTokenizer
+            encoded_sentence = self.backbone_tokenizer.encode_plus(
+                words,
+                add_special_tokens=self.use_start_end_token,
+                return_token_type_ids=False,
+                truncation=True,
+                max_length=self.backbone_tokenizer.model_max_length,
+                padding="max_length",
+                return_attention_mask=True,
+                return_tensors="pt"
+            )
+
+            max_word_index = self.backbone_tokenizer.model_max_length - 2 if self.use_start_end_token else \
+                self.backbone_tokenizer.model_max_length
+        else:
+            # since tokenizers doesn't provide valid mapping from token to entity we need to do it manually
+            input_ids = []
+            word_ids = []
+            attention_mask = []
+
+            # if start and end tokens are used we need to subtract 2 from max length of entities in sentence
+            max_length = self.backbone_tokenizer.model_max_length - 2 if self.use_start_end_token else \
+                self.backbone_tokenizer.model_max_length
+
+            # enumerate words and encode them one by one
+            for i, word in enumerate(words):
+                word_tokenized_dict = self.backbone_tokenizer(word, add_special_tokens=False)
+                if len(input_ids) + len(word_tokenized_dict["input_ids"]) > max_length:
+                    # there is no need to add more tokens because they will be truncated anyway
+                    break
+
+                if len(word_tokenized_dict["input_ids"]) == 0:
+                    # dealing with strange tokenizers that return empty list
+                    input_ids += [self.backbone_tokenizer.unk_token_id]
+                    word_ids += [i]
+                    attention_mask += [1]
+                else:
+                    input_ids += word_tokenized_dict["input_ids"]
+                    word_ids += [i] * len(word_tokenized_dict["input_ids"])  # mapping token -> word starting from 0
+                    attention_mask += word_tokenized_dict["attention_mask"]
+
+            if self.use_start_end_token:
+                # adding start and end tokens
+                input_ids = [self.backbone_tokenizer.cls_token_id] + input_ids + [self.backbone_tokenizer.sep_token_id]
+                word_ids = [-1] + word_ids + [-1]  # they are not words so we use -1
+                attention_mask = [1] + attention_mask + [1]  # attention should be applied to them
+
+            # padding
+            input_ids += [self.backbone_tokenizer.pad_token_id] *\
+                         (self.backbone_tokenizer.model_max_length - len(input_ids))
+            word_ids += [-1] * (self.backbone_tokenizer.model_max_length - len(word_ids))  # these are not words so we use -1
+            attention_mask += [0] * (self.backbone_tokenizer.model_max_length - len(attention_mask))
+
+            encoded_sentence = dict(
+                input_ids=torch.tensor(input_ids),
+                attention_mask=torch.tensor(attention_mask)
+            )
+
+            max_word_index = max(word_ids) + 1  # word ids start from 0
+
+        if word_ids is not None:
+            word_ids = torch.tensor(word_ids)
+
+        return encoded_sentence["input_ids"].squeeze(0), encoded_sentence["attention_mask"].squeeze(0), word_ids, \
+            max_word_index
+
+    def _encode_labels(self,
+                       labels: List[str],
+                       max_word_index: int):
+        """
+        Encodes labels into a sequence of label ids and pads them
+        """
+        # Encoding labels and truncating if needed
+        encoded_labels = [self.label_to_id[label] for label in labels[:max_word_index]]
+
+        if self.use_start_end_token:
+            # adding start and end token if start and end tokens are used
+            encoded_labels = [self.label_to_id[START_TOKEN]] + encoded_labels + [self.label_to_id[END_TOKEN]]
+
+        # Padding labels
+        encoded_labels += [self.label_to_id[PAD_TOKEN]] * (self.backbone_tokenizer.model_max_length - len(encoded_labels))
+
+        return torch.tensor(encoded_labels)
+
+    def _encode_characters(self,
+                           words: List[str],
+                           max_word_index: int) -> torch.Tensor:
+        """
+        Encodes the characters of each word into a sequence of character ids.
+        """
+        # Splitting characters to create character ids
+        characters = [[self.char_to_id.get(char, self.char_to_id[CHAR_UNKNOWN_TOKEN]) for char in word] for word in
+                      words[:max_word_index]]
+
+        # adding <b> and <e> tokens and truncating if characters exceed max length
+        characters = [[self.char_to_id[CHAR_START_TOKEN]] + word[:self.max_word_len-2] +
+                      [self.char_to_id[CHAR_END_TOKEN]] for word in characters]
+
+        # Padding character sequence
+        characters = [word + [self.char_to_id[CHAR_PAD_TOKEN]] *
+                      (self.max_word_len - len(word)) for word in characters]
+
+        # Padding word sequence
+        # START token is used then add padding at the beginning
+        if self.use_start_end_token:
+            characters = [[self.char_to_id[CHAR_PAD_TOKEN]] * self.max_word_len] + characters
+
+        characters += [[self.char_to_id[CHAR_PAD_TOKEN]] * self.max_word_len] * (
+                    self.backbone_tokenizer.model_max_length - len(characters))
+
+        return torch.tensor(characters)
+
+    def _create_prediction_mask(self,
+                                words: List[str],
+                                max_word_index: int) -> torch.Tensor:
+        """
+        Creates a prediction mask for the words so when predicting we can ignore the padding and special tokens.
+        """
+        mask = [1]*min(len(words), max_word_index)
+
+        if self.use_start_end_token:
+            mask = [0] + mask + [0]
+
+        # padding
+        mask += [0] * (self.backbone_tokenizer.model_max_length - len(mask))
+        return torch.tensor(mask)
+
+    def decode(self, ids):
+        """
+        Decode a list of IDs or list of lists of IDs to their corresponding labels.
+        """
+        # if predicted tag is PAD or START or END we return O tag
+        id_to_label = {v: (k if k not in [PAD_TOKEN, END_TOKEN, START_TOKEN] else "O")
+                       for k, v in self.label_to_id.items()}
+
+        if len(ids) == 0:
+            return []
+
+        # Check if it's a list of lists
+        if isinstance(ids[0], list):
+            return [[id_to_label[i] for i in inner_list] for inner_list in ids]
+        else:
+            return [id_to_label[i] for i in ids]
+
+    @classmethod
+    def get(cls,
+            model_name: str,
+            load_lambo_tokenizer : bool = True):
+        """
+        Downloads and loads pretrained tokenizer from MinIO
+        """
+        # Downloading files and loading jsons
+        PATH_CONFIG = Path(download_file(model_name, "config.json"))
+        config = json.load(open(PATH_CONFIG))
+
+        try:
+            PATH_CHAR_TO_ID = Path(download_file(model_name, "char_to_id.json"))
+            char_to_id = json.load(open(PATH_CHAR_TO_ID))
+        except:
+            char_to_id = {}
+
+        PATH_LABEL_TO_ID = Path(download_file(model_name, "label_to_id.json"))
+        label_to_id = json.load(open(PATH_LABEL_TO_ID))
+
+        # load tokenizer
+        tokenizer = NerTokenizer(pretrained_model_type=config["model"]["bert_embedder"]["pretrained_model_type"],
+                                 pretrained_model_name=config["model"]["bert_embedder"]["pretrained_model_name"],
+                                 char_to_id_map=char_to_id,
+                                 label_to_id_map=label_to_id,
+                                 use_char_level_embeddings=config["data"]["use_char_level_embeddings"],
+                                 use_start_end_token=config["data"]["use_start_end_token"],
+                                 tokenize_entities=config["data"]["tokenize_entities"],
+                                 language=config["data"].get("language", "pl"),
+                                 max_word_len=config["data"].get("max_word_len", 69),
+                                 load_lambo_tokenizer=load_lambo_tokenizer)
+
+        return tokenizer
+
+    @classmethod
+    def load_from_disc(cls,
+                       folder_path: Path,
+                       load_lambo_tokenizer : bool = True):
+        """
+        Loads pretrained tokenizer from disc
+        """
+        # Loading jsons
+        PATH_CONFIG = folder_path / "config.json"
+        config = json.load(open(PATH_CONFIG))
+
+        try:
+            PATH_CHAR_TO_ID = folder_path / "char_to_id.json"
+            char_to_id = json.load(open(PATH_CHAR_TO_ID))
+        except:
+            char_to_id = {}
+
+        PATH_LABEL_TO_ID = folder_path / "label_to_id.json"
+        label_to_id = json.load(open(PATH_LABEL_TO_ID))
+
+        # load tokenizer
+        tokenizer = NerTokenizer(pretrained_model_type=config["model"]["bert_embedder"]["pretrained_model_type"],
+                                 pretrained_model_name=config["model"]["bert_embedder"]["pretrained_model_name"],
+                                 char_to_id_map=char_to_id,
+                                 label_to_id_map=label_to_id,
+                                 use_char_level_embeddings=config["data"]["use_char_level_embeddings"],
+                                 use_start_end_token=config["data"]["use_start_end_token"],
+                                 tokenize_entities=config["data"]["tokenize_entities"],
+                                 language=config["data"].get("language", "pl"),
+                                 max_word_len=config["data"]["max_word_len"],
+                                 load_lambo_tokenizer=load_lambo_tokenizer)
+        return tokenizer
diff --git a/combo/ner_modules/data/SpecialTokens.py b/combo/ner_modules/data/SpecialTokens.py
new file mode 100644
index 0000000..0f50e9f
--- /dev/null
+++ b/combo/ner_modules/data/SpecialTokens.py
@@ -0,0 +1,30 @@
+class SpecialTokens:
+    """
+    SpecialTokens stores default token strings for various purposes. The class provides both word-level and
+    character-level special tokens. This class is rather used internally.
+
+    Attributes
+    ----------
+    START_TOKEN : str
+        Marks the beginning of a sentence.
+    END_TOKEN : str
+        Marks the end of a sentence.
+    PAD_TOKEN : str
+        Used for padding sequences to a consistent length.
+    CHAR_START_TOKEN : str
+        Marks the beginning of a character sequence.
+    CHAR_END_TOKEN : str
+        Marks the end of a character sequence.
+    CHAR_PAD_TOKEN : str
+        Used for padding character sequences to a consistent length.
+    CHAR_UNKNOWN_TOKEN : str
+        Represents out-of-vocabulary character.
+    """
+    START_TOKEN = "[START]"
+    END_TOKEN = "[END]"
+    PAD_TOKEN = "[PAD]"
+
+    CHAR_START_TOKEN = "<b>"
+    CHAR_END_TOKEN = "<e>"
+    CHAR_PAD_TOKEN = "<PAD>"
+    CHAR_UNKNOWN_TOKEN = "<unknown>"
diff --git a/combo/ner_modules/data/__init__.py b/combo/ner_modules/data/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/data/utils.py b/combo/ner_modules/data/utils.py
new file mode 100644
index 0000000..6dc0693
--- /dev/null
+++ b/combo/ner_modules/data/utils.py
@@ -0,0 +1,134 @@
+from collections import Counter
+from pathlib import Path
+from typing import Dict
+from .SpecialTokens import SpecialTokens
+
+CHAR_PAD_TOKEN, CHAR_START_TOKEN, CHAR_END_TOKEN, CHAR_UNKNOWN_TOKEN, PAD_TOKEN, START_TOKEN, END_TOKEN = \
+    SpecialTokens.CHAR_PAD_TOKEN, SpecialTokens.CHAR_START_TOKEN, SpecialTokens.CHAR_END_TOKEN, \
+    SpecialTokens.CHAR_UNKNOWN_TOKEN, SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+def create_tag2id(file_path: Path,
+                  encoding: str = 'utf-8',
+                  include_special_tokens: bool = False) -> Dict[str, int]:
+    """
+    Generate a unique ID mapping for tags sourced from a specified file. The file should adhere to the following
+    structure:
+    1. Each line consists of an <entity> <tag> pair, delimited by a space.
+    2. Consecutive lines represent words in the same sentence, in their original order.
+    3. The start of a new sentence is indicated by a metadata line: `# sent_id = <n>`, where `<n>` is a unique
+      sentence identifier within the file.
+    4. A newline character demarcates the end of each sentence.
+
+   Parameters:
+    ----------
+    file_path : Path
+        Path to the file containing words and tags.
+    encoding : str, optional
+        Encoding of the file. Defaults to 'utf-8'.
+    include_special_tokens : bool, optional
+        If true, special tokens such as START and END are added to the mapping. Defaults to False.
+
+    Returns:
+    -------
+    tag2id : Dict[str, int]
+        A dictionary mapping tags to unique IDs.
+    """
+    tag2id = set()
+
+    # Reading the file
+    with open(file_path, 'r', encoding=encoding) as f:
+        for line in f:
+            # Omit spaces between sentences and sentence ID annotations
+            if line == '\n' or line.startswith("# sent_id ="):
+                continue
+            # Otherwise, the line should be a word-entity pair separated by space
+            else:
+                tag = line.strip().split(" ")[-1]
+                if tag != "O":
+                    # Add both beginning and inside tags for entities
+                    assert len(tag.split("-")) == 2, "Tags should be in format <entity>-<tag>, too many dashes detected"
+                    tag2id.add("B-"+tag.split("-")[1])
+                    tag2id.add("I-" + tag.split("-")[1])
+                else:
+                    tag2id.add(tag)
+
+    # Convert the set to a dictionary with sorted tags mapped to unique IDs
+    tag2id = {tag: i for i, tag in enumerate(sorted(tag2id))}
+    tag2id[PAD_TOKEN] = len(tag2id)
+    if include_special_tokens:
+        tag2id[START_TOKEN] = len(tag2id)
+        tag2id[END_TOKEN] = len(tag2id)
+
+    return tag2id
+
+
+def create_char2id(file_path: Path,
+                   encoding: str = "utf-8",
+                   discard_least_common: float = 0.0005) -> Dict[str, int]:
+    """
+    Create a mapping from characters in the file to unique IDs, potentially discarding the least common characters. File
+    format is expected to be the same as indicated in create_tag2id() documentation
+
+    Parameters:
+    ----------
+    file_path : Path
+        Path to the file containing words and tags.
+    encoding : str, optional
+        Encoding of the file. Defaults to 'utf-8'.
+    discard_least_common : float, optional
+        Proportion of total characters to discard from the mapping based on their frequency. Defaults to 0.0005.
+
+    Returns:
+    -------
+    char2id : Dict[str, int]
+        A dictionary mapping characters to unique IDs.
+    """
+
+    char2id = {CHAR_PAD_TOKEN, CHAR_START_TOKEN, CHAR_END_TOKEN, CHAR_UNKNOWN_TOKEN}
+    char_counter = Counter()
+
+    # Reading the file
+    with open(file_path, 'r', encoding=encoding) as f:
+        for line in f:
+            # Omit spaces between sentences and sentence ID annotations
+            if line == '\n' or line.startswith("# sent_id ="):
+                continue
+            # Otherwise, the line should be a word-entity pair separated by space
+            else:
+                word = line.strip().split()[0]
+                char_counter.update([char for char in word])
+
+    total_chars = sum(char_counter.values())
+    cutoff = total_chars * discard_least_common  # Calculate the cutoff frequency
+
+    sorted_chars = sorted(char_counter.items(), key=lambda x: x[1])  # Sort characters by frequency
+
+    # Discard the least common characters based on the cutoff
+    current_count = 0
+    for char, count in sorted_chars:
+        current_count += count
+        if current_count > cutoff:
+            char2id.add(char)
+
+    # Convert the set to a dictionary mapped to unique IDs
+    char2id = {char: i for i, char in enumerate(char2id)}
+    return char2id
+
+
+def calculate_longest_word(file_path: Path,
+                           encoding: str = "utf-8") -> int:
+    """Extract maximum character length of a word from a file."""
+    max_length = 0
+    # Reading the file
+    with open(file_path, 'r', encoding=encoding) as f:
+        for line in f:
+            # Omit spaces between sentences and sentence ID annotations
+            if line == '\n' or line.startswith("# sent_id ="):
+                continue
+            # Otherwise, the line should be a word-entity pair separated by space
+            else:
+                word = line.strip().split()[0]
+                max_length = max(max_length, len(word))
+
+    return max_length
diff --git a/combo/ner_modules/embedders/BertEmbedder.py b/combo/ner_modules/embedders/BertEmbedder.py
new file mode 100644
index 0000000..c33aec1
--- /dev/null
+++ b/combo/ner_modules/embedders/BertEmbedder.py
@@ -0,0 +1,111 @@
+from .TokenPooling import TokenPooling
+import torch.nn as nn
+import torch
+from transformers import AutoModel, BertModel
+
+
+class BertEmbedder(nn.Module):
+    """
+    Embeds text using a BERT model and provides additional options for token pooling and projections.
+
+    This class wraps either an AutoModel or BertModel from the Hugging Face transformers library, allowing optional
+    projection and pooling layers on top of the BERT embeddings. The pooling strategy and other options can be
+    customized based on the parameters provided.
+
+    Attributes:
+    ----------
+    bert : transformers.AutoModel or transformers.BertModel
+        The BERT model from transformers that's either an AutoModel or BertModel, depending on the specified
+        pretrained_model_type.
+    projection_layer : torch.nn.Linear, optional
+        A linear layer to project the BERT embeddings to a different dimension. Only initialized if projection_dimension
+        is provided.
+    token_pooling : TokenPooling, optional
+        A token pooling layer to pool tokens based on the specified strategy. Only initialized if token_pooling is set
+        to True.
+    output_dimension : int
+        The dimension of the output embeddings, determined by either the BERT hidden size or the projection_dimension
+        if specified.
+
+    """
+    def __init__(self,
+                 pretrained_model_name: str,
+                 pretrained_model_type: str,
+                 projection_dimension: int = None,
+                 freeze_bert: bool = True,
+                 token_pooling: bool = True,
+                 use_start_end_token: bool = False,
+                 pooling_strategy: str = "max") -> None:
+        """
+         Parameters:
+        ----------
+        pretrained_model_name : str
+            The name of the pre-trained BERT model to be loaded (e.g., 'bert-base-uncased').
+        pretrained_model_type : str
+            The type of BERT model to be used ('AutoModel' or 'BertModel').
+        projection_dimension : int, optional
+            The dimension for the projection layer applied to BERT embeddings. If specified, a linear layer
+            is initialized for the projection. (default: None)
+        freeze_bert : bool, optional
+            Whether to freeze the parameters of the BERT model, disabling further training. (default: True)
+        token_pooling : bool, optional
+            Whether to initialize a token pooling layer based on the specified strategy. (default: True)
+        use_start_end_token : bool, optional
+            Whether to use start and end tokens in token pooling. Only relevant if token_pooling is True.(default: False)
+        pooling_strategy : str, optional
+            The strategy to be used for token pooling if token_pooling is set to True. (default: "max")
+        """
+        assert pretrained_model_type in ['AutoModel', 'BertModel'], \
+            'pretrained_model_type must be either BertModel or AutoModel'
+
+        super(BertEmbedder, self).__init__()
+
+        # initialize bert model
+        if pretrained_model_type == 'AutoModel':
+            self.bert = AutoModel.from_pretrained(pretrained_model_name)
+        elif pretrained_model_type == 'BertModel':
+            self.bert = BertModel.from_pretrained(pretrained_model_name)
+
+        # freeze bert model
+        if freeze_bert:
+            for param in self.bert.parameters():
+                param.requires_grad = False
+
+        # initialize projection layer if projection dimension is given
+        if projection_dimension:
+            self.projection_layer = nn.Linear(in_features=self.bert.config.hidden_size,
+                                              out_features=projection_dimension)
+            self.output_dimension = projection_dimension
+        else:
+            self.output_dimension = self.bert.config.hidden_size
+            self.projection_layer = None
+
+        # initialize token pooling layer if specified
+        if token_pooling:
+            self.token_pooling = TokenPooling(pooling_strategy=pooling_strategy,
+                                              use_start_end_token=use_start_end_token)
+        else:
+            self.token_pooling = None
+
+    def forward(self,
+                input_ids: torch.Tensor,
+                attention_mask: torch.Tensor,
+                word_ids: torch.Tensor = None) -> torch.Tensor:
+        """
+        Performs the forward pass on the given inputs and returns the corresponding BERT embeddings, with optional
+        token pooling and projection
+        """
+        outputs = self.bert(input_ids,
+                            attention_mask=attention_mask)
+        outputs = outputs.last_hidden_state
+
+        # apply token pooling if specified
+        if self.token_pooling is not None:
+            outputs = self.token_pooling(bert_outputs=outputs,
+                                         word_ids=word_ids)
+
+        # apply projection layer if specified
+        if self.projection_layer is not None:
+            outputs = self.projection_layer(outputs)
+
+        return outputs
diff --git a/combo/ner_modules/embedders/ComboCharEmbedder.py b/combo/ner_modules/embedders/ComboCharEmbedder.py
new file mode 100644
index 0000000..d40d650
--- /dev/null
+++ b/combo/ner_modules/embedders/ComboCharEmbedder.py
@@ -0,0 +1,115 @@
+import torch
+from torch import nn
+import torch.nn.functional as F
+
+
+class ComboCharEmbedder(nn.Module):
+    """
+    A character embedding model that utilizes convolutional layers to generate embeddings
+    for sequences of characters in words. This model architecture for word character embeddings is
+    the same as in COMBO (https://aclanthology.org/2021.emnlp-demo.7.pdf).
+
+    Attributes:
+    ----------
+    embeddings : nn.Embedding
+        The character embedding layer.
+    conv1 : nn.Conv1d
+        The first convolutional layer.
+    conv2 : nn.Conv1d
+        The second convolutional layer.
+    conv3 : nn.Conv1d
+        The third convolutional layer.
+    output_dimension : int
+        The dimension of the output embeddings.
+
+    Methods:
+    -------
+    forward(batch_char_ids: torch.Tensor) -> torch.Tensor:
+        Forward pass to generate embeddings for the given batch of character sequences.
+    """
+    def __init__(self,
+                 vocab_size: int,
+                 char_embedding_dim: int,
+                 padding_idx: int = 0):
+        """
+        Initialize the ComboCharEmbedder model.
+
+        Parameters:
+        ----------
+        vocab_size : int
+            Size of the character vocabulary including special tokens.
+        char_embedding_dim : int
+            Dimension of the output embeddings.
+        padding_idx : int, optional
+            The index of the padding token in the vocabulary. Defaults to 0.
+        """
+        super(ComboCharEmbedder, self).__init__()
+
+        # character embeddings
+        self.embeddings = nn.Embedding(num_embeddings=vocab_size,
+                                       embedding_dim=char_embedding_dim,
+                                       padding_idx=padding_idx)
+
+        # convolutional layers
+        self.conv1 = nn.Conv1d(in_channels=char_embedding_dim,
+                               out_channels=512,
+                               kernel_size=3,
+                               stride=1,
+                               padding=1,
+                               dilation=1)
+        self.conv2 = nn.Conv1d(in_channels=512,
+                               out_channels=256,
+                               kernel_size=3,
+                               stride=1,
+                               padding=2,
+                               dilation=2)
+        self.conv3 = nn.Conv1d(in_channels=256,
+                               out_channels=char_embedding_dim,
+                               kernel_size=3,
+                               stride=1,
+                               padding=4,
+                               dilation=4)
+
+        # save output dimension
+        self.output_dimension = char_embedding_dim
+
+    def forward(self, batch_char_ids):
+        """
+        Perform a forward pass through the model. After convolutions max pooling across character embeddings is
+        performed.
+
+        Parameters:
+        ----------
+        batch_char_ids : torch.Tensor
+            A tensor of character IDs for a batch of sequences (words). Input shape: batch_size x words x characters.
+
+        Returns:
+        -------
+        torch.Tensor
+            A tensor of embeddings for each sequence in the batch.
+        """
+        # embed characters
+        x = self.embeddings(batch_char_ids)
+        stacked_embeddings = []  # Empty list to store stacked word embeddings
+
+        # Iterate over sentences
+        for i in range(x.shape[0]):
+            # sentence representation
+            # transforms to words x embedding_dim x characters_length
+            sentence = x[i].permute(0, 2, 1)
+
+            # passing through convolutions
+            sentence = F.relu(self.conv1(sentence))
+            sentence = F.relu(self.conv2(sentence))
+            sentence = self.conv3(sentence)
+
+            # max pooling across dimensions for whole sequence
+            # output: words_number x char_embedding_dim
+            word_embeddings = torch.max(sentence, dim=2)[0]
+            stacked_embeddings.append(word_embeddings)  # Append word embeddings to the list
+
+        # combining results
+        # output batch_size x words x char_embedding_dim
+        stacked_embeddings = torch.stack(stacked_embeddings, dim=0)
+
+        return stacked_embeddings
diff --git a/combo/ner_modules/embedders/TokenPooling.py b/combo/ner_modules/embedders/TokenPooling.py
new file mode 100644
index 0000000..67cae6c
--- /dev/null
+++ b/combo/ner_modules/embedders/TokenPooling.py
@@ -0,0 +1,90 @@
+import torch
+from torch import nn
+
+
+class TokenPooling(nn.Module):
+    """
+       TokenPooling Module.
+
+       This module is used for pooling the token embeddings obtained from BERT models.
+       It provides two pooling strategies: max and mean. It is designed to transform token
+       embeddings into word embeddings by applying the selected pooling strategy over the
+       tokens of each word. The class also supports the option to account for special start
+       and end tokens.
+
+       Attributes:
+       -----------
+       pooling_strategy : str, optional
+           The strategy to pool token embeddings. Must be one of ['max', 'mean']. Default is 'max'.
+       use_start_end_token : bool, optional
+           Whether to consider special start and end tokens in pooling. Default is False.
+
+       Methods:
+       --------
+       forward(bert_outputs: torch.Tensor, word_ids: torch.Tensor) -> torch.Tensor:
+           Applies the specified pooling strategy on the token embeddings and returns the word embeddings.
+    """
+    def __init__(self,
+                 pooling_strategy: str = 'max',
+                 use_start_end_token: bool = False):
+        super(TokenPooling, self).__init__()
+        
+        assert pooling_strategy in ['max', 'mean'], "Pooling strategy must be one of ['max', 'mean']"
+        
+        self.pooling_strategy = pooling_strategy
+        self.use_start_end_token = use_start_end_token
+    
+    def forward(self, 
+                bert_outputs: torch.Tensor,
+                word_ids: torch.Tensor) -> torch.Tensor:
+        """
+        Forward method for pooling token embeddings.
+        This method pools the token embeddings into word embeddings using the selected pooling strategy
+        ('max' or 'mean'). If use_start_end_token is set to True, the method will consider special start
+        and end tokens during pooling.
+
+        Parameters
+        ----------
+        bert_outputs: torch.Tensor
+            Token embeddings of shape (batch_size, max_seq_len, hidden_size).
+        word_ids: torch.Tensor
+            Word ID mapping of shape (batch_size, max_seq_len).
+
+        Returns
+        ----------
+        torch.Tensor
+            Pooled word embeddings of shape (batch_size, max_seq_len, hidden_size).
+        """
+        # Max pooling of token embeddings to obtain word embeddings
+        # bert_outputs which are token embeddings: (batch_size, max_seq_len, hidden_size)
+        # word_ids: (batch_size, max_seq_len)
+
+        # info whether to move word embeddings idx
+        # first token may be [CLS]
+        if self.use_start_end_token:
+            word_ids = word_ids + 1
+
+        word_ids = word_ids.unsqueeze(2).expand_as(bert_outputs)
+        word_ids = word_ids.type(torch.int64)
+        pooled = torch.zeros(bert_outputs.size(0), word_ids.max() + 1, bert_outputs.size(2)).to(bert_outputs.device)
+
+        if self.pooling_strategy == "max":
+            pooled = pooled.scatter_reduce(1, word_ids, bert_outputs, reduce="amax", include_self=False)
+        elif self.pooling_strategy == "mean":
+            pooled = pooled.scatter_reduce(1, word_ids, bert_outputs, reduce="mean", include_self=False)
+
+        if self.use_start_end_token:
+            pooled[:, 0, :] = 0
+            # maybe adding cls and sep token embeddings are needed here
+
+            # expanding with zeros so dimensions are maintained
+        rows_to_add = bert_outputs.shape[1] - pooled.shape[1]
+        zeros_tensor = torch.zeros(bert_outputs.shape[0], rows_to_add, bert_outputs.shape[2]).to(bert_outputs.device)
+
+        # word_embeddings are pooled embeddings of tokens across word indexes
+        # fot other tokens like START, END, PAD they are 0s
+        # word_embeddings: (batch_size, max_seq_len, hidden_size)
+        bert_outputs = torch.cat((pooled, zeros_tensor), dim=1)
+
+        return bert_outputs
+
diff --git a/combo/ner_modules/embedders/__init__.py b/combo/ner_modules/embedders/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/loss/FocalLoss.py b/combo/ner_modules/loss/FocalLoss.py
new file mode 100644
index 0000000..688efdf
--- /dev/null
+++ b/combo/ner_modules/loss/FocalLoss.py
@@ -0,0 +1,157 @@
+from typing import Optional, Sequence
+import torch
+from torch import Tensor
+from torch import nn
+from torch.nn import functional as F
+
+
+class FocalLoss(nn.Module):
+    """ Focal Loss, as described in https://arxiv.org/abs/1708.02002.
+
+    It is essentially an enhancement to cross entropy loss and is
+    useful for classification tasks when there is a large class imbalance.
+    x is expected to contain raw, unnormalized scores for each class.
+    y is expected to contain class labels.
+
+    Shape:
+        - x: (batch_size, C) or (batch_size, C, d1, d2, ..., dK), K > 0.
+        - y: (batch_size,) or (batch_size, d1, d2, ..., dK), K > 0.
+
+    Attributes:
+    ----------
+    alpha : Tensor, optional
+        Weights for each class. Default is None.
+    gamma : float
+        A constant, as described in the referenced paper. Default is 0.
+    ignore_index : int
+        Class label to ignore. Default is -100.
+    reduction : str
+        Specifies the reduction to apply to the output: 'mean', 'sum', or 'none'.
+    nll_loss : torch.nn.modules.loss.NLLLoss
+        Negative log likelihood loss.
+
+    Methods:
+    -------
+    forward(x: Tensor, y: Tensor) -> Tensor
+        Compute the focal loss for the given inputs.
+
+    """
+
+    def __init__(self,
+                 alpha: Optional[Tensor] = None,
+                 gamma: float = 2.,
+                 reduction: str = 'mean',
+                 ignore_index: int = -100):
+        """Constructor.
+
+        Parameters:
+        ----------
+        alpha : Tensor, optional
+            Weights for each class. Default is None.
+        gamma : float, optional
+            A constant, as described in the referenced paper. Default is 0.
+        reduction : str, optional
+            Specifies the reduction to apply to the output: 'mean', 'sum', or 'none'. Default is 'mean'.
+        ignore_index : int, optional
+            Class label to ignore. Default is -100.
+        """
+        if reduction not in ('mean', 'sum', 'none'):
+            raise ValueError(
+                'Reduction must be one of: "mean", "sum", "none".')
+
+        super().__init__()
+        self.alpha = alpha
+        self.gamma = gamma
+        self.ignore_index = ignore_index
+        self.reduction = reduction
+
+        self.nll_loss = nn.NLLLoss(
+            weight=alpha, reduction='none', ignore_index=ignore_index)
+
+    def __repr__(self):
+        arg_keys = ['alpha', 'gamma', 'ignore_index', 'reduction']
+        arg_vals = [self.__dict__[k] for k in arg_keys]
+        arg_strs = [f'{k}={v!r}' for k, v in zip(arg_keys, arg_vals)]
+        arg_str = ', '.join(arg_strs)
+        return f'{type(self).__name__}({arg_str})'
+
+    def forward(self, x: Tensor, y: Tensor) -> Tensor:
+        if x.ndim > 2:
+            # (N, C, d1, d2, ..., dK) --> (N * d1 * ... * dK, C)
+            c = x.shape[1]
+            x = x.permute(0, *range(2, x.ndim), 1).reshape(-1, c)
+            # (N, d1, d2, ..., dK) --> (N * d1 * ... * dK,)
+            y = y.view(-1)
+
+        unignored_mask = y != self.ignore_index
+        y = y[unignored_mask]
+        if len(y) == 0:
+            return torch.tensor(0.)
+        x = x[unignored_mask]
+
+        # compute weighted cross entropy term: -alpha * log(pt)
+        # (alpha is already part of self.nll_loss)
+        log_p = F.log_softmax(x, dim=-1)
+        ce = self.nll_loss(log_p, y)
+
+        # get true class column from each row
+        all_rows = torch.arange(len(x))
+        log_pt = log_p[all_rows, y]
+
+        # compute focal term: (1 - pt)^gamma
+        pt = log_pt.exp()
+        focal_term = (1 - pt)**self.gamma
+
+        # the full loss: -alpha * ((1 - pt)^gamma) * log(pt)
+        loss = focal_term * ce
+
+        if self.reduction == 'mean':
+            loss = loss.mean()
+        elif self.reduction == 'sum':
+            loss = loss.sum()
+
+        return loss
+
+
+def focal_loss(alpha: Optional[Sequence] = None,
+               gamma: float = 2.,
+               reduction: str = 'mean',
+               size: int = 10,
+               ignore_index: int = -100,
+               device='cpu',
+               dtype=torch.float32) -> FocalLoss:
+    """Factory function for FocalLoss.
+
+    Parameters:
+    ----------
+    alpha : Sequence, optional
+        Weights for each class. If provided, it will be converted to a Tensor. Default is None.
+    gamma : float, optional
+        A constant, as described in the referenced paper. Default is 0.
+    reduction : str, optional
+        Specifies the reduction to apply to the output: 'mean', 'sum', or 'none'. Default is 'mean'.
+    size : int, optional
+        Number of classes.
+    ignore_index : int, optional
+        Class label to ignore. Default is -100.
+    device : str, optional
+        Device to move the alpha parameter to. Default is 'cpu'.
+    dtype : torch.dtype, optional
+        Data type to cast the alpha parameter to. Default is torch.float32.
+
+    Returns:
+    -------
+    FocalLoss
+        A configured FocalLoss object.
+    """
+    if alpha is not None:
+        if not isinstance(alpha, Tensor):
+            alpha = torch.full((size,), alpha)
+        alpha = alpha.to(device=device, dtype=dtype)
+
+    fl = FocalLoss(
+        alpha=alpha,
+        gamma=gamma,
+        reduction=reduction,
+        ignore_index=ignore_index)
+    return fl
diff --git a/combo/ner_modules/loss/__init__.py b/combo/ner_modules/loss/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/metrics/MetricHolder.py b/combo/ner_modules/metrics/MetricHolder.py
new file mode 100644
index 0000000..ceebb62
--- /dev/null
+++ b/combo/ner_modules/metrics/MetricHolder.py
@@ -0,0 +1,124 @@
+from ..data.SpecialTokens import SpecialTokens
+from seqeval.metrics import f1_score, recall_score, precision_score, classification_report
+
+
+START_TOKEN, END_TOKEN, PAD_TOKEN = SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN, SpecialTokens.PAD_TOKEN
+
+
+class MetricHolder:
+    """
+    A utility class to hold and manage metrics related to sequence labeling tasks. Built in methods are provided to
+    print recall, F1 and precision scores as well as classification report.
+
+    Attributes:
+    ----------
+    targets : list
+        A list to store the true labels of sequences.
+    predictions : list
+        A list to store the predicted labels of sequences.
+    label_to_idx : dict
+        A dictionary to map label names to their respective integer indices.
+    idx_to_label : dict
+        A dictionary to map integer indices to their respective label names.
+    ignore_idx : int
+        Index of the token to be ignored during metric calculation. Default is -100.
+    """
+    def __init__(self,
+                 label_to_idx: dict = None,
+                 idx_to_label: dict = None,
+                 ignore_idx: int = -100):
+        """
+        Initialize a MetricHolder instance.
+
+        Parameters:
+        ----------
+        label_to_idx : dict
+            A dictionary to map label names to their respective integer indices.
+        idx_to_label : dict
+            A dictionary to map integer indices to their respective label names.
+        ignore_idx : int
+            Index of the token to be ignored during metric calculation. Default is -100. This should be the index of
+            tokens like start, end and padding tokens.
+        """
+        self.targets = []
+        self.predictions = []
+
+        assert label_to_idx or idx_to_label, "Specify label_to_idx or idx_to_label"
+        if label_to_idx:
+            self.label_to_idx = label_to_idx
+            self.idx_to_label = {idx: label for label, idx in label_to_idx.items()}
+        else:
+            self.idx_to_label = idx_to_label
+            self.label_to_idx = {label: idx for idx, label in idx_to_label.items()}
+
+        self.ignore_idx = ignore_idx
+
+    def update(self, predictions, targets) -> None:
+        """
+        Update the internal targets and predictions with new data.
+
+        Parameters:
+        ----------
+            predictions (list): A list of predicted labels for sequences.
+            targets (list): A list of true labels for sequences.
+        """
+        # flatten predictions and targets
+        predictions = predictions.tolist()
+        targets = targets.tolist()
+
+        # Delete padded values
+        predictions = [[y_hat for y, y_hat in zip(y_sentence,y_sentence_hat) if y != self.ignore_idx] for y_sentence, y_sentence_hat in zip(targets, predictions)]
+        targets = [[y for y in y_sentence if y != self.ignore_idx] for y_sentence in targets]
+
+        # Translate to labels
+        predictions = [[self.idx_to_label[y_hat] for y_hat in y_sentence_hat] for y_sentence_hat in predictions]
+        # Fixing issue with some predictions being end or pad tag to by default be O tag
+        predictions = [[y_hat if y_hat not in [END_TOKEN, PAD_TOKEN, START_TOKEN] else "O" for y_hat in y_sentence_hat]
+                       for y_sentence_hat in predictions]
+        targets = [[self.idx_to_label[y] for y in y_sentence] for y_sentence in targets]
+
+        # Update targets and predictions
+        self.targets += targets
+        self.predictions += predictions
+
+    def reset(self) -> None:
+        """
+        Reset the internal targets and predictions to empty lists.
+        """
+        self.targets = []
+        self.predictions = []
+
+    def get_classification_report(self) -> str:
+        """
+        Retrieve a detailed classification report for the current targets and predictions.
+
+        Returns:
+        ----------
+            str: The classification report in tabular format in string.
+        """
+        report = classification_report(self.targets,
+                                       self.predictions,
+                                       zero_division=1)
+        return report
+
+    def get_metrics(self,
+                    stage: str = None) -> dict:
+        """
+        Calculate and retrieve key metrics for the current targets and predictions.
+
+        Parameters:
+        ----------
+        stage : str
+            The name of the current stage (e.g., 'train', 'val', 'test') to be used as a prefix for metric keys.
+
+        Returns:
+        ----------
+        dict : A dictionary containing the precision, recall, and F1-score.
+        """
+        assert stage is not None, "Specify stage"
+
+        return {
+            f'{stage}_precision': precision_score(self.targets, self.predictions, average="micro", zero_division=1),
+            f'{stage}_recall': recall_score(self.targets, self.predictions, average="micro", zero_division=1),
+            f'{stage}_f1': f1_score(self.targets, self.predictions, average="micro", zero_division=1)
+        }
diff --git a/combo/ner_modules/metrics/__init__.py b/combo/ner_modules/metrics/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/utils/__init__.py b/combo/ner_modules/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/combo/ner_modules/utils/constructors.py b/combo/ner_modules/utils/constructors.py
new file mode 100644
index 0000000..b020b26
--- /dev/null
+++ b/combo/ner_modules/utils/constructors.py
@@ -0,0 +1,134 @@
+from pytorch_lightning.callbacks.early_stopping import EarlyStopping
+from pytorch_lightning.callbacks import LearningRateMonitor, ModelCheckpoint
+from ..callbacks.FixedProgressBar import FixedProgressBar
+from typing import Dict
+import torch
+from ..data.NerTokenizer import NerTokenizer
+from ..NerDataModule import NerDataModule
+from pathlib import Path
+from ..loss.FocalLoss import focal_loss
+from ..data.SpecialTokens import SpecialTokens
+
+PAD_TOKEN, START_TOKEN, END_TOKEN = SpecialTokens.PAD_TOKEN, SpecialTokens.START_TOKEN, SpecialTokens.END_TOKEN
+
+
+def construct_tokenizer_from_config(config: Dict,
+                                    char_to_id_map: Dict,
+                                    label_to_id_map: Dict) -> NerTokenizer:
+    """
+    Constructs a Named Entity Recognition tokenizer from a configuration dictionary.
+
+    Parameters:
+    -----------
+    config : Dict
+        Configuration dictionary containing all necessary parameters to initialize the tokenizer.
+    char_to_id_map : Dict
+        Mapping of characters to their respective unique identifiers.
+    label_to_id_map : Dict
+        Mapping of labels to their respective unique identifiers.
+
+    Returns:
+    --------
+    NerTokenizer
+        Initialized NER tokenizer object.
+    """
+    tokenizer = NerTokenizer(pretrained_model_type=config["model"]["bert_embedder"]["pretrained_model_type"],
+                             pretrained_model_name=config["model"]["bert_embedder"]["pretrained_model_name"],
+                             char_to_id_map=char_to_id_map,
+                             label_to_id_map=label_to_id_map,
+                             use_char_level_embeddings=config["data"]["use_char_level_embeddings"],
+                             use_start_end_token=config["data"]["use_start_end_token"],
+                             tokenize_entities=config["data"]["tokenize_entities"],
+                             language=config["data"].get("language", "pl"),
+                             max_word_len=config["data"].get("max_word_len", 69))
+    return tokenizer
+
+
+def construct_data_module_from_config(config: Dict,
+                                      tokenizer: NerTokenizer) -> NerDataModule:
+    """
+    Constructs a Named Entity Recognition data module for PyTorch Lightning usage from a configuration dictionary.
+
+    Parameters:
+    -----------
+    config : Dict
+        Configuration dictionary containing all necessary parameters to initialize the data module.
+    tokenizer : NerTokenizer
+        NER tokenizer to be used for tokenization. It should be custom tokenizer from this repository.
+
+    Returns:
+    --------
+    NerDataModule
+        Initialized NER data module object.
+    """
+    datamodule = NerDataModule(path_data=Path(config["data"]["path_data"]),
+                               tokenizer=tokenizer,
+                               batch_size=config["data"]["batch_size"],
+                               encoding=config["data"]["encoding"],
+                               num_workers=config["data"]["num_workers"])
+    return datamodule
+
+
+def construct_loss_from_config(config: Dict,
+                               label_to_id: Dict):
+    """
+     Constructs a loss function based on the given configuration dictionary.
+
+     Parameters:
+     -----------
+     config : Dict
+         Configuration dictionary containing the loss configuration.
+     label_to_id : Dict
+         Mapping of labels to their respective unique identifiers.
+
+     Returns:
+     --------
+     loss
+         Loss function, which could be "crf", CrossEntropyLoss, or a custom focal loss.
+
+     """
+    if config["model"]["classifier"]["type"] == "crf":
+        loss = "crf"
+    elif config["loss"] == "ce":
+        loss = torch.nn.CrossEntropyLoss()
+    elif config["loss"] == "focal":
+        size = len(label_to_id) - len({PAD_TOKEN, START_TOKEN, END_TOKEN} & set(label_to_id.keys()))
+        loss = focal_loss(size=size)
+    else:
+        raise ValueError(f"Loss {config['loss']} not supported")
+
+    return loss
+
+
+def construct_callbacks_from_config(config_callbacks: Dict) -> list:
+    """
+    Constructs a list of callbacks based on the given configuration dictionary. Supports following callbacks
+    EarlyStopping, LearningRateMonitor, ModelCheckpoint, and FixedProgressBar.
+
+    Parameters:
+    -----------
+    config_callbacks : Dict
+        Configuration dictionary containing the callback configuration.
+
+    Returns:
+    --------
+    list
+        List of initialized callback objects.
+    """
+    callbacks = []
+    for callback in config_callbacks:
+        if callback == "EarlyStopping":
+            callbacks.append(EarlyStopping(**config_callbacks[callback]))
+        elif callback == "LearningRateMonitor":
+            callbacks.append(LearningRateMonitor(**config_callbacks[callback]))
+        elif callback == "ModelCheckpoint":
+            pass
+        elif callback == "FixedProgressBar":
+            callbacks.append(FixedProgressBar())
+        else:
+            raise Exception(f"Callback {config_callbacks[callback]} not supported")
+    # adding checkpoint callback at the end
+    if "ModelCheckpoint" in config_callbacks:
+        callbacks.append(ModelCheckpoint(**config_callbacks["ModelCheckpoint"]))
+
+    return callbacks
diff --git a/combo/ner_modules/utils/default_config.py b/combo/ner_modules/utils/default_config.py
new file mode 100644
index 0000000..babc0ea
--- /dev/null
+++ b/combo/ner_modules/utils/default_config.py
@@ -0,0 +1,52 @@
+default_config = {
+  "data": {
+    "path_data": "./data/pl/",
+    "use_char_level_embeddings": True,
+    "use_start_end_token": True,
+    "tokenize_entities": True,
+    "batch_size": 32,
+    "encoding": "utf-8",
+    "num_workers": 1
+  },
+
+  "model": {
+    "bert_embedder": {
+        "pretrained_model_name": "allegro/herbert-base-cased",
+        "pretrained_model_type": "AutoModel",
+        "projection_dimension": None,
+        "freeze_bert": True,
+        "token_pooling": True,
+        "pooling_strategy": "max"
+                     },
+    "char_embedder": {"type" : "combo",
+                      "char_embedding_dim":  64
+                     },
+    "classifier": {"type" : "crf",
+                   "to_tag_space" :  "bilstm"},
+    "dropout": 0.1
+            },
+
+  "loss": "ce",
+  "learning_rate": 0.001,
+
+  "callbacks": {"FixedProgressBar": True,
+                "LearningRateMonitor": {"logging_interval":"epoch"},
+                "ModelCheckpoint": {"monitor": "validation_f1",
+                                    "mode": "max",
+                                    "save_top_k": 1,
+                                    "save_weights_only": True,
+                                    "filename" : "best_model"},
+                "EarlyStopping": {"monitor": "validation_f1",
+                                  "mode": "max",
+                                  "min_delta": 0.001,
+                                  "patience": 6}},
+
+  "trainer": {"devices": [0],
+              "max_epochs": 50,
+              "accelerator": "cuda",
+              "log_every_n_steps": 10}
+}
+
+
+class Config:
+    default_config = default_config
diff --git a/combo/ner_modules/utils/download.py b/combo/ner_modules/utils/download.py
new file mode 100644
index 0000000..df26816
--- /dev/null
+++ b/combo/ner_modules/utils/download.py
@@ -0,0 +1,73 @@
+import errno
+import logging
+import os
+import requests
+import tqdm
+from requests.adapters import HTTPAdapter
+from urllib3.util.retry import Retry
+
+logger = logging.getLogger(__name__)
+
+_URL = "http://s3.clarin-pl.eu/dspace/combo/ner/{model_name}/{file_name}"
+_HOME_DIR = os.getenv("HOME", os.curdir)
+_CACHE_DIR = os.path.join(_HOME_DIR, ".tmp_ner_model")
+
+
+def download_file(model_name, file_name, force=False):
+    _make_cache_dir(model_name)
+    url = _URL.format(model_name=model_name, file_name=file_name)
+    local_filename = url.split("/")[-1]
+    local_filename = os.path.join(model_name, local_filename)
+    location = os.path.join(_CACHE_DIR, local_filename)
+
+    if os.path.exists(location) and not force:
+        logger.debug("Using cached model.")
+        return location
+
+    chunk_size = 1024
+
+    logger.info(f"Downloading {file_name} from {url}")
+
+    try:
+        with _requests_retry_session(retries=2).get(url, stream=True, timeout=600) as r:
+            pbar = tqdm.tqdm(unit="B", total=int(r.headers.get("content-length")),
+                             unit_divisor=chunk_size, unit_scale=True)
+            with open(location, "wb") as f:
+                for chunk in r.iter_content(chunk_size=chunk_size):
+                    f.write(chunk)
+                    pbar.update(len(chunk))
+            pbar.close()
+
+    except requests.exceptions.RequestException as e:
+        logger.error(f"Request error: {e}")
+        raise
+    except Exception as e:
+        logger.error(f"An error occurred: {e}")
+        raise
+
+    return location
+
+
+def _make_cache_dir(model_name):
+    cache_dir_model = os.path.join(_CACHE_DIR, model_name)
+    os.makedirs(cache_dir_model, exist_ok=True)
+    logger.info(f"Cache directory created at {cache_dir_model}")
+
+
+def _requests_retry_session(
+    retries=3,
+    backoff_factor=0.3,
+    status_forcelist=(500, 502, 504),
+):
+    session = requests.Session()
+    retry = Retry(
+        total=retries,
+        read=retries,
+        connect=retries,
+        backoff_factor=backoff_factor,
+        status_forcelist=status_forcelist,
+    )
+    adapter = HTTPAdapter(max_retries=retry)
+    session.mount("http://", adapter)
+    session.mount("https://", adapter)
+    return session
\ No newline at end of file
diff --git a/combo/ner_modules/utils/utils.py b/combo/ner_modules/utils/utils.py
new file mode 100644
index 0000000..6eef9dc
--- /dev/null
+++ b/combo/ner_modules/utils/utils.py
@@ -0,0 +1,175 @@
+from typing import Dict
+import warnings
+import string
+import random
+from .default_config import Config
+import torch
+import warnings
+
+
+def fix_common_warnings(float_precision="medium"):
+    """Fix common warnings that are not relevant to the user"""
+    # Fixing
+    # You are using a CUDA device (<graphic-card>) that has Tensor Cores.To properly utilize them, you should set ...
+    torch.set_float32_matmul_precision(float_precision)
+
+    # Fixing warning about number of workers being too small.
+    warnings.filterwarnings("ignore", ".*does not have many workers.*")
+
+    # Fixing warning about depreciation of tensorboard
+    warnings.filterwarnings("ignore", ".*`tensorboardX` has been removed as a dependency*")
+
+
+def move_tensors_to_device(tensor_dict, device):
+    """Move all tensors in a dict to a device"""
+    return {key: tensor.to(device) for key, tensor in tensor_dict.items()}
+
+
+def generate_random_string(length=16):
+    """Generate a random string of given length"""
+    letters = string.ascii_lowercase
+    return ''.join(random.choice(letters) for i in range(length))
+
+
+def custom_formatwarning(msg, *args, **kwargs):
+    """Custom warning formatter"""
+    # ignore everything except the message
+    return "WARNING: " + str(msg) + '\n'
+
+
+def check_config_constraints(config) -> Dict:
+    """Check if the config is valid according to the constraints and fixes config if possible"""
+    POSSIBLE_LOSSES = ["crf", "ce", "focal"]
+
+    warnings.formatwarning = custom_formatwarning
+
+    # loading default config
+    default_config = Config.default_config
+
+    data_config = config.get("data", {})
+    model_config = config.get("model", {})
+    trainer_config = config.get("trainer", {})
+
+    # Check if learning rate is specified
+    if "learning_rate" not in config.keys():
+        warnings.warn(f"Learning rate is not specified")
+    if "loss" not in config.keys():
+        warnings.warn(f"Loss is not specified")
+    else:
+        if config["loss"] not in POSSIBLE_LOSSES:
+            raise Exception(f"Loss is not in {POSSIBLE_LOSSES}")
+
+    # Check if the model config is valid
+    if model_config:
+        # check bert embedder
+        bert_embedder_config = model_config.get("bert_embedder", {})
+        bert_embedder_config_keys = bert_embedder_config.keys()
+        if "pretrained_model_name" not in bert_embedder_config_keys:
+            raise Exception("Specify pretrained_model_name in model config")
+
+        if "pretrained_model_type" not in bert_embedder_config_keys:
+            raise Exception("Specify pretrained_model_type in model config")
+
+        if "freeze_bert" not in bert_embedder_config_keys:
+            default_value = default_config["model"]["bert_embedder"]["freeze_bert"]
+            warnings.warn(f"No freeze_bert specified, using default value : {default_value}")
+            bert_embedder_config["freeze_bert"] = default_value
+
+        if "token_pooling" not in bert_embedder_config_keys:
+            default_value = default_config["model"]["bert_embedder"]["token_pooling"]
+            warnings.warn(f"No token_pooling specified, using default value - {default_value}")
+            bert_embedder_config["token_pooling"] = default_value
+
+        if bert_embedder_config["token_pooling"]:
+            warnings.warn("Token pooling is enabled, setting data-tokenize_entities to True")
+            data_config["tokenize_entities"] = True
+        else:
+            warnings.warn("Token pooling is disables, setting data-tokenize_entities to False")
+            data_config["tokenize_entities"] = False
+
+        if "pooling_strategy" not in bert_embedder_config_keys and bert_embedder_config["token_pooling"]:
+            default_value = default_config["model"]["bert_embedder"]["pooling_strategy"]
+            warnings.warn(f"No pooling_strategy specified, using default value: {default_value}")
+            bert_embedder_config["pooling_strategy"] = default_value
+        else:
+            if bert_embedder_config["token_pooling"] and bert_embedder_config["pooling_strategy"] not in ["max", "mean"]:
+                raise Exception("Specify pooling_strategy in model config - possible values [max, mean]")
+
+        config["model"]["bert_embedder"] = bert_embedder_config
+
+        # check char_embedder
+        char_embedder_config = model_config.get("char_embedder", {})
+        char_embedder_config_keys = char_embedder_config.keys()
+        if char_embedder_config:
+            if char_embedder_config.get("type", "-") not in ["combo", "contextual"]:
+                raise Exception("Specify char_embedder type in model config - possible values [combo, contextual]")
+
+            if "char_embedding_dim" not in char_embedder_config_keys:
+                default_value = default_config["model"]["char_embedder"]["char_embedding_dim"]
+                warnings.warn(f"No char_embedding_dim specified, using default value {default_value}")
+                char_embedder_config["char_embedding_dim"] = default_value
+
+            warnings.warn("Character embedder architecture specified, setting data-use_char_level_embeddings to True")
+            data_config["use_char_level_embeddings"] = True
+        else:
+            warnings.warn("Character embedder architecture not specified, setting data-use_char_level_embeddings to False")
+            data_config["use_char_level_embeddings"] = False
+
+        config["model"]["char_embedder"] = char_embedder_config
+
+        # check classifier
+        classifier_config = model_config.get("classifier", {})
+        classifier_config_keys = classifier_config.keys()
+        if classifier_config:
+            if classifier_config.get("type", "-") not in ["crf", "vanilla"]:
+                raise Exception("Specify classifier type in model config - possible values [crf, vanilla]")
+            if classifier_config.get("to_tag_space", "-") not in ["linear", "bilstm", "transformer"]:
+                raise Exception("Specify transformation to tag space in model config - possible values [linear, bilstm, transformer]")
+        else:
+            raise Exception("Specify model classifier in model config")
+
+    else:
+        raise Exception("Specify model architecture in model config")
+
+    # Check if the data config is valid
+    data_config_keys = data_config.keys()
+    if "use_char_level_embeddings" not in data_config_keys:
+        default_value = default_config["data"]["use_char_level_embeddings"]
+        warnings.warn(f"No use_char_level_embeddings specified, using default value {default_value}")
+        data_config["use_char_level_embeddings"] = default_value
+
+    if "use_start_end_token" not in data_config_keys:
+        default_value = default_config["data"]["use_start_end_token"]
+        warnings.warn(f"No use_start_end_token specified, using default value {default_value}")
+        data_config["use_start_end_token"] = default_value
+
+    if "tokenize_entities" not in data_config_keys:
+        default_value = default_config["data"]["tokenize_entities"]
+        warnings.warn(f"No tokenize_entities specified, using default value {default_value}")
+        data_config["tokenize_entities"] = default_value
+
+    if "batch_size" not in data_config_keys:
+        default_value = default_config["data"]["batch_size"]
+        warnings.warn(f"No batch_size specified, using default value {default_value}")
+        data_config["batch_size"] = default_value
+
+    if "encoding" not in data_config_keys:
+        default_value = default_config["data"]["encoding"]
+        warnings.warn(f"No encoding specified, using default value {default_value}")
+        data_config["encoding"] = default_value
+
+    if "num_workers" not in data_config_keys:
+        default_value = default_config["data"]["num_workers"]
+        warnings.warn(f"No num_workers specified, using default value {default_value}")
+        data_config["num_workers"] = default_value
+
+    config["data"] = data_config
+
+    # Check if the training config is valid
+    if trainer_config:
+        pass
+    else:
+        warnings.warn("No trainer config provided, using default trainer config")
+        config["trainer"] = default_config["trainer"]
+
+    return config
diff --git a/combo/predict.py b/combo/predict.py
index 3b8b81a..3feacb6 100644
--- a/combo/predict.py
+++ b/combo/predict.py
@@ -22,6 +22,12 @@ from combo.utils import download, graph
 from combo.modules.model import Model
 from combo.data import Token
 
+from combo.ner_modules.NerModel import NerModel
+from combo.ner_modules.data.NerTokenizer import NerTokenizer
+from pathlib import Path
+from combo.ner_modules.utils.utils import move_tensors_to_device
+
+
 logger = logging.getLogger(__name__)
 
 
@@ -32,7 +38,9 @@ class COMBO(PredictorModule):
                  model: Model,
                  dataset_reader: DatasetReader,
                  batch_size: int = 1024,
-                 line_to_conllu: bool = True) -> None:
+                 line_to_conllu: bool = True,
+                 ner_model: str = None) -> None:
+
         super().__init__(model, dataset_reader)
         self.batch_size = batch_size
         self.vocab = model.vocab
@@ -42,6 +50,13 @@ class COMBO(PredictorModule):
         self.without_sentence_embedding = False
         self.line_to_conllu = line_to_conllu
 
+        # Ner modules
+        self.ner_model = None
+        self.ner_tokenizer = None
+        if ner_model is not None:
+            self._load_ner_model(ner_model)
+
+
     def __call__(self, sentence: Union[str, List[str], List[List[str]], List[data.Sentence]], **kwargs):
         """Depending on the input uses (or ignores) tokenizer.
         When model isn't only text-based only List[data.Sentence] is possible input.
@@ -101,6 +116,8 @@ class COMBO(PredictorModule):
                 for sentences_batch in util.lazy_groups_of(sentences, self.batch_size):
                     sentences_batch = self.predict_batch_json(sentences_batch)
                     result.extend(sentences_batch)
+                if self.ner_model is not None:
+                    result = self._predict_ner_tags(result)
                 return result
             elif isinstance(example, data.Sentence):
                 result = []
@@ -108,6 +125,8 @@ class COMBO(PredictorModule):
                 for sentences_batch in util.lazy_groups_of(sentences, self.batch_size):
                     sentences_batch = self.predict_batch_instance(sentences_batch)
                     result.extend(sentences_batch)
+                if self.ner_model is not None:
+                    result = self._predict_ner_tags(result)
                 return result
             else:
                 raise ValueError("List must have either sentences as str, List[str] or Sentence object.")
@@ -282,7 +301,9 @@ class COMBO(PredictorModule):
     def from_pretrained(cls,
                         path: str,
                         batch_size: int = 1024,
-                        cuda_device: int = -1):
+                        cuda_device: int = -1,
+                        ner_model: str = None):
+
         if os.path.exists(path):
             model_path = path
         else:
@@ -296,4 +317,30 @@ class COMBO(PredictorModule):
         archive = load_archive(model_path, cuda_device=cuda_device)
         model = archive.model
         dataset_reader = archive.dataset_reader or default_ud_dataset_reader(archive.config.get("model_name"))
-        return cls(model, dataset_reader, batch_size)
+        return cls(model, dataset_reader, batch_size, ner_model=ner_model)
+
+    def _load_ner_model(self,
+                        ner_model: str = None):
+        try:
+            self.ner_model = NerModel.get(ner_model).to(self.device)
+            self.ner_tokenizer = NerTokenizer.get(ner_model,
+                                                  load_lambo_tokenizer=False)
+        except:
+            logger.debug(f"No {ner_model} found in repository. Trying local path.")
+            self.ner_model = NerModel.load_from_disc(folder_path=Path(ner_model)).to(self.device)
+            self.ner_tokenizer = NerTokenizer.load_from_disc(folder_path=Path(ner_model),
+                                                             load_lambo_tokenizer=False)
+
+
+    def _predict_ner_tags(self,
+                          result: List[data.Sentence]) -> List[data.Sentence]:
+        """Enriches predictions with NER tags."""
+        for sentence in result:
+            entities = [token.text for token in sentence.tokens]
+            input_data = self.ner_tokenizer.encode(entities, batchify=True)
+            input_data = move_tensors_to_device(input_data, self.ner_model.device)
+            preds = self.ner_model.predict(input_data)
+            for token, pred in zip(sentence.tokens, self.ner_tokenizer.decode(preds)[0]):
+                token.ner_tag = pred
+        return result
+
diff --git a/docs/NerBuilder.png b/docs/NerBuilder.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3387e44433a53a782ce088c3782a2eaa6a28f98
GIT binary patch
literal 24775
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

literal 0
HcmV?d00001

diff --git a/docs/Ner_config_files.md b/docs/Ner_config_files.md
new file mode 100644
index 0000000..ad7f50e
--- /dev/null
+++ b/docs/Ner_config_files.md
@@ -0,0 +1,111 @@
+# Config file documentation
+
+Ideally config file should contain as much information as possible so it is easier to track experiments. In this file description of keys is provided.
+Config file format is a `.json` file with nested dictionaries. First level keys are:
+- `data` - containes information about data processing
+- `model` - nested dictionary with information about model architecture
+- `loss` - it is a string that specifies loss function. Can be either `ce`, `focal` or `crf`
+- `learning_rate` - it is a float that specifies learning rate used in training
+- `callbacks` - containes names of callbacks used in training
+- `trainer`
+
+Defalut values are values which will be set if following code is run. 
+```python
+from combo.ner_modules.utils.utils import check_config_constraints
+config = check_config_constraints(config)
+```
+
+---
+`data`
+
+It is required for this dictionary to contain path_data unless training is done using [train.py](..%2Ftrain.py) and data is passed as an argument.
+
+Default values:
+
+```json
+  "data": {
+    "path_data": "./data/pl/",
+    "use_char_level_embeddings": true,
+    "use_start_end_token": true,
+    "tokenize_entities": true,
+    "batch_size": 32,
+    "encoding": "utf-8",
+    "num_workers": 1
+  }
+```
+- `use_start_end_token` [optional bool]- if true, start and end token will be added to each sentence
+- `tokenize_entities` [optional bool] - if true, entities will be tokenized by backbone tokenizer. It is advised to set it to true.
+- `encoding` [optional str] - encoding of data files
+
+---
+`model`
+
+Specifies model architecture. It has up to 4 keys:
+- `bert_embedder` [required dict]
+- `char_embedder` [optional dict] - if not specified, no character level embeddings will be used
+- `classifier` [required dict]
+- `dropout` [optional float] - dropout probability applied to BERT embedder output
+
+Example values for `bert_embedder`:
+```json
+"bert_embedder": {
+    "projection_dimension": null,
+    "freeze_bert": true,
+    "token_pooling": true,
+    "pooling_strategy": "max"
+```
+- `pretrained_model_name` [required] is a string of HuggingFace Bert model
+- `pretrained_model_type` [required] is a string of HuggingFace Bert model type should either `AutoModel` or `BertModel`
+- `projection_dimension` [optional int] if specified, output of BERT will be projected to this dimension
+- `freeze_bert` [optional bool] if true, BERT weights will be frozen during training
+- `pooling_strategy` [optional str] if `token_pooling` is true, this key specifies pooling strategy. Can be either `max` or `mean`
+
+Example values for `char_embedder`:
+```json
+"char_embedder": {"type" : "combo",
+                  "char_embedding_dim":  64
+                 }
+```
+- `type` [required str] specifies type of character level embeddings. Currently, it supports only `combo`. But `contextual` is planned to be added.
+- `char_embedding_dim` [optional int] specifies dimension of character level embeddings.
+- `context_window` [optional int] if `type` is `contextual`, this key specifies context window size. To be added in future version.
+
+Example values for `classifier`:
+```json
+"classifier": {"type" : "crf",
+               "to_tag_space" :  "bilstm"},
+```
+- `type` [required str] specifies type of classifier. Can be either `crf` or `vanilla`
+- `to_tag_space` [required str] specifies type of layer that transforms output of BERT and possibly character embedder to tag space. Can be either `bilstm`, `transformer` or `linear`
+
+---
+`callbacks`
+
+Each key of callbacks dict is another callback used in training, despite `FixedProgressBar` which is a fix to common problem with progress bar in PyTorch Lightning, each callback is a callback implemented in PyTorch lightning library. Values of other thatn `FixedProgressBar` callbacks are dictionaries with arguments passed to callback. By default there is no callbacks used in training. 
+
+Example values:
+```json
+"callbacks": {"FixedProgressBar": true,
+            "LearningRateMonitor": {"logging_interval":"epoch"},
+            "ModelCheckpoint": {"monitor": "validation_f1",
+                                "mode": "max",
+                                "save_top_k": 1,
+                                "save_weights_only": true,
+                                "filename" : "best_model"},
+            "EarlyStopping": {"monitor": "validation_f1",
+                              "mode": "max",
+                              "min_delta": 0.001, 
+                              "patience": 6}}
+```
+---
+`trainer`
+
+Similarly to `callbacks`, each key of `trainer` dict is a parameter of PyTorch Lightning trainer. 
+
+Deafult values are:
+```json
+"trainer": {"devices": [0],
+          "max_epochs": 50,
+          "accelerator": "cuda",
+          "log_every_n_steps": 10}
+```
\ No newline at end of file
diff --git a/docs/Ner_docs.md b/docs/Ner_docs.md
new file mode 100644
index 0000000..5832315
--- /dev/null
+++ b/docs/Ner_docs.md
@@ -0,0 +1,275 @@
+# Table of Contents
+
+1. [Data format](#data-format)
+2. [Choose architecture](#choose-architecture)
+3. [Config files](#config-files)
+4. [Scripts](Scripts)
+
+# Data format
+
+To train a model or evaluate an existing one, the expected input consists of text files:
+- `train.txt`
+- `dev.txt`
+- `test.txt`
+
+These files should be located in the same directory and will be fed into the model during training. 
+
+The expected file format is as follows:
+- Each line consists of a pair `<token> <tag>`, separated by a space.
+- Consecutive lines represent the entities/words to be tagged in the same sentence, in their original order.
+- The beginning of a new sentence is indicated by a metadata line: `# sent_id = <n>`, where `<n>` is the unique identifier for the sentence in the file.
+- A newline character signifies the end of each sentence.
+- Currently supported tags follow the [IOB format](https://en.wikipedia.org/wiki/Inside%E2%80%93outside%E2%80%93beginning_(tagging)).
+
+Example of train.txt file:
+
+```buildoutcfg
+# sent_id = 0
+SOCCER O
+- O
+JAPAN B-LOC
+GET O
+LUCKY O
+WIN O
+, O
+CHINA B-LOC
+IN O
+SURPRISE O
+DEFEAT O
+. O
+
+# sent_id = 1
+Nadim B-PER
+Ladki I-PER
+...
+```
+Example training files can be also found in root directory ```/notebooks/example_data``` 
+
+# Choose architecture
+
+When training new model from scratch user is expected to choose architecture of the model. It is however recommended to use following architecture:
+- BertEmbedder = Bert Model + Mean Token Pooling
+- CharacterEmbedder = Combo character embedder
+- Classifier = CRF + BiLSTM
+
+It can be created using following part of config:
+```python
+"data": {
+    "use_char_level_embeddings": true, 
+    "use_start_end_token": true, 
+    "tokenize_entities": true, 
+    ... # other parameters
+        }
+...  
+"model": {
+    "bert_embedder": {
+        "pretrained_model_name": "allegro/herbert-base-cased", # or any other mode from huggingface
+        "pretrained_model_type": "AutoModel", 
+        "projection_dimension": None,
+        "freeze_bert": True,
+        "token_pooling": True,
+        "pooling_strategy": "max"
+                     },
+    "char_embedder": {"type" : "combo",
+                      "char_embedding_dim":  64
+                     },
+    "classifier": {"type" : "crf",
+                   "to_tag_space" :  "bilstm"},
+    "dropout": 0.1
+            },
+...
+```
+
+![NerBuilder.png](NerBuilder.png)
+
+The image above provides an overview of possible architectures for NER. Each architecture comprises four main components that can be customized either through configuration files or directly during instantiation:
+
+`NerTokenizer` Module for preparing data for training. When creating an instance, specify:
+- the backbone tokenizer corresponding to the BERT model in the BERT embedder
+- the mapping between character and id and between tag and id.
+- whether start and end tokens should be added to sentence which is required if CRF layer is used. 
+- whether entities should be tokenised before the back bone BERT model. I.e. whether the entity as input to the BERT model is to be additionally tokenised. If so, the token pooling strategy should be defined for the BERT embbedder.
+- whether character level embeddings will be used
+- language in the case of string handling. This is the language of the LAMBO model used to segment the input string.
+
+`Character Embedder` A module for creating entity representations based on letters. Currently supported is Character Embedder such as in the COMBO model.
+
+`Bert Embedder`A module that creates entity vector representations of a given dimension as the last layer of the BERT model. When additional tokenisation of entities is requested, this module aggregates token vectors to the entity level via max pooling or mean pooling.
+
+`Classifier` A module that concatenates vector representations from BERT and optionally Character Embedder through the BiLSTM or Transformer layer and transforms them to tag space using the Linear layer or CRF layer.
+
+# Config files
+
+For quick prototyping, model creation and training parameter settings can be set using configuration files in JSON format.
+Template for building config files
+```
+{
+ "data": {
+   "path_data": "./data/pl/",
+   "use_char_level_embeddings": true,
+   "use_start_end_token": true,
+   "tokenize_entities": true,
+   "batch_size": 32,
+   "encoding": "utf-8",
+   "num_workers": 1
+ },
+
+ "model": {
+   "bert_embedder": {
+       "pretrained_model_name": "allegro/herbert-base-cased",
+       "pretrained_model_type": "AutoModel",
+       "projection_dimension": null,
+       "freeze_bert": true,
+       "token_pooling": true,
+       "pooling_strategy": "max"
+                    },
+   "char_embedder": {"type" : "combo",
+                     "char_embedding_dim":  64
+                    },
+   "classifier": {"type" : "crf",
+                  "to_tag_space" :  "bilstm"},
+   "dropout": 0.1
+           },
+
+ "loss": "ce",
+ "learning_rate": 0.001,
+
+ "callbacks": {"FixedProgressBar": true,
+               "LearningRateMonitor": {"logging_interval":"epoch"},
+               "ModelCheckpoint": {"monitor": "validation_f1",
+                                   "mode": "max",
+                                   "save_top_k": 1,
+                                   "save_weights_only": true,
+                                   "filename" : "best_model"},
+               "EarlyStopping": {"monitor": "validation_f1",
+                                 "mode": "max",
+                                 "min_delta": 0.001,
+                                 "patience": 6}},
+
+ "trainer": {"devices": [0],
+             "max_epochs": 50,
+             "accelerator": "cuda",
+             "log_every_n_steps": 10}
+}
+
+```
+The configuration file should contain nested dictionaries detailing the parameters for various modules and hyperparameters. Refer to 
+[Config Files documentation](Ner_config_files.md) for more information how to build valid config file.
+
+Most parameters are self-explanatory, but some require additional notes:
+
+- `"model"-"bert_embedder"-"pretrained_model_name"` specifies the name of the model from the Hugging Face library.
+- `"model"-"bert_embedder"-"pretrained_model_type"` is the class used for loading the model. Currently, two types are supported: BertModel or AutoModel.
+- `"model"-"bert_embedder"-"projection_dimension"` specifies the desired dimension of the output vectors from the Bert Embedder.
+- `"model"-"bert_embedder"-"pooling_strategy"` can take either 'mean' or 'max' values. It defines the type of pooling applied to the output vectors from the Bert Embedder to obtain word representations. This requires both token_pooling and tokenize_entities to be set to true.
+- `"model"-"char_embedder"-"type`" defines how to obtain word representations based on characters. Currently, it takes either 'combo' or 'contextualized' values. In both cases, `char_embedding_dim` should be specified. For the 'contextualized' option, you'll also need to specify how many characters are considered by adjusting the `context_window` parameter.
+- `"model"-"classifier"-"type"` can take one of two values: crf or vanilla, which defines the last layer of the model. Additionally, you'll need to specify `to_tag_space`, which outlines additional layers in the classifier module. It can take values like transformer, bilstm, or linear.
+- `"model"-"dropout"` specifies the dropout value applied to the output vectors from the Bert Embedder.
+- `loss` takes either 'ce' for Cross Entropy Loss or 'Focal' for Focal Loss. If the classifier type is CRF, this parameter is omitted.
+- `callbacks` are callbacks used during training along with their parameters. Supported callbacks are LearningRateMonitor, ModelCheckpoint, EarlyStopping, and FixedProgressBar, which fixes a bug related to the progress bar on some terminals.
+
+# Scripts 
+
+There is possibility to train and evaluate model directly from terminal. You have access to 3 scripts:
+- [find_lr.py](..%2Fner_scripts%2Ffind_lr.py) - script for finding optimal learning rate
+##### Arguments
+`--config_path` The path to the JSON configuration file that defines various settings for model and training. This argument is required.
+
+Example: `--config_path="./config.json"`
+
+`--data_path:` The path to the data directory. If this argument is not provided, the data path is taken from the configuration file.
+
+Example: `--data_path="./data/"`
+
+`--check_config` A flag to enable additional configuration validation. If this flag is provided, the script will perform additional checks on the configuration settings.
+
+Example: `--check_config`
+
+##### Example usage
+```python
+python find_lr.py --config_path="./config.json" --check_config
+```
+
+- [train.py](..%2Fner_scripts%2Ftrain.py) - script for training model
+##### Arguments
+`--config_path` Path to the configuration file for training the model.
+
+Default: `./configs/default_config.json`
+
+Example: `--config_path="./configs/my_config.json"`
+
+`--n_reruns` Number of times the model training should be rerun.
+
+Default: `1`
+
+Example: `--n_reruns=5`
+
+`--data_path` Path to the data directory. If not provided, it is taken from the configuration file.
+
+Example: `--data_path="./data/"`
+
+`--serialization_dir` Directory where the model should be saved.
+
+Default: `./models/`
+
+Example: `--serialization_dir="./my_models/"`
+
+`--check_config` A flag to indicate whether to check the configuration constraints.
+
+Example: `--check_config`
+
+`--use_wandb_logger` A flag to specify whether to use Weights and Biases (wandb) for logging. Otherwise tensorboard logger will be used.
+
+Example: `--use_wandb_logger`
+
+`--wandb_project_name` Name of the Weights and Biases (wandb) project for logging.
+
+Default: `NER_ipi_pan3`
+
+Example: `--wandb_project_name="My_NER_Project"`
+
+##### Example usage
+```python
+python train.py --config_path="./configs/my_config.json" --n_reruns=3
+```
+
+- [eval.py](..%2Fner_scripts%2Feval.py) - script for evaluating model. Model path is considered to represent model as whole. It should contain:
+`best_model.ckpt` - model weights, `char_to_id.json` if model uses character embeddings, `config.json` which was created during training, and `label_to_id.json` which is mapping from tags to ids.
+
+##### Arguments
+`--config_path` Path to the configuration file for training the model.
+
+`--model_path`: The path to the folder containing the pre-trained NER model and its associated files.
+
+Default: `./models/pl_example`
+
+Example: `--model_path="./models/my_pretrained_model"`
+
+`--data_file_path`: The path to the dataset file for prediction.
+
+Default: `./data/pl/test.txt`
+
+Example: `--data_file_path="./data/custom_test.txt"`
+
+`--device`: The computational device for prediction. Use -1 for CPU. Any other integer will correspond to a specific CUDA device.
+
+Default: `0`
+
+Example: `--device=1`
+
+`--batch_size`: The number of data points processed in each batch during prediction.
+
+Default: `24`
+
+Example: `--batch_size=32`
+
+`--encoding`: The encoding used to read the dataset file.
+
+Default: `utf-8`
+
+Example: `--encoding="ascii"`
+
+##### Example usage
+```python
+python eval.py --model_path="./models/custom_model" --data_file_path="./data/custom_test.txt" --device=-1
+```
diff --git a/ner_scripts/eval.py b/ner_scripts/eval.py
new file mode 100644
index 0000000..1055dd6
--- /dev/null
+++ b/ner_scripts/eval.py
@@ -0,0 +1,112 @@
+"""
+This script facilitates the evaluation of prediction process for a pre-trained Named Entity Recognition (NER) model.
+At the end of evaluation it prints classification report and global metrics.
+
+Arguments:
+---------
+--model_path : str, optional (default: "./models/pl_example")
+Path to the folder containing the pre-trained NER model and associated files.
+--data_file_path : str, optional (default: "./data/pl/test.txt")
+Path to the dataset file that needs to be fed to the model for prediction.
+--device : int, optional (default: 0)
+The computational device to be used. '-1' signifies CPU usage. Any other integer denotes the specific CUDA device.
+--batch_size : int, optional (default: 24)
+The number of data points to be processed in each batch during prediction.
+--encoding : str, optional (default: "utf-8")
+Encoding format used to read the dataset file.
+"""
+import argparse
+from pathlib import Path
+import json
+import torch
+from combo.ner_modules.NerModel import NerModel
+from combo.ner_modules.data.NerDataset import NerDataset
+from torch.utils.data import DataLoader
+from combo.ner_modules.metrics.MetricHolder import MetricHolder
+from tqdm import tqdm
+from combo.ner_modules.utils.constructors import construct_loss_from_config, construct_tokenizer_from_config
+from combo.ner_modules.utils.utils import fix_common_warnings
+
+# Argument parsing
+parser = argparse.ArgumentParser()
+parser.add_argument("--model_path", action="store", default="./models/pl_example", help="Path folder with model")
+parser.add_argument("--data_file_path", action="store", default="./data/pl/test.txt", help="Path to file with data")
+parser.add_argument("--device", action="store", default=0, help="Specify device")
+parser.add_argument("--batch_size", action="store", default=24, help="Specify device")
+parser.add_argument("--encoding", action="store", default="utf-8", help="Specify device")
+
+
+args = parser.parse_args()
+PATH_MODEL = Path(args.model_path)
+PATH_DATA_FILE = Path(args.data_file_path)
+
+
+def move_tensors_to_device(tensor_dict, device):
+    return {key: tensor.to(device) for key, tensor in tensor_dict.items()}
+
+
+if __name__ == "__main__":
+    fix_common_warnings()
+
+    # load jsons
+    config = json.load(open(PATH_MODEL / "config.json"))
+    try:
+        char_to_id = json.load(open(PATH_MODEL / "char_to_id.json"))
+    except:
+        char_to_id = {}
+    label_to_id = json.load(open(PATH_MODEL / "label_to_id.json"))
+
+    # specify device
+    if int(args.device) == -1:
+        device = torch.device("cpu")
+    else:
+        device = torch.device(f"cuda:{args.device}")
+
+    # define model
+    loss_fn = construct_loss_from_config(config=config,
+                                         label_to_id=label_to_id)
+
+    # load model
+    model = NerModel.load_from_checkpoint(PATH_MODEL / "best_model.ckpt",
+                                          loss_fn=loss_fn,
+                                          char_to_id_map=char_to_id,
+                                          label_to_id_map=label_to_id,
+                                          config=config)
+    model.to(device)
+
+    # create dataset & dataloader
+    tokenizer = construct_tokenizer_from_config(config=config,
+                                                char_to_id_map=char_to_id,
+                                                label_to_id_map=label_to_id)
+
+    dataset = NerDataset(file_path=PATH_DATA_FILE,
+                         tokenizer=tokenizer,
+                         encoding=args.encoding)
+
+    dataloader = DataLoader(dataset,
+                            batch_size=args.batch_size,
+                            shuffle=False)
+
+    # predicting
+    metrics_holder = MetricHolder(label_to_idx=label_to_id)
+    model.freeze()
+    i = 0
+    for batch in tqdm(dataloader):
+        batch = move_tensors_to_device(batch, device)
+        model.test_step(batch, i)
+        i += 1
+
+    print("#" * 50)
+    print("Classification report")
+    print(model.test_metrics_holder.get_classification_report())
+    print("General metrics")
+    metrics = model.test_metrics_holder.get_metrics(stage="eval")
+    for metric in metrics:
+        print(f"{metric}: {metrics[metric]}")
+
+
+
+
+
+
+
diff --git a/ner_scripts/find_lr.py b/ner_scripts/find_lr.py
new file mode 100644
index 0000000..60764c3
--- /dev/null
+++ b/ner_scripts/find_lr.py
@@ -0,0 +1,95 @@
+"""
+This script is designed for finding learning rate for specified architecture of a Named Entity Recognition (NER) model
+It loads configuration settings from a JSON file and performs a learning rate search using a PyTorch Lightning learning
+rate finder. At the end of the script, it prints the suggested learning rate obtained from the learning rate finder.
+
+Arguments:
+----------
+--config_path : str
+    Path to the configuration file in JSON format.
+--data_path : str, optional
+    Path to the data directory. If provided, it overrides the data path in the configuration.
+--check_config : bool, optional
+    Flag to check the validity of the configuration.
+"""
+from pathlib import Path
+import pytorch_lightning as pl
+from pytorch_lightning.tuner import Tuner
+import json
+import argparse
+from combo.ner_modules.data.utils import create_tag2id, create_char2id, calculate_longest_word
+from combo.ner_modules.NerModel import NerModel
+from combo.ner_modules.utils.utils import check_config_constraints
+from combo.ner_modules.utils.constructors import construct_loss_from_config, construct_tokenizer_from_config, construct_data_module_from_config
+import torch
+from combo.ner_modules.utils.utils import fix_common_warnings
+
+torch.set_float32_matmul_precision("medium")  # to make lightning happy
+
+# Argument parsing
+parser = argparse.ArgumentParser()
+parser.add_argument("--config_path", action="store", default="", help="Path to config file")
+parser.add_argument("--data_path", action="store", default="", help="Path to data, if not provided taken from config")
+parser.add_argument("--check_config", action="store_true", help="Flag whether check on config should be done")
+args = parser.parse_args()
+
+PATH_CONFIG_FILE = Path(args.config_path)
+DATA_PATH = args.data_path
+
+if __name__ == "__main__":
+    fix_common_warnings()
+
+    # Loading config file
+    default_config = open(PATH_CONFIG_FILE)
+    config = json.load(default_config)
+
+    # Parse data path to config if it is not give
+    if DATA_PATH:
+        config["data"]["path_data"] = DATA_PATH
+
+    # Check config
+    if args.check_config:
+        config = check_config_constraints(config)
+
+    # create vocabularies
+    char_to_id = create_char2id(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                encoding=config["data"]["encoding"])
+    label_to_id = create_tag2id(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                encoding=config["data"]["encoding"],
+                                include_special_tokens=config["data"]["use_start_end_token"])
+
+    # Extract max word length
+    config["data"]["max_word_len"] = calculate_longest_word(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                                            encoding=config["data"]["encoding"])
+
+    # construct tokenizer
+    tokenizer = construct_tokenizer_from_config(config=config,
+                                                char_to_id_map=char_to_id,
+                                                label_to_id_map=label_to_id)
+    # construct data module
+    data_module = construct_data_module_from_config(config=config,
+                                                    tokenizer=tokenizer)
+
+    # construct loss
+    loss = construct_loss_from_config(config=config,
+                                      label_to_id=label_to_id)
+
+    model = NerModel(loss_fn=loss,
+                     char_to_id_map=char_to_id,
+                     label_to_id_map=label_to_id,
+                     config=config)
+
+    # Create an instance of the PyTorch Lightning Trainer
+    trainer = pl.Trainer(devices=config["trainer"]["devices"],
+                         max_epochs=-1,
+                         accelerator=config["trainer"]["accelerator"],
+                         log_every_n_steps=10)
+    tuner = Tuner(trainer)
+
+    # Train the model
+    lr_finder = tuner.lr_find(model, datamodule=data_module)
+
+    # Print learning rate
+    print(f"Found learning rate:{lr_finder.suggestion()}")
+
+
diff --git a/ner_scripts/train.py b/ner_scripts/train.py
new file mode 100644
index 0000000..c2ffaec
--- /dev/null
+++ b/ner_scripts/train.py
@@ -0,0 +1,157 @@
+"""
+This script allows for the training and testing of a Named Entity Recognition model using PyTorch Lightning.
+
+Arguments:
+---------
+--config_path : str, optional (default: "./configs/default_config.json")
+    Path to the configuration file used for training the model.
+--n_reruns : int, optional (default: 1)
+    Number of model reruns.
+--data_path : str, optional (default: "")
+    Path to the data, if not provided, taken from the config.
+--serialization_dir : str, optional (default: "./models/")
+    Path to save the model.
+--check_config : bool, optional
+    Flag to check the constraints on the configuration.
+--use_wandb_logger : bool, optional
+    Flag to determine whether to use the wandb logger.
+--wandb_project_name : str, optional (default: "NER_ipi_pan3")
+    Name of the WANDB project.
+"""
+import argparse
+from pathlib import Path
+import torch
+import json
+import shutil
+import os
+import pytorch_lightning as pl
+from combo.ner_modules.NerModel import NerModel
+from combo.ner_modules.data.utils import create_tag2id, create_char2id, calculate_longest_word
+from pytorch_lightning.loggers import WandbLogger
+import wandb
+from combo.ner_modules.utils.utils import generate_random_string, check_config_constraints
+from combo.ner_modules.utils.constructors import construct_callbacks_from_config, construct_loss_from_config, construct_tokenizer_from_config,\
+    construct_data_module_from_config
+from combo.ner_modules.utils.utils import fix_common_warnings
+
+# Argument parsing
+parser = argparse.ArgumentParser()
+parser.add_argument("--config_path", action="store", default="./configs/default_config.json", help="Path to config file")
+parser.add_argument("--n_reruns", action="store", default=1, help="Number of model reruns")
+parser.add_argument("--data_path", action="store", default="", help="Path to data, if not provided taken from config")
+parser.add_argument("--serialization_dir", action="store", default="./models/", help="Path to save_model")
+parser.add_argument("--check_config", action="store_true", help="Flag whether check on config should be done")
+parser.add_argument("--use_wandb_logger", action="store_false", help="Flag whether to use wandb logger")
+parser.add_argument("--wandb_project_name", action="store", default="NER_ipi_pan3", help="WANDB project name")
+
+
+args = parser.parse_args()
+
+PATH_CONFIG_FILE = Path(args.config_path)
+N_RERUNS = int(args.n_reruns)
+DATA_PATH = args.data_path
+
+torch.set_float32_matmul_precision("medium")  # to make lightning happy
+
+if __name__ == "__main__":
+    # fixing common warnings
+    fix_common_warnings()
+
+    # Loading config file
+    default_config = open(PATH_CONFIG_FILE)
+    config = json.load(default_config)
+
+    # Wandb logger config name will be used as run name
+    config["name"] = PATH_CONFIG_FILE.stem
+
+    # Parse data path to config if it is given
+    if DATA_PATH:
+        config["data"]["path_data"] = DATA_PATH
+
+    # Check config
+    if args.check_config:
+        config = check_config_constraints(config)
+
+    # create vocabularies
+    char_to_id = create_char2id(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                encoding=config["data"]["encoding"])
+    label_to_id = create_tag2id(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                encoding=config["data"]["encoding"],
+                                include_special_tokens=config["data"]["use_start_end_token"])
+
+    # Extract max word length
+    config["data"]["max_word_len"] = calculate_longest_word(file_path=Path(config["data"]["path_data"]) / "train.txt",
+                                                            encoding=config["data"]["encoding"])
+
+    # construct tokenizer
+    tokenizer = construct_tokenizer_from_config(config=config,
+                                                char_to_id_map=char_to_id,
+                                                label_to_id_map=label_to_id)
+    # construct data module
+    data_module = construct_data_module_from_config(config=config,
+                                                    tokenizer=tokenizer)
+
+    # construct loss
+    loss = construct_loss_from_config(config=config,
+                                      label_to_id=label_to_id)
+
+    for k in range(N_RERUNS):
+        print("#"*50)
+        print(f"Starting training number {k+1} out of {N_RERUNS}")
+        serialization_dir = Path(args.serialization_dir) / generate_random_string()
+        serialization_dir.mkdir(parents=True, exist_ok=True)
+
+        if args.use_wandb_logger:
+            wandb.login()
+            logger = WandbLogger(project=args.wandb_project_name,
+                                 config=config,
+                                 reinit=True)
+        else:
+            logger = True
+
+        # save vocab
+        with open(serialization_dir / "char_to_id.json", "w+") as f:
+            json.dump(char_to_id, f)
+
+        with open(serialization_dir / "label_to_id.json", "w+") as f:
+            json.dump(label_to_id, f)
+
+        with open(serialization_dir / "config.json", "w+") as f:
+            json.dump(config, f)
+
+        model = NerModel(loss_fn=loss,
+                         char_to_id_map=char_to_id,
+                         label_to_id_map=label_to_id,
+                         config=config)
+
+        # initialize trainer
+        params = config["trainer"]
+        params["callbacks"] = construct_callbacks_from_config(config.get("callbacks", {}))
+        params["default_root_dir"] = serialization_dir
+        params["logger"] = logger
+        trainer = pl.Trainer(**params)
+
+        # start training
+        trainer.fit(model,
+                    datamodule=data_module)
+
+        # Testing
+        if (Path(config["data"]["path_data"]) / "test.txt").is_file():
+            test_result = trainer.test(verbose=True,
+                                       ckpt_path='best',
+                                       datamodule=data_module)
+
+        if args.use_wandb_logger:
+            wandb.finish()
+
+        # Moving best model to correct directory
+        if "ModelCheckpoint" in config.get("callbacks", {}).keys():
+            checkpoint_callback = params["callbacks"][-2]
+            best_model_path = checkpoint_callback.best_model_path
+            if not best_model_path:
+                best_model_path = f"./{logger.name}/{logger.version}/checkpoints/{checkpoint_callback.filename}.ckpt"
+            new_name = 'best_model.ckpt'
+            new_path = os.path.join(serialization_dir, new_name)
+            shutil.move(best_model_path, new_path)
+
+        print(f"Serialization directory: {serialization_dir}")
diff --git a/notebooks/NER_inference.ipynb b/notebooks/NER_inference.ipynb
new file mode 100644
index 0000000..e5da7e5
--- /dev/null
+++ b/notebooks/NER_inference.ipynb
@@ -0,0 +1,400 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "7e188da4-37e6-417c-a728-48d315d5c5b4",
+   "metadata": {},
+   "source": [
+    "# NER Inference using COMBO as package"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "07f45e19-7243-4162-9700-11db8bdcc395",
+   "metadata": {},
+   "source": [
+    "In order to predict Named Entity Recognition tags, specify COMBO model name and NER model name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "ada97d69-3cdc-42e0-8ce9-b986060f22c2",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "parser_model = \"polish-herbert-base-ud213\"\n",
+    "ner_model = \"pl_large\""
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "2112ff72-7f8b-4c76-9944-6f9bf1ec6cb4",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "[2023-11-29 22:35:01 UTC Loading archive] Error while loading Training Data Loader: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html. Setting Data Loader to None\n",
+      "Exception ignored in: <function tqdm.__del__ at 0x00000200983298B0>\n",
+      "Traceback (most recent call last):\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\std.py\", line 1162, in __del__\n",
+      "    self.close()\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\notebook.py\", line 291, in close\n",
+      "    self.disp(bar_style='success', check_delay=False)\n",
+      "AttributeError: 'tqdm_notebook' object has no attribute 'disp'\n",
+      "[2023-11-29 22:35:01 UTC Loading archive] Error while loading Validation Data Loader: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html. Setting Data Loader to None\n",
+      "Exception ignored in: <function tqdm.__del__ at 0x00000200983298B0>\n",
+      "Traceback (most recent call last):\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\std.py\", line 1162, in __del__\n",
+      "    self.close()\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\notebook.py\", line 291, in close\n",
+      "    self.disp(bar_style='success', check_delay=False)\n",
+      "AttributeError: 'tqdm_notebook' object has no attribute 'disp'\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Using model LAMBO-UD_Polish-PDB\n",
+      "Using model LAMBO-UD_Polish-PDB\n",
+      "Using model LAMBO-UD_Polish-PDB\n"
+     ]
+    }
+   ],
+   "source": [
+    "from combo.predict import COMBO\n",
+    "c = COMBO.from_pretrained(path=parser_model,\n",
+    "                          ner_model=ner_model)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "f4f03e62-d383-482b-a94f-badbedf9f13b",
+   "metadata": {},
+   "source": [
+    "You can pass data as string, list of sentences or list of list of tokenized sentences."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "621204c3-702c-4abf-aa57-1f87ac92cf9d",
+   "metadata": {},
+   "source": [
+    "### Prediction on string"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "34095b90-d609-49b3-a284-8314f68144a6",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "TOKEN           LEMMA           UPOS       HEAD       DEPREL     NER_TAG        \n",
+      "--------------------------------------------------------------------------------\n",
+      "Czy             czy             PART                2 advmod     O              \n",
+      "wiesz           wiedzieć        VERB                0 root       O              \n",
+      ",               ,               PUNCT               5 punct      O              \n",
+      "jak             jak             ADV                 5 advmod     O              \n",
+      "dojechać        dojechać        VERB                2 xcomp      O              \n",
+      "do              do              ADP                 7 case       O              \n",
+      "Åšrody           Åšroda           PROPN               5 obl        B-nam_loc_gpe_city\n",
+      "albo            albo            CCONJ              10 cc         O              \n",
+      "do              do              ADP                10 case       O              \n",
+      "Piotrkowa       Piotrków        PROPN               7 conj       B-nam_loc_gpe_city\n",
+      "Trybunalskiego  trybunalski     ADJ                10 amod:flat  I-nam_loc_gpe_city\n",
+      "?               ?               PUNCT               2 punct      O              \n",
+      "--------------------------------------------------------------------------------\n",
+      "Jeśli           jeśli           SCONJ               3 mark       O              \n",
+      "nie             nie             PART                3 advmod:neg O              \n",
+      "wiesz           wiedzieć        VERB                6 advcl      O              \n",
+      ",               ,               PUNCT               6 punct      O              \n",
+      "to              to              SCONJ               6 mark       O              \n",
+      "zapytaj         zapytać         VERB                0 root       O              \n",
+      "Marka           Marek           PROPN               6 obj        B-nam_liv_person\n",
+      "Strusia         StruÅ›           PROPN               7 flat       I-nam_liv_person\n",
+      "albo            albo            CCONJ              10 cc         O              \n",
+      "sprawdź         sprawdzić       VERB                6 conj       O              \n",
+      "w               w               ADP                12 case       O              \n",
+      "mapie           mapa            NOUN               10 obl        O              \n",
+      "Google          Goog            PROPN              12 nmod       B-nam_pro_media_web\n",
+      ".               .               PUNCT               6 punct      O              \n",
+      "--------------------------------------------------------------------------------\n",
+      "Nie             nie             PART                2 advmod:neg O              \n",
+      "dojedziesz      dojechać        VERB                0 root       O              \n",
+      "do              do              ADP                 4 case       O              \n",
+      "celu            cel             NOUN                2 obl        O              \n",
+      "PKS-em          PKS             NOUN                2 iobj       B-nam_org_company\n",
+      "ani             ani             CCONJ               7 cc         O              \n",
+      "Intercity       Intercity       PROPN               5 conj       O              \n",
+      ".               .               PUNCT               2 punct      O              \n"
+     ]
+    }
+   ],
+   "source": [
+    "example = \"Czy wiesz, jak dojechać do Środy albo do Piotrkowa Trybunalskiego? Jeśli nie wiesz, to zapytaj Marka Strusia albo sprawdź w mapie Google. Nie dojedziesz do celu PKS-em ani Intercity.\"\n",
+    "prediction = c(example)\n",
+    "\n",
+    "print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format('TOKEN', 'LEMMA', 'UPOS', 'HEAD', 'DEPREL', \"NER_TAG\"))\n",
+    "for sentence in prediction:\n",
+    "    print(\"-\"*80)\n",
+    "    for token in sentence.tokens:\n",
+    "        print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format(token.text, token.lemma, token.upostag, token.head, token.deprel, token.ner_tag))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3972e889-935a-4f0f-b851-68a37b0c3c2d",
+   "metadata": {},
+   "source": [
+    "### Prediction on tokenized sentence"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "68f1c636-55d2-4206-a879-49a8e0eda15e",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "TOKEN           LEMMA           UPOS       HEAD       DEPREL     NER_TAG        \n",
+      "--------------------------------------------------------------------------------\n",
+      "Nie             nie             PART                2 advmod:neg O              \n",
+      "dojedziesz      dojechać        VERB                0 root       O              \n",
+      "do              do              ADP                 4 case       O              \n",
+      "celu            cel             NOUN                2 obl        O              \n",
+      "PKS-em          PKS             NOUN                2 iobj       B-nam_org_company\n",
+      "ani             ani             CCONJ               7 cc         O              \n",
+      "Intercity       Intercity       PROPN               5 conj       B-nam_pro_software\n",
+      ".               .               PUNCT               2 punct      O              \n"
+     ]
+    }
+   ],
+   "source": [
+    "example = [['Nie', 'dojedziesz', 'do', 'celu', 'PKS-em', 'ani', 'Intercity', '.']]\n",
+    "prediction = c(example)\n",
+    "\n",
+    "print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format('TOKEN', 'LEMMA', 'UPOS', 'HEAD', 'DEPREL', \"NER_TAG\"))\n",
+    "for sentence in prediction:\n",
+    "    print(\"-\"*80)\n",
+    "    for token in sentence.tokens:\n",
+    "        print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format(token.text, token.lemma, token.upostag, token.head, token.deprel, token.ner_tag))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "78d96be2-d8fa-4a9f-8af9-e12d0971c0a0",
+   "metadata": {},
+   "source": [
+    "### Prediction on list of senteces"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "8676b30d-54a7-478b-b188-e8407ca49601",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "TOKEN           LEMMA           UPOS       HEAD       DEPREL     NER_TAG        \n",
+      "--------------------------------------------------------------------------------\n",
+      "Czy             czy             PART                2 advmod     O              \n",
+      "wiesz           wiedzieć        VERB                0 root       O              \n",
+      ",               ,               PUNCT               5 punct      O              \n",
+      "jak             jak             ADV                 5 advmod     O              \n",
+      "dojechać        dojechać        VERB                2 xcomp      O              \n",
+      "do              do              ADP                 7 case       O              \n",
+      "Åšrody           Åšroda           PROPN               5 obl        B-nam_loc_gpe_city\n",
+      "albo            albo            CCONJ              10 cc         O              \n",
+      "do              do              ADP                10 case       O              \n",
+      "Piotrkowa       Piotrków        PROPN               7 conj       B-nam_loc_gpe_city\n",
+      "Trybunalskiego  trybunalski     ADJ                10 amod:flat  I-nam_loc_gpe_city\n",
+      "?               ?               PUNCT               2 punct      O              \n",
+      "--------------------------------------------------------------------------------\n",
+      "Jeśli           jeśli           SCONJ               3 mark       O              \n",
+      "nie             nie             PART                3 advmod:neg O              \n",
+      "wiesz           wiedzieć        VERB                6 advcl      O              \n",
+      ",               ,               PUNCT               6 punct      O              \n",
+      "to              to              SCONJ               6 mark       O              \n",
+      "zapytaj         zapytać         VERB                0 root       O              \n",
+      "Marka           Marek           PROPN               6 obj        B-nam_liv_person\n",
+      "Strusia         StruÅ›           PROPN               7 flat       I-nam_liv_person\n",
+      "albo            albo            CCONJ              10 cc         O              \n",
+      "sprawdź         sprawdzić       VERB                6 conj       O              \n",
+      "w               w               ADP                12 case       O              \n",
+      "mapie           mapa            NOUN               10 obl        O              \n",
+      "Google          Goog            PROPN              12 nmod       B-nam_pro_media_web\n",
+      ".               .               PUNCT               6 punct      O              \n"
+     ]
+    }
+   ],
+   "source": [
+    "example = [\"Czy wiesz, jak dojechać do Środy albo do Piotrkowa Trybunalskiego?\", \"Jeśli nie wiesz, to zapytaj Marka Strusia albo sprawdź w mapie Google.\"]\n",
+    "prediction = c(example)\n",
+    "\n",
+    "print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format('TOKEN', 'LEMMA', 'UPOS', 'HEAD', 'DEPREL', \"NER_TAG\"))\n",
+    "for sentence in prediction:\n",
+    "    print(\"-\"*80)\n",
+    "    for token in sentence.tokens:\n",
+    "        print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format(token.text, token.lemma, token.upostag, token.head, token.deprel, token.ner_tag))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "eaf81c8f-649b-4110-96a1-c43133feb11e",
+   "metadata": {},
+   "source": [
+    "### Using custom model"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d08d6dd7-b7c3-4f3b-8cc6-175d340dd2c1",
+   "metadata": {},
+   "source": [
+    "If you have trained your own model, you can pass the path to it as a ner_model parameter. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "25c6f47f-b698-49d4-acd7-d9a675a99e09",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "[2023-11-28 00:45:10 UTC Loading archive] Error while loading Training Data Loader: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html. Setting Data Loader to None\n",
+      "Exception ignored in: <function tqdm.__del__ at 0x000001970A82C1F0>\n",
+      "Traceback (most recent call last):\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\std.py\", line 1162, in __del__\n",
+      "    self.close()\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\notebook.py\", line 291, in close\n",
+      "    self.disp(bar_style='success', check_delay=False)\n",
+      "AttributeError: 'tqdm_notebook' object has no attribute 'disp'\n",
+      "[2023-11-28 00:45:10 UTC Loading archive] Error while loading Validation Data Loader: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html. Setting Data Loader to None\n",
+      "Exception ignored in: <function tqdm.__del__ at 0x000001970A82C1F0>\n",
+      "Traceback (most recent call last):\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\std.py\", line 1162, in __del__\n",
+      "    self.close()\n",
+      "  File \"C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\notebook.py\", line 291, in close\n",
+      "    self.disp(bar_style='success', check_delay=False)\n",
+      "AttributeError: 'tqdm_notebook' object has no attribute 'disp'\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Using model LAMBO-UD_Polish-PDB\n",
+      "Using model LAMBO-UD_Polish-PDB\n",
+      "Using model LAMBO-UD_Polish-PDB\n",
+      "Using model LAMBO-UD_Polish-PDB\n"
+     ]
+    }
+   ],
+   "source": [
+    "ner_model = r\"L:\\combo-lightning\\ner_disc_test\"\n",
+    "c = COMBO.from_pretrained(path=parser_model,\n",
+    "                          ner_model=ner_model)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "82c4d866-7dde-4657-a089-367bc0853987",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "TOKEN           LEMMA           UPOS       HEAD       DEPREL     NER_TAG        \n",
+      "--------------------------------------------------------------------------------\n",
+      "Czy             czy             PART                2 advmod     O              \n",
+      "wiesz           wiedzieć        VERB                0 root       O              \n",
+      ",               ,               PUNCT               5 punct      O              \n",
+      "jak             jak             ADV                 5 advmod     O              \n",
+      "dojechać        dojechać        VERB                2 xcomp      O              \n",
+      "do              do              ADP                 7 case       O              \n",
+      "Åšrody           Åšroda           PROPN               5 obl        B-nam_loc_gpe_city\n",
+      "albo            albo            CCONJ              10 cc         I-nam_loc_gpe_city\n",
+      "do              do              ADP                10 case       O              \n",
+      "Piotrkowa       Piotrków        PROPN               7 conj       B-nam_loc_gpe_city\n",
+      "Trybunalskiego  trybunalski     ADJ                10 amod:flat  I-nam_loc_gpe_city\n",
+      "?               ?               PUNCT               2 punct      O              \n",
+      "--------------------------------------------------------------------------------\n",
+      "Jeśli           jeśli           SCONJ               3 mark       O              \n",
+      "nie             nie             PART                3 advmod:neg O              \n",
+      "wiesz           wiedzieć        VERB                6 advcl      O              \n",
+      ",               ,               PUNCT               6 punct      O              \n",
+      "to              to              SCONJ               6 mark       O              \n",
+      "zapytaj         zapytać         VERB                0 root       O              \n",
+      "Marka           Marek           PROPN               6 obj        B-nam_liv_person\n",
+      "Strusia         StruÅ›           PROPN               7 flat       I-nam_liv_person\n",
+      "albo            albo            CCONJ              10 cc         O              \n",
+      "sprawdź         sprawdzić       VERB                6 conj       O              \n",
+      "w               w               ADP                12 case       O              \n",
+      "mapie           mapa            NOUN               10 obl        O              \n",
+      "Google          Goog            PROPN              12 nmod       B-nam_org_company\n",
+      ".               .               PUNCT               6 punct      O              \n",
+      "--------------------------------------------------------------------------------\n",
+      "Nie             nie             PART                2 advmod:neg O              \n",
+      "dojedziesz      dojechać        VERB                0 root       O              \n",
+      "do              do              ADP                 4 case       O              \n",
+      "celu            cel             NOUN                2 obl        O              \n",
+      "PKS-em          PKS             NOUN                2 iobj       B-nam_org_company\n",
+      "ani             ani             CCONJ               7 cc         O              \n",
+      "Intercity       Intercity       PROPN               5 conj       B-nam_org_company\n",
+      ".               .               PUNCT               2 punct      O              \n"
+     ]
+    }
+   ],
+   "source": [
+    "example = \"Czy wiesz, jak dojechać do Środy albo do Piotrkowa Trybunalskiego? Jeśli nie wiesz, to zapytaj Marka Strusia albo sprawdź w mapie Google. Nie dojedziesz do celu PKS-em ani Intercity.\"\n",
+    "prediction = c(example)\n",
+    "\n",
+    "print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format('TOKEN', 'LEMMA', 'UPOS', 'HEAD', 'DEPREL', \"NER_TAG\"))\n",
+    "for sentence in prediction:\n",
+    "    print(\"-\"*80)\n",
+    "    for token in sentence.tokens:\n",
+    "        print(\"{:15} {:15} {:10} {:10} {:10} {:15}\".format(token.text, token.lemma, token.upostag, token.head, token.deprel, token.ner_tag))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "combo_ner_integration",
+   "language": "python",
+   "name": "combo_ner_integration"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.18"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/NER_training.ipynb b/notebooks/NER_training.ipynb
new file mode 100644
index 0000000..21e21ce
--- /dev/null
+++ b/notebooks/NER_training.ipynb
@@ -0,0 +1,882 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "id": "ff9142be-4752-491b-bf9d-456763a2d7a5",
+   "metadata": {},
+   "source": [
+    "# NER model training"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "3d1ba70b-c57d-421c-9298-65b7a2f06ef7",
+   "metadata": {},
+   "source": [
+    "Specify model directory. There will be 4 files saved there: \n",
+    "- confg.json - json config file specifying model architecture\n",
+    "- char_to_id.json - mapping between characters and ids\n",
+    "- label_to_id.json - mapping between ner tag and ids\n",
+    "- best_model.ckpt - model weights"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a3009202-3e5d-4f1c-9b7a-016a3d8694d3",
+   "metadata": {},
+   "source": [
+    "To demonstrate how to do it we will use very small subset of NER dataset for Polish."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "id": "69f208e7-f717-4452-a60c-5730e7e48323",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pathlib import Path\n",
+    "serialization_directory = Path(\"./models/notebook_example\")"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "id": "fc9c342a-4e41-4c9b-b0ae-e6c460d17404",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\tqdm\\auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
+      "  from .autonotebook import tqdm as notebook_tqdm\n"
+     ]
+    }
+   ],
+   "source": [
+    "from combo.ner_modules.utils.utils import fix_common_warnings\n",
+    "fix_common_warnings()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "id": "8972f473-19e4-49c3-8365-5c59ec5a811d",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import torch \n",
+    "config = {\n",
+    "  \"data\": {\n",
+    "    \"path_data\" : r\".\\example_data\",\n",
+    "    \"use_char_level_embeddings\": True,\n",
+    "    \"use_start_end_token\": True,\n",
+    "    \"tokenize_entities\": True,\n",
+    "    \"batch_size\": 32,\n",
+    "    \"encoding\": \"utf-8\",\n",
+    "    \"num_workers\": 1\n",
+    "  },\n",
+    "\n",
+    "  \"model\": {\n",
+    "    \"bert_embedder\": {\n",
+    "        \"pretrained_model_name\": \"allegro/herbert-base-cased\",\n",
+    "        \"pretrained_model_type\": \"AutoModel\",\n",
+    "        \"projection_dimension\": None,\n",
+    "        \"freeze_bert\": True,\n",
+    "        \"token_pooling\": True,\n",
+    "        \"pooling_strategy\": \"max\"\n",
+    "                     },\n",
+    "    \"char_embedder\": {\"type\" : \"combo\",\n",
+    "                      \"char_embedding_dim\":  64\n",
+    "                     },\n",
+    "    \"classifier\": {\"type\" : \"vanilla\",\n",
+    "                   \"to_tag_space\" :  \"linear\"},\n",
+    "    \"dropout\": 0\n",
+    "            },\n",
+    "  \"loss\": \"ce\",\n",
+    "  \"learning_rate\": 0.0007585775750,\n",
+    "  \"callbacks\": {\"FixedProgressBar\": True},\n",
+    "  \"trainer\": {\n",
+    "          \"devices\" : [0],\n",
+    "          \"max_epochs\": 2,\n",
+    "          \"accelerator\": \"cuda\" if torch.cuda.is_available() else \"cpu\",\n",
+    "          \"log_every_n_steps\": 10}\n",
+    "}"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "41e3ec1a-661e-44a3-bb61-74b2477771a9",
+   "metadata": {},
+   "source": [
+    "# Training using config file"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a36614a6-8e76-4006-8c0b-3d704189a721",
+   "metadata": {},
+   "source": [
+    "## create vocabularies"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "id": "9f402941-42ea-47ed-a2e1-757aaa48d1f6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.data.utils import create_tag2id, create_char2id\n",
+    "from pathlib import Path"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "id": "aea6de16-4670-4e78-a3f7-0b2f667d8d68",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "char_to_id = create_char2id(file_path=Path(config[\"data\"][\"path_data\"]) / \"train.txt\", )\n",
+    "label_to_id = create_tag2id(file_path=Path(config[\"data\"][\"path_data\"]) / \"train.txt\",\n",
+    "                            encoding=config[\"data\"][\"encoding\"],\n",
+    "                            include_special_tokens=config[\"data\"][\"use_start_end_token\"])"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d71e974e-2f89-4a6b-aa77-31908ad28a6d",
+   "metadata": {},
+   "source": [
+    "## create tokenizer"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "id": "83529f2e-34bb-4d42-9378-cec4e2e84c83",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.utils.constructors import construct_tokenizer_from_config"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "id": "efb8125c-7b0a-4701-8d67-ae238874b8f4",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Using model LAMBO-UD_Polish-PDB\n"
+     ]
+    }
+   ],
+   "source": [
+    "tokenizer = construct_tokenizer_from_config(config=config,\n",
+    "                                            char_to_id_map=char_to_id,\n",
+    "                                            label_to_id_map=label_to_id)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4eba05f3-0847-45f6-8d8e-98222b0aee8e",
+   "metadata": {},
+   "source": [
+    "## create pytorch lightning datamodule"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "id": "8f643dd5-279b-4e29-b6db-abf65e282741",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.utils.constructors import construct_data_module_from_config\n",
+    "data_module = construct_data_module_from_config(config=config,\n",
+    "                                                tokenizer=tokenizer)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "e9df229a-ef28-4453-b188-ce62221523b6",
+   "metadata": {},
+   "source": [
+    "## create loss"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "id": "fa9235de-fddd-4343-a0d6-fef35e180b3f",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.utils.constructors import construct_loss_from_config"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "id": "0183ecab-56a1-40e5-ab6f-52c2652cf2b9",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "loss = construct_loss_from_config(config=config,\n",
+    "                                  label_to_id=label_to_id)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "a9cebfb2-e570-4fa1-a100-c1cd07eeab55",
+   "metadata": {},
+   "source": [
+    "## saving data to serialization directory"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "id": "d80fff2a-089e-4fa0-b14b-0c6b2037b88e",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "serialization_directory.mkdir(parents=True, exist_ok=True)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "id": "ff58efd1-9341-4ac3-b381-512784f1f3fe",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import json\n",
+    "with open(serialization_directory / \"char_to_id.json\", \"w+\") as f:\n",
+    "    json.dump(char_to_id, f)\n",
+    "\n",
+    "with open(serialization_directory / \"label_to_id.json\", \"w+\") as f:\n",
+    "    json.dump(label_to_id, f)\n",
+    "\n",
+    "with open(serialization_directory / \"config.json\", \"w+\") as f:\n",
+    "    json.dump(config, f)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "8f44ea8a-010f-40df-bc68-5403631b0c01",
+   "metadata": {},
+   "source": [
+    "## creating model instance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "id": "aea14060-0844-4178-954e-407cab7f00a5",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.NerModel import NerModel "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "id": "5ba60867-3187-4b39-a79a-5b4e4077944b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model = NerModel(loss_fn=loss,\n",
+    "                 char_to_id_map=char_to_id,\n",
+    "                 label_to_id_map=label_to_id,\n",
+    "                 config=config)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "4e7d6b32-b256-4a50-bc7e-f0ad00c067e9",
+   "metadata": {},
+   "source": [
+    "## training"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "id": "d93dc81c-e148-4f5d-b8f4-b6f8a80ccf5b",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import pytorch_lightning as pl\n",
+    "from combo.ner_modules.utils.constructors import construct_callbacks_from_config"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "id": "6f91e688-d197-41b5-b929-0925af024846",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "GPU available: True (cuda), used: True\n",
+      "TPU available: False, using: 0 TPU cores\n",
+      "IPU available: False, using: 0 IPUs\n",
+      "HPU available: False, using: 0 HPUs\n",
+      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n",
+      "\n",
+      "  | Name          | Type              | Params\n",
+      "----------------------------------------------------\n",
+      "0 | bert_embedder | BertEmbedder      | 124 M \n",
+      "1 | char_embedder | ComboCharEmbedder | 546 K \n",
+      "2 | classifier    | VanillaClassifier | 65.8 K\n",
+      "3 | dropout       | Dropout           | 0     \n",
+      "4 | loss_fn       | CrossEntropyLoss  | 0     \n",
+      "----------------------------------------------------\n",
+      "612 K     Trainable params\n",
+      "124 M     Non-trainable params\n",
+      "125 M     Total params\n",
+      "500.223   Total estimated model params size (MB)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch 0: 100%|█████████████████████████████████████████████| 20/20 [00:19<00:00,  1.03it/s, v_num=11, train_loss=1.200]\n",
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:19<00:00,  1.03it/s, v_num=11, train_loss=0.630, validation_loss=0.480, validation_precision\n",
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:23<00:00,  1.17s/it, v_num=11, train_loss=0.630, validation_loss=0.251, validation_precision"
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "`Trainer.fit` stopped: `max_epochs=2` reached.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:28<00:00,  1.43s/it, v_num=11, train_loss=0.630, validation_loss=0.251, validation_precision\n"
+     ]
+    }
+   ],
+   "source": [
+    "params = config[\"trainer\"]\n",
+    "params[\"callbacks\"] = construct_callbacks_from_config(config.get(\"callbacks\", {}))\n",
+    "params[\"default_root_dir\"] = serialization_directory\n",
+    "trainer = pl.Trainer(**params)\n",
+    "\n",
+    "# start training\n",
+    "trainer.fit(model,\n",
+    "            datamodule=data_module)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "74a69251-7df3-474d-96de-59caaf41467b",
+   "metadata": {},
+   "source": [
+    "## Evaluate on test data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "id": "b659848a-53ad-4367-87db-4d9f6f69fbb6",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Restoring states from the checkpoint path at models\\notebook_example\\lightning_logs\\version_11\\checkpoints\\epoch=2-step=40.ckpt\n",
+      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n",
+      "Loaded model weights from the checkpoint at models\\notebook_example\\lightning_logs\\version_11\\checkpoints\\epoch=2-step=40.ckpt\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Testing: 0it [00:00, ?it/s]                      precision    recall  f1-score   support\n",
+      "\n",
+      "     nam_adj_country       1.00      0.00      0.00         3\n",
+      "      nam_liv_person       1.00      0.00      0.00         3\n",
+      "    nam_loc_gpe_city       1.00      0.00      0.00         1\n",
+      " nam_loc_gpe_country       1.00      0.00      0.00         8\n",
+      "     nam_org_company       1.00      0.00      0.00        10\n",
+      "      nam_org_nation       1.00      0.00      0.00         3\n",
+      "nam_org_organization       1.00      0.00      0.00         3\n",
+      "    nam_oth_currency       1.00      0.00      0.00         2\n",
+      "        nam_oth_tech       1.00      0.00      0.00         5\n",
+      "       nam_pro_brand       1.00      0.00      0.00         2\n",
+      "    nam_pro_software       1.00      0.00      0.00        37\n",
+      "\n",
+      "           micro avg       1.00      0.00      0.00        77\n",
+      "           macro avg       1.00      0.00      0.00        77\n",
+      "        weighted avg       1.00      0.00      0.00        77\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">           epoch           </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            3.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">          test_f1          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            0.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">      test_precision       </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            1.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">        test_recall        </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            0.0            </span>│\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│\u001b[36m \u001b[0m\u001b[36m          epoch          \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           3.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m         test_f1         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           0.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m     test_precision      \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           1.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m       test_recall       \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           0.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "└───────────────────────────┴───────────────────────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "results = trainer.test(verbose=True,\n",
+    "                       ckpt_path='best',\n",
+    "                        datamodule=data_module)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "033aac6e-1747-4b39-9956-1cafebb04b6b",
+   "metadata": {},
+   "source": [
+    "# Training using as little config file as possible"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "6099ba5d-5702-45b9-a7af-d79945b06d33",
+   "metadata": {},
+   "source": [
+    "## create vocabularies"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "id": "a7ff832e-2fc8-4fba-95b4-416c169779b0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.data.utils import create_tag2id, create_char2id\n",
+    "from pathlib import Path"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "id": "3c86f465-998e-4949-8b11-547ed83c3deb",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "training_data_path = Path(r\".\\example_data\\train.txt\") \n",
+    "char_to_id = create_char2id(file_path=training_data_path)\n",
+    "label_to_id = create_tag2id(file_path=training_data_path,\n",
+    "                            encoding=\"utf-8\",\n",
+    "                            include_special_tokens=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "79e1507c-e0e6-42e9-ac30-c899edafaa59",
+   "metadata": {},
+   "source": [
+    "## create tokenizer"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "id": "a6d3cfed-266d-487c-a2d8-82a154bcc5b6",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.data.NerTokenizer import NerTokenizer"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "id": "aedfd9ae-52e7-447e-a70a-7cf3f1d8ca79",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Using model LAMBO-UD_Polish-PDB\n"
+     ]
+    }
+   ],
+   "source": [
+    "tokenizer = NerTokenizer(pretrained_model_type=\"AutoModel\",\n",
+    "                         pretrained_model_name=\"allegro/herbert-base-cased\",\n",
+    "                         char_to_id_map=char_to_id,\n",
+    "                         label_to_id_map=label_to_id,\n",
+    "                         use_char_level_embeddings=True,\n",
+    "                         use_start_end_token=True,\n",
+    "                         tokenize_entities=True)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "7a021776-2a19-4c9c-9dd1-b113fac8cdd4",
+   "metadata": {},
+   "source": [
+    "## create pytorch lightning datamodule"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "id": "4e5374a1-d83f-4cb6-8bd4-ac95ebb75886",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.NerDataModule import NerDataModule"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "id": "8793da2d-39a7-49e0-85c1-56e9761725be",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data_path = Path(r\".\\example_data\") \n",
+    "data_module = NerDataModule(path_data=data_path,\n",
+    "                            tokenizer=tokenizer,\n",
+    "                            batch_size=32,\n",
+    "                            encoding=\"utf-8\",\n",
+    "                            num_workers=1)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "20a27e33-103e-406d-b621-a47546483389",
+   "metadata": {},
+   "source": [
+    "## create losss function"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "id": "556d2b85-2e16-4488-90c8-a3cbc6452c61",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import torch"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "id": "9accfeae-9f16-4b0b-8113-1e2352ebebd8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "loss = torch.nn.CrossEntropyLoss()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1a8a90aa-100b-4ed8-b5c5-5f02ddf770c5",
+   "metadata": {},
+   "source": [
+    "## create model instance"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 27,
+   "id": "df74c687-d1d7-4805-ae13-456fb117e1f8",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.NerModel import NerModel"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "d57fa876-b467-404b-ab1d-095a9961310a",
+   "metadata": {},
+   "source": [
+    "Minimal config should contain information about model architecture, learning rate and whether to use start and end tokens as well as whether to use character level embeddings"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "id": "a9941c27-8bb5-4e8d-b9a5-f9a66cae4dad",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "config = {\n",
+    "  \"data\": {\n",
+    "    \"use_char_level_embeddings\": True,\n",
+    "    \"use_start_end_token\": True},\n",
+    "    \n",
+    "  \"model\": {\n",
+    "    \"bert_embedder\": {\n",
+    "        \"pretrained_model_name\": \"allegro/herbert-base-cased\",\n",
+    "        \"pretrained_model_type\": \"AutoModel\",\n",
+    "        \"projection_dimension\": None,\n",
+    "        \"freeze_bert\": True,\n",
+    "        \"token_pooling\": True,\n",
+    "        \"pooling_strategy\": \"max\"\n",
+    "                     },\n",
+    "    \"char_embedder\": {\"type\" : \"combo\",\n",
+    "                      \"char_embedding_dim\":  64\n",
+    "                     },\n",
+    "    \"classifier\": {\"type\" : \"vanilla\",\n",
+    "                   \"to_tag_space\" :  \"linear\"},\n",
+    "    \"dropout\": 0\n",
+    "            },\n",
+    "    \"learning_rate\": 0.0007585775750}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "id": "5eb269ee-7b5d-48a9-b0f1-4695741625a1",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "model = NerModel(loss_fn=loss,\n",
+    "                 char_to_id_map=char_to_id,\n",
+    "                 label_to_id_map=label_to_id,\n",
+    "                 config=config)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "1a5da2da-2945-4489-98b1-9e5d472ab06d",
+   "metadata": {},
+   "source": [
+    "## train"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 30,
+   "id": "65c97e08-9740-4943-8498-02747e3d53d0",
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from combo.ner_modules.callbacks.FixedProgressBar import FixedProgressBar\n",
+    "import pytorch_lightning as pl"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 31,
+   "id": "02c4c729-e763-4f25-94b8-4166a0e1c231",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "GPU available: True (cuda), used: True\n",
+      "TPU available: False, using: 0 TPU cores\n",
+      "IPU available: False, using: 0 IPUs\n",
+      "HPU available: False, using: 0 HPUs\n",
+      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n",
+      "\n",
+      "  | Name          | Type              | Params\n",
+      "----------------------------------------------------\n",
+      "0 | bert_embedder | BertEmbedder      | 124 M \n",
+      "1 | char_embedder | ComboCharEmbedder | 546 K \n",
+      "2 | classifier    | VanillaClassifier | 65.8 K\n",
+      "3 | dropout       | Dropout           | 0     \n",
+      "4 | loss_fn       | CrossEntropyLoss  | 0     \n",
+      "----------------------------------------------------\n",
+      "612 K     Trainable params\n",
+      "124 M     Non-trainable params\n",
+      "125 M     Total params\n",
+      "500.223   Total estimated model params size (MB)\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "                                                                                                                       "
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "C:\\Users\\lpsze\\anaconda3\\envs\\combo_ner_integration\\lib\\site-packages\\pytorch_lightning\\loops\\fit_loop.py:281: PossibleUserWarning: The number of training batches (20) is smaller than the logging interval Trainer(log_every_n_steps=50). Set a lower value for log_every_n_steps if you want to see logs for the training epoch.\n",
+      "  rank_zero_warn(\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch 0: 100%|██████████████████████████████████████████████| 20/20 [00:19<00:00,  1.05it/s, v_num=0, train_loss=1.020]\n",
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:19<00:00,  1.03it/s, v_num=0, train_loss=0.128, validation_loss=0.448, validation_precision=\n",
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:23<00:00,  1.17s/it, v_num=0, train_loss=0.128, validation_loss=0.256, validation_precision="
+     ]
+    },
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "`Trainer.fit` stopped: `max_epochs=2` reached.\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Epoch 1: 100%|â–ˆ| 20/20 [00:28<00:00,  1.42s/it, v_num=0, train_loss=0.128, validation_loss=0.256, validation_precision=\n"
+     ]
+    }
+   ],
+   "source": [
+    "callbacks = [FixedProgressBar()]\n",
+    "trainer = pl.Trainer(devices = [0],\n",
+    "                     accelerator=\"cuda\",\n",
+    "                     max_epochs=2,\n",
+    "                     callbacks=callbacks)\n",
+    "trainer.fit(model,\n",
+    "            datamodule=data_module)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "id": "5367be2f-83dc-41fe-9b73-7051abb7b5d9",
+   "metadata": {},
+   "source": [
+    "## evaluate on test data"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 32,
+   "id": "5ffc539c-d4b1-4ba1-8876-de65cafa1cf9",
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "Restoring states from the checkpoint path at L:\\combo-lightning\\docs\\ner_docs\\lightning_logs\\version_0\\checkpoints\\epoch=2-step=40.ckpt\n",
+      "LOCAL_RANK: 0 - CUDA_VISIBLE_DEVICES: [0,1]\n",
+      "Loaded model weights from the checkpoint at L:\\combo-lightning\\docs\\ner_docs\\lightning_logs\\version_0\\checkpoints\\epoch=2-step=40.ckpt\n"
+     ]
+    },
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Testing: 0it [00:00, ?it/s]                      precision    recall  f1-score   support\n",
+      "\n",
+      "     nam_adj_country       1.00      0.00      0.00         3\n",
+      "      nam_liv_person       1.00      0.00      0.00         3\n",
+      "    nam_loc_gpe_city       1.00      0.00      0.00         1\n",
+      " nam_loc_gpe_country       1.00      0.00      0.00         8\n",
+      "     nam_org_company       1.00      0.00      0.00        10\n",
+      "      nam_org_nation       1.00      0.00      0.00         3\n",
+      "nam_org_organization       1.00      0.00      0.00         3\n",
+      "    nam_oth_currency       1.00      0.00      0.00         2\n",
+      "        nam_oth_tech       1.00      0.00      0.00         5\n",
+      "       nam_pro_brand       1.00      0.00      0.00         2\n",
+      "    nam_pro_software       1.00      0.00      0.00        37\n",
+      "\n",
+      "           micro avg       1.00      0.00      0.00        77\n",
+      "           macro avg       1.00      0.00      0.00        77\n",
+      "        weighted avg       1.00      0.00      0.00        77\n",
+      "\n"
+     ]
+    },
+    {
+     "data": {
+      "text/html": [
+       "<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃<span style=\"font-weight: bold\">        Test metric        </span>┃<span style=\"font-weight: bold\">       DataLoader 0        </span>┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">           epoch           </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            3.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">          test_f1          </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            0.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">      test_precision       </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            1.0            </span>│\n",
+       "│<span style=\"color: #008080; text-decoration-color: #008080\">        test_recall        </span>│<span style=\"color: #800080; text-decoration-color: #800080\">            0.0            </span>│\n",
+       "└───────────────────────────┴───────────────────────────┘\n",
+       "</pre>\n"
+      ],
+      "text/plain": [
+       "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n",
+       "┃\u001b[1m \u001b[0m\u001b[1m       Test metric       \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m      DataLoader 0       \u001b[0m\u001b[1m \u001b[0m┃\n",
+       "┡━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n",
+       "│\u001b[36m \u001b[0m\u001b[36m          epoch          \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           3.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m         test_f1         \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           0.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m     test_precision      \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           1.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "│\u001b[36m \u001b[0m\u001b[36m       test_recall       \u001b[0m\u001b[36m \u001b[0m│\u001b[35m \u001b[0m\u001b[35m           0.0           \u001b[0m\u001b[35m \u001b[0m│\n",
+       "└───────────────────────────┴───────────────────────────┘\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "reults = trainer.test(verbose=True,\n",
+    "                      ckpt_path='best',\n",
+    "                      datamodule=data_module)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "combo_ner_integration",
+   "language": "python",
+   "name": "combo_ner_integration"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.9.18"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/notebooks/example_data/dev.txt b/notebooks/example_data/dev.txt
new file mode 100644
index 0000000..eda7895
--- /dev/null
+++ b/notebooks/example_data/dev.txt
@@ -0,0 +1,2515 @@
+# sent_id = 100
+Konferencja O
+jest O
+organizowana O
+pod O
+patronatem O
+Minister B-nam_org_institution
+Nauki I-nam_org_institution
+i I-nam_org_institution
+Szkolnictwa I-nam_org_institution
+Wyższego I-nam_org_institution
+, O
+Profesor O
+Barbary B-nam_liv_person
+Kudryckiej I-nam_liv_person
+, O
+PrzewodniczÄ…cej O
+KRASP B-nam_org_organization
+, O
+Profesor O
+Katarzyny B-nam_liv_person
+Chałasińskiej I-nam_liv_person
+- I-nam_liv_person
+Macukow I-nam_liv_person
+oraz O
+Prezesa O
+PAN B-nam_org_organization
+, O
+Profesora O
+Michała B-nam_liv_person
+Kleibera I-nam_liv_person
+. O
+
+# sent_id = 101
+Miejsce O
+: O
+Sala B-nam_fac_goe
+Senatu I-nam_fac_goe
+, O
+Pałac B-nam_fac_goe
+Kazimierzowski I-nam_fac_goe
+, O
+główny O
+kampus O
+Uniwersytetu B-nam_org_organization
+Warszawskiego I-nam_org_organization
+
+# sent_id = 102
+Termin O
+: O
+5 O
+maja O
+, O
+10 O
+. O
+00 O
+- O
+16 O
+. O
+30 O
+
+# sent_id = 103
+Udział O
+w O
+konferencji O
+jest O
+bezpłatny O
+. O
+
+# sent_id = 104
+Ze O
+względu O
+na O
+ograniczonÄ… O
+liczbÄ™ O
+miejsc O
+, O
+prosimy O
+o O
+zgłaszanie O
+udziału O
+w O
+konferencji O
+przez O
+wysłanie O
+listu O
+na O
+adres O
+kkrak O
+@ O
+icm O
+. O
+edu O
+. O
+pl O
+. O
+
+# sent_id = 105
+Program O
+konferencji O
+
+# sent_id = 106
+10 O
+. O
+00 O
+– O
+10 O
+. O
+30 O
+Otwarcie O
+konferencji O
+: O
+dr O
+Alek B-nam_liv_person
+Tarkowski I-nam_liv_person
+( O
+koordynator O
+, O
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+Polska I-nam_org_organization
+, O
+ICM B-nam_org_institution
+UW B-nam_org_organization
+) O
+
+# sent_id = 107
+10 O
+. O
+30 O
+– O
+12 O
+. O
+45 O
+Sesja O
+przedpołudniowa O
+: O
+przeglÄ…d B-nam_pro_title
+zagadnień I-nam_pro_title
+zwiÄ…zanych I-nam_pro_title
+z I-nam_pro_title
+otwartÄ… I-nam_pro_title
+naukÄ… I-nam_pro_title
+
+# sent_id = 108
+10 O
+. O
+30 O
+- O
+11 O
+. O
+00 O
+: O
+dr O
+Ignasi B-nam_liv_person
+Labastida I-nam_liv_person
+i I-nam_liv_person
+Juan I-nam_liv_person
+( O
+Uniwersytet B-nam_org_organization
+Barceloński I-nam_org_organization
+, O
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+Catalonia I-nam_org_organization
+) O
+– O
+W B-nam_pro_title
+stronÄ™ I-nam_pro_title
+otwartości I-nam_pro_title
+. I-nam_pro_title
+Doświadczenia I-nam_pro_title
+biblioteki I-nam_pro_title
+uniwersyteckiej I-nam_pro_title
+. O
+
+# sent_id = 109
+11 O
+. O
+00 O
+- O
+11 O
+. O
+30 O
+: O
+dr O
+Ahrash B-nam_liv_person
+Bissell I-nam_liv_person
+( O
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+Learn I-nam_org_organization
+, O
+USA B-nam_loc_gpe_country
+) O
+– O
+Edukacja B-nam_pro_title
+dla I-nam_pro_title
+innowacji I-nam_pro_title
+– I-nam_pro_title
+z I-nam_pro_title
+pomocÄ… I-nam_pro_title
+Creative I-nam_pro_title
+Commons I-nam_pro_title
+. O
+
+# sent_id = 110
+11 O
+. O
+30 O
+- O
+11 O
+. O
+40 O
+: O
+przerwa O
+na O
+kawÄ™ O
+
+# sent_id = 111
+11 O
+. O
+40 O
+- O
+12 O
+. O
+10 O
+: O
+Paweł B-nam_liv_person
+Szczęsny I-nam_liv_person
+( O
+Zakład B-nam_org_institution
+Bioinformatyki I-nam_org_institution
+Instytutu B-nam_org_institution
+Biochemii I-nam_org_institution
+i I-nam_org_institution
+Biofizyki I-nam_org_institution
+PAN B-nam_org_organization
+, O
+Wydział B-nam_org_institution
+Biologii I-nam_org_institution
+UW B-nam_org_organization
+) O
+– O
+Nauka B-nam_pro_title
+2 I-nam_pro_title
+. I-nam_pro_title
+0 I-nam_pro_title
+
+# sent_id = 112
+12 O
+. O
+10 O
+- O
+12 O
+. O
+30 O
+: O
+Dyskusja O
+
+# sent_id = 113
+12 O
+. O
+30 O
+- O
+12 O
+. O
+45 O
+: O
+Prezentacja O
+projektu O
+“ O
+Otwórz B-nam_eve_human
+książkę I-nam_eve_human
+” O
+
+# sent_id = 114
+12 O
+. O
+45 O
+- O
+13 O
+. O
+45 O
+Przerwa O
+obiadowa O
+
+# sent_id = 115
+13 O
+. O
+45 O
+- O
+14 O
+. O
+45 O
+Sesja O
+popołudniowa O
+: O
+otwarta B-nam_pro_title
+nauka I-nam_pro_title
+w I-nam_pro_title
+Polsce I-nam_pro_title
+
+# sent_id = 116
+13 O
+. O
+45 O
+- O
+14 O
+. O
+05 O
+prof O
+. O
+Marek B-nam_liv_person
+Niezgódka I-nam_liv_person
+( O
+Dyrektor O
+Interdyscyplinarnego B-nam_org_institution
+Centrum I-nam_org_institution
+Modelowania I-nam_org_institution
+Matematycznego I-nam_org_institution
+i I-nam_org_institution
+Komputerowego I-nam_org_institution
+, O
+Uniwersytet B-nam_org_organization
+Warszawski I-nam_org_organization
+) O
+
+# sent_id = 117
+14 O
+. O
+05 O
+- O
+14 O
+. O
+25 O
+: O
+Krzysztof B-nam_liv_person
+Siewicz I-nam_liv_person
+( O
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+Polska I-nam_org_organization
+, O
+Kancelaria B-nam_org_company
+prawna I-nam_org_company
+Grynhoff I-nam_org_company
+, I-nam_org_company
+Woźny I-nam_org_company
+, I-nam_org_company
+Maliński I-nam_org_company
+) O
+: O
+Prawne B-nam_pro_title
+aspekty I-nam_pro_title
+otwartej I-nam_pro_title
+nauki I-nam_pro_title
+
+# sent_id = 118
+14 O
+. O
+25 O
+- O
+14 O
+. O
+40 O
+: O
+dr O
+Jan B-nam_liv_person
+Kozłowski I-nam_liv_person
+( O
+Centrum B-nam_org_institution
+Badań I-nam_org_institution
+Polityki I-nam_org_institution
+Naukowej I-nam_org_institution
+i I-nam_org_institution
+Szkolnictwa I-nam_org_institution
+Wyższego I-nam_org_institution
+UW B-nam_org_organization
+) O
+: O
+Alternatywne B-nam_pro_title
+formy I-nam_pro_title
+peer I-nam_pro_title
+review I-nam_pro_title
+
+# sent_id = 119
+14 O
+. O
+45 O
+- O
+15 O
+. O
+00 O
+Przerwa O
+na O
+kawÄ™ O
+
+# sent_id = 120
+15 O
+. O
+00 O
+- O
+16 O
+. O
+30 O
+Debata O
+panelowa O
+: O
+jak B-nam_pro_title
+wprowadzić I-nam_pro_title
+otwartÄ… I-nam_pro_title
+naukÄ™ I-nam_pro_title
+do I-nam_pro_title
+Polski I-nam_pro_title
+? I-nam_pro_title
+
+# sent_id = 121
+Prowadzenie O
+: O
+Edwin B-nam_liv_person
+Bendyk I-nam_liv_person
+( O
+” O
+Polityka O
+” O
+, O
+Collegium B-nam_org_organization
+Civitas I-nam_org_organization
+) O
+
+# sent_id = 122
+Zaproszeni O
+uczestnicy O
+: O
+Krzysztof B-nam_liv_person
+Gulda I-nam_liv_person
+( O
+Dyrektor O
+, O
+Departament B-nam_org_institution
+Strategii I-nam_org_institution
+i I-nam_org_institution
+Rozwoju I-nam_org_institution
+Nauki I-nam_org_institution
+MNiSW B-nam_org_institution
+) O
+, O
+Juliusz B-nam_liv_person
+Braun I-nam_liv_person
+( O
+Dyrektor O
+, O
+Departament B-nam_org_institution
+Strategii I-nam_org_institution
+i I-nam_org_institution
+Analiz I-nam_org_institution
+MKiDN B-nam_org_institution
+) O
+, O
+Prof O
+. O
+Marek B-nam_liv_person
+Niezgódka I-nam_liv_person
+( O
+Dyrektor O
+, O
+Interdyscyplinarne B-nam_org_institution
+Centrum I-nam_org_institution
+Modelowania I-nam_org_institution
+Matematycznego I-nam_org_institution
+i I-nam_org_institution
+Komputerowego I-nam_org_institution
+, O
+Uniwersytet B-nam_org_organization
+Warszawski I-nam_org_organization
+) O
+, O
+Paweł B-nam_liv_person
+Szczęsny I-nam_liv_person
+( O
+Zakład B-nam_org_institution
+Bioinformatyki I-nam_org_institution
+Instytutu B-nam_org_institution
+Biochemii I-nam_org_institution
+i I-nam_org_institution
+Biofizyki I-nam_org_institution
+PAN B-nam_org_organization
+, O
+Wydział B-nam_org_institution
+Biologii I-nam_org_institution
+UW B-nam_org_organization
+) O
+. O
+
+# sent_id = 367
+Zwolennicy O
+Kondratiewowskiego O
+determinizmu O
+skupujÄ… O
+złoto O
+, O
+keynesiści O
+drukujÄ… O
+pieniÄ…dze O
+, O
+pozostałe O
+przy O
+życiu O
+banki O
+zapewne O
+poszukujÄ… O
+nowych O
+statystyków O
+, O
+może O
+ich O
+specjaliści O
+od O
+stochastyki O
+siÄ™ O
+jednak O
+pomylili O
+, O
+a O
+inni O
+już O
+na O
+pewno O
+przewidzÄ… O
+wszystko O
+właściwie O
+. O
+
+# sent_id = 368
+Ekonomia O
+była O
+z O
+założenia O
+naukÄ… O
+społeczną O
+. O
+
+# sent_id = 369
+Opisywała O
+i O
+analizowała O
+, O
+była O
+naukÄ… O
+empirycznÄ… O
+i O
+raczej O
+wszechstronnÄ… O
+. O
+
+# sent_id = 370
+Wszechstronność O
+czasem O
+wychodziła O
+bokiem O
+, O
+nadmierny O
+zapał O
+filozoficzny O
+nie O
+ułatwia O
+analizy O
+, O
+w O
+przeciwieństwie O
+do O
+czystego O
+i O
+eleganckiego O
+wzoru O
+matematycznego O
+. O
+
+# sent_id = 371
+Ścisłe O
+metody O
+okazały O
+siÄ™ O
+idealnie O
+dopasowane O
+do O
+prostych O
+założeń O
+ekonomii O
+, O
+a O
+im O
+większy O
+postęp O
+dokonywał O
+siÄ™ O
+w O
+matematyce O
+, O
+tym O
+bardziej O
+skomplikowane O
+problemy O
+ekonomiczne O
+można O
+było O
+tłumaczyć O
+w O
+sposób O
+" O
+ścisły O
+" O
+. O
+
+# sent_id = 372
+W O
+końcu O
+doszło O
+do O
+tego O
+, O
+że O
+model O
+matematyczny O
+stał O
+siÄ™ O
+podstawÄ… O
+każdej O
+analizy O
+. O
+
+# sent_id = 373
+Wszystko O
+zaczęto O
+sprowadzać O
+do O
+funkcji O
+, O
+wzór O
+i O
+jego O
+opis O
+stał O
+siÄ™ O
+kanonem O
+artykułu O
+z O
+ekonomii O
+. O
+
+# sent_id = 374
+Analiza O
+przyczyn O
+, O
+których O
+nie O
+da O
+siÄ™ O
+ująć O
+w O
+sposób O
+statystyczny O
+zaczęła O
+zanikać O
+. O
+
+# sent_id = 375
+Narzędzia O
+, O
+które O
+miały O
+być O
+tylko O
+pomocÄ… O
+, O
+stały O
+siÄ™ O
+celem O
+samym O
+w O
+sobie O
+. O
+
+# sent_id = 376
+Ekonomia O
+stała O
+siÄ™ O
+naukÄ… O
+o O
+modelach O
+, O
+modelach O
+dopasowanych O
+do O
+danych O
+z O
+przeszłości O
+. O
+
+# sent_id = 377
+Jeśli O
+model O
+nie O
+przewidywał O
+skutecznie O
+przyszłości O
+, O
+tym O
+gorzej O
+dla O
+przyszłości O
+, O
+zawsze O
+znalazł O
+siÄ™ O
+ekonomista O
+- O
+matematyk O
+, O
+który O
+dodał O
+do O
+modelu O
+coÅ› O
+nowego O
+, O
+co O
+uzasadniło O
+jego O
+stosowanie O
+na O
+dalsze O
+lata O
+. O
+
+# sent_id = 378
+Ekonomiści O
+prędzej O
+potrafili O
+by O
+wytłumaczyć O
+teoriÄ™ O
+strun O
+niż O
+społeczne O
+skutki O
+kryzysu O
+paliwowego O
+. O
+
+# sent_id = 379
+Wielkie O
+obliczenia O
+nie O
+sprawdziły O
+siÄ™ O
+w O
+przypadku O
+całych O
+systemów O
+ekonomicznych O
+, O
+które O
+planowały O
+przyszłość O
+i O
+ślepo O
+te O
+plany O
+realizowały O
+. O
+
+# sent_id = 380
+Kryzys O
+dowodzi O
+, O
+że O
+nie O
+sprawdziły O
+siÄ™ O
+też O
+w O
+skali O
+przedsiębiorstw O
+. O
+
+# sent_id = 381
+Czemu O
+jednak O
+siÄ™ O
+dziwić O
+- O
+większość O
+ogłoszeń O
+z O
+ofertami O
+pracy O
+dla O
+" O
+analityków O
+ekonomicznych O
+" O
+wymaga O
+wykształcenia O
+w O
+dziedzinie O
+" O
+matematyki O
+, O
+matematyki O
+stosowanej O
+lub O
+ekonometrii O
+" O
+. O
+
+# sent_id = 382
+W O
+takiej O
+kolejności O
+i O
+bez O
+ekonomii O
+. O
+
+# sent_id = 383
+Tymczasem O
+teraz O
+, O
+ci O
+wszyscy O
+matematycy O
+sięgają O
+po O
+wyjaśnienia O
+raczej O
+filozoficzne O
+. O
+
+# sent_id = 384
+Przecież O
+" O
+po O
+każdej O
+hossie O
+nadchodzi O
+bessa O
+" O
+. O
+
+# sent_id = 408
+GÅ‚owi O
+siÄ™ O
+taki O
+Benkler B-nam_liv_person
+, O
+jak O
+tu O
+pomóc O
+biednym O
+krajom O
+w O
+tworzeniu O
+odpowiednich O
+roślin O
+, O
+wymyśla O
+peer O
+production O
+, O
+dzielenie O
+siÄ™ O
+licencjami O
+przez O
+uniwersytety O
+, O
+udostępnianie O
+nasion O
+, O
+które O
+i O
+tak O
+siÄ™ O
+na O
+nic O
+krajom O
+rozwiniętym O
+nie O
+przydadzÄ… O
+, O
+a O
+tymczasem O
+władze O
+Wrocławia B-nam_loc_gpe_city
+znalazły O
+nowy O
+, O
+lepszy O
+sposób O
+. O
+
+# sent_id = 409
+Obejmuje O
+on O
+płacenie O
+wiedzÄ… O
+za O
+głosy O
+krajów O
+biednych O
+niezbędne O
+do O
+organizacji O
+wielkich O
+imprez O
+. O
+
+# sent_id = 410
+Wrocławscy O
+naukowcy O
+z O
+Uniwersytetu B-nam_org_organization
+Przyrodniczego I-nam_org_organization
+opracowujÄ… O
+specjalne O
+odmiany O
+ziemniaków O
+dla O
+Madagaskaru B-nam_loc_gpe_country
+- O
+w O
+zamian O
+za O
+głos O
+tego O
+kraju O
+w O
+wyborach O
+organizatora O
+EXPO B-nam_eve_human
+2012 I-nam_eve_human
+. O
+
+# sent_id = 411
+Dotychczas O
+podobny O
+proces O
+miał O
+oczywiście O
+miejsce O
+- O
+chociaż O
+większość O
+krajów O
+bogatych O
+stawiała O
+raczej O
+na O
+rozdawanie O
+mercedesów B-nam_pro_brand
+, O
+wycieczek O
+lub O
+wiz O
+bezpośrednio O
+głosującym O
+, O
+zamiast O
+płacić O
+krajowi O
+, O
+z O
+którego O
+pochodzili O
+. O
+
+# sent_id = 412
+Teraz O
+jednak O
+można O
+ustanowić O
+specjalny O
+cennik O
+- O
+głos O
+na O
+letnie O
+igrzyska O
+- O
+zezwolenie O
+na O
+produkcjÄ™ O
+generyków O
+potrzebnych O
+w O
+leczeniu O
+AIDS B-nam_oth
+lub O
+podjęcie O
+prac O
+nad O
+szczepionkÄ… O
+na O
+malariÄ™ O
+, O
+igrzyska O
+zimowe O
+- O
+licencja O
+na O
+produkcjÄ™ O
+nasion O
+specjalnych O
+odmian O
+ryżu O
+lub O
+pszenicy O
+, O
+EXPO B-nam_eve_human
+- O
+specjalna O
+odmiana O
+ziemniaka O
+lub O
+kapusty O
+, O
+małe O
+EXPO B-nam_eve_human
+- O
+licencja O
+na O
+groszek O
+ozdobny O
+lub O
+sałatę O
+. O
+
+# sent_id = 413
+PIPRA O
+, O
+CGIAR O
+i O
+BIOS O
+przestanÄ… O
+być O
+potrzebne O
+, O
+jest O
+tyle O
+krajów O
+, O
+których O
+głosy O
+można O
+kupić O
+przed O
+każdą O
+ważną O
+imprezÄ… O
+( O
+a O
+można O
+przecież O
+wprowadzić O
+głosowanie O
+na O
+organizatorów O
+mistrzostw O
+świata O
+w O
+piłce O
+nożnej O
+itp O
+. O
+) O
+, O
+że O
+prace O
+nad O
+żywnością O
+i O
+lekami O
+w O
+krajach O
+rozwijajÄ…cych O
+siÄ™ O
+wreszcie O
+nabiorÄ… O
+tempa O
+. O
+
+# sent_id = 414
+Oczywiście O
+plan O
+Wrocławia B-nam_loc_gpe_city
+ma O
+słaby O
+punkt O
+- O
+ziemniaki O
+, O
+ziemniakami O
+, O
+ale O
+przedstawiciel O
+Madagaskaru B-nam_loc_gpe_country
+za O
+hyundaia B-nam_pro_brand
+może O
+przecież O
+pomylić O
+przyciski O
+. O
+. O
+. O
+
+# sent_id = 477
+ZresztÄ… O
+" O
+przeniesienie O
+do O
+sieci O
+" O
+nie O
+nastÄ…pi O
+, O
+tak O
+jak O
+nie O
+nastąpiło O
+" O
+przeniesienie O
+na O
+komputery O
+" O
+. O
+
+# sent_id = 478
+W O
+pewnym O
+momencie O
+ludzie O
+znajdÄ… O
+siÄ™ O
+w O
+sieci O
+, O
+mnóstwo O
+rzeczy O
+zostanie O
+offline O
+i O
+nigdy O
+siÄ™ O
+w O
+sieci O
+nie O
+znajdzie O
+. O
+
+# sent_id = 479
+Po O
+prostu O
+zaczniemy O
+używać O
+sieci O
+zamiast O
+dysku O
+- O
+już O
+teraz O
+pewnie O
+z O
+czegoÅ› O
+tam O
+każdy O
+korzysta O
+, O
+jak O
+nie O
+z O
+bramki O
+pocztowej O
+( O
+kiedyÅ› O
+większość O
+ludzi O
+jednak O
+używała O
+outlooków O
+itp O
+. O
+) O
+, O
+to O
+z O
+przeglÄ…darki O
+zdjęć O
+. O
+
+# sent_id = 480
+Przeniesienie O
+( O
+dla O
+mnie O
+) O
+zakłada O
+podjęcie O
+decyzji O
+o O
+zmianie O
+- O
+coÅ› O
+jak O
+przejście O
+między O
+systemami O
+operacyjnymi O
+. O
+
+# sent_id = 481
+W O
+przypadku O
+sieci O
+większość O
+ludzi O
+tego O
+nawet O
+nie O
+zauważy O
+. O
+
+# sent_id = 482
+W O
+sprawie O
+metki O
+. O
+
+# sent_id = 483
+Przeceniasz O
+te O
+podziały O
+, O
+bo O
+ich O
+reprezentanci O
+najgłośniej O
+krzyczÄ… O
+. O
+
+# sent_id = 484
+Większość O
+użytkowników O
+komputerów O
+nawet O
+nie O
+zauważy O
+, O
+jaki O
+masz O
+system O
+operacyjny O
+i O
+nie O
+zwraca O
+na O
+takie O
+szczegóły O
+żadnej O
+uwagi O
+. O
+
+# sent_id = 485
+Dopóki O
+sÄ… O
+w O
+stanie O
+znaleźć O
+ikonÄ™ O
+w O
+stylu O
+globu O
+/ O
+kompasu O
+/ O
+wielkiego O
+" O
+e O
+" O
+podpisanej O
+" O
+internet B-nam_oth_tech
+" O
+. O
+
+# sent_id = 486
+Tak O
+jak O
+dla O
+większości O
+ludzi O
+nie O
+jest O
+istotne O
+kto O
+zrobił O
+płytę O
+główną O
+, O
+pamięć O
+czy O
+dysk O
+twardy O
+, O
+może O
+wkrótce O
+nie O
+być O
+istotne O
+kto O
+zrobił O
+system O
+operacyjny O
+. O
+
+# sent_id = 487
+Oczywiście O
+marki O
+pozostanÄ… O
+i O
+dalej O
+będą O
+mieć O
+znaczenie O
+, O
+ale O
+na O
+innym O
+poziomie O
+. O
+
+# sent_id = 488
+Apple B-nam_org_company
+nie O
+jest O
+znany O
+z O
+produkcji O
+systemu O
+operacyjnego O
+, O
+ale O
+całych O
+rozwiązań O
+. O
+
+# sent_id = 489
+Microsoft B-nam_org_company
+dążył O
+do O
+tego O
+, O
+żeby O
+" O
+pecet O
+" O
+był O
+synonimem O
+komputera O
+z O
+Windowsem B-nam_pro_software
+( O
+po O
+angielsku O
+w O
+zasadzie O
+jest O
+) O
+i O
+to O
+może O
+okazać O
+siÄ™ O
+błędem O
+, O
+bo O
+coraz O
+więcej O
+firm O
+sprzedaje O
+pecety O
+z O
+Linuksem B-nam_pro_software
+( O
+np O
+. O
+Dell B-nam_org_company
+) O
+i O
+schizofrenia O
+siÄ™ O
+robi O
+. O
+
+# sent_id = 490
+Ciekawe O
+co O
+będzie O
+dalej O
+, O
+biurowa O
+wersja O
+xboksa O
+? O
+
+# sent_id = 491
+Nie O
+dość O
+, O
+że O
+browar O
+, O
+to O
+jeszcze O
+stary O
+. O
+
+# sent_id = 492
+Galeria O
+handlowo O
+- O
+artystyczna O
+w O
+Poznaniu B-nam_loc_gpe_city
+wzbogaciła O
+siÄ™ O
+o O
+serwerowniÄ™ O
+. O
+
+# sent_id = 493
+Znak O
+czasów O
+? O
+
+# sent_id = 494
+Do O
+tej O
+serwerowni O
+trafiła O
+( O
+wciąż O
+tam O
+zmierza O
+? O
+) O
+nasza O
+klasa O
+. O
+
+# sent_id = 495
+Teraz O
+polski B-nam_adj_country
+serwis O
+nareszcie O
+wrócił O
+do O
+macierzy O
+( O
+nomen O
+omen O
+) O
+, O
+tym O
+bardziej O
+więc O
+wzrośnie O
+mu O
+pewnie O
+liczba O
+użytkowników O
+. O
+
+# sent_id = 496
+Niedawno O
+przeczytał O
+em O
+książkę O
+pod O
+sensacyjnym O
+tytułem O
+" O
+Who B-nam_pro_title_book
+Controls I-nam_pro_title_book
+the I-nam_pro_title_book
+Internet I-nam_pro_title_book
+? I-nam_pro_title_book
+Illusions I-nam_pro_title_book
+of I-nam_pro_title_book
+a I-nam_pro_title_book
+Borderless I-nam_pro_title_book
+World I-nam_pro_title_book
+" O
+, O
+w O
+której O
+prawnicy O
+Goldsmith B-nam_liv_person
+i O
+Wu B-nam_liv_person
+jasno O
+i O
+zupełnie O
+niesensacyjnie O
+tłumaczą O
+, O
+dlaczego O
+internet B-nam_oth_tech
+wciąż O
+tkwi O
+w O
+ramach O
+granic O
+narodowych O
+. O
+
+# sent_id = 497
+Nie O
+chodzi O
+bynajmniej O
+tylko O
+o O
+Chiny B-nam_loc_gpe_country
+, O
+które O
+sÄ… O
+wygodnym O
+punktem O
+odniesienia O
+dla O
+państw O
+demokratycznych O
+, O
+gdzie O
+też O
+istnieje O
+pokusa O
+, O
+żeby O
+przykręcić O
+śrubę O
+, O
+a O
+zawsze O
+można O
+odwrócić O
+uwagÄ™ O
+wskazujÄ…c O
+większych O
+zamordystów O
+. O
+
+# sent_id = 498
+O O
+przenosinach O
+serwerów O
+do O
+Polski B-nam_loc_gpe_country
+poinformował O
+mnie O
+właśnie O
+mój O
+host O
+, O
+który O
+przy O
+okazji O
+uprzejmie O
+prosi O
+o O
+wstrzymanie O
+na O
+czas O
+przeprowadzki O
+aktualizacji O
+stron O
+internetowych O
+. O
+
+# sent_id = 499
+Już O
+jednÄ… O
+takÄ… O
+przeprowadzkÄ™ O
+przeżył O
+em O
+, O
+od O
+tego O
+czasu O
+nie O
+mam O
+oporów O
+przed O
+powierzaniem O
+mojej O
+poczty O
+Wielkim O
+i O
+ZÅ‚ym O
+Korporacjom O
+. O
+
+# sent_id = 500
+Blogger O
+i O
+Wordpress O
+zapraszajÄ… O
+? O
+
+# sent_id = 501
+Co O
+tam O
+. O
+
+# sent_id = 502
+Teraz O
+będę O
+wreszcie O
+miał O
+polski O
+serwer O
+dla O
+polskiego O
+bloga O
+. O
+
+# sent_id = 503
+Internet B-nam_oth_tech
+nie O
+zna O
+granic O
+, O
+przecież O
+robaki O
+będą O
+wchodzić O
+i O
+tak O
+, O
+nic O
+siÄ™ O
+nie O
+zmieni O
+. O
+. O
+. O
+
+# sent_id = 504
+Gdyby O
+m O
+chciał O
+zaistnieć O
+międzynarodowo O
+, O
+nie O
+pisał O
+by O
+m O
+raczej O
+po O
+polsku O
+. O
+
+# sent_id = 505
+Sam O
+jestem O
+sobie O
+winien O
+, O
+pierwszÄ… O
+granicÄ™ O
+ustanowił O
+em O
+sam O
+. O
+
+# sent_id = 506
+Język O
+, O
+infrastruktura O
+, O
+systemy O
+prawne O
+, O
+zestawy O
+wartości O
+- O
+wszystko O
+dzieli O
+internet B-nam_oth_tech
+na O
+kawałki O
+, O
+co O
+tylko O
+powiela O
+znany O
+schemat O
+. O
+
+# sent_id = 507
+NTSC B-nam_oth_tech
+, O
+110V O
+, O
+gniazdka O
+elektryczne O
+, O
+ruch O
+lewostronny O
+. O
+
+# sent_id = 508
+Rozpoznawanie O
+krajów O
+według O
+numerów O
+IP B-nam_oth_tech
+nie O
+tylko O
+uniemożliwia O
+mi O
+legalne O
+ściąganie O
+seriali O
+z O
+NBC O
+, O
+ale O
+zmienia O
+interfejs O
+międzynarodowych O
+portali O
+, O
+gdy O
+jestem O
+za O
+granicÄ… O
+( O
+tak O
+jakby O
+nie O
+można O
+było O
+posiłkować O
+siÄ™ O
+językiem O
+przeglÄ…darki O
+) O
+. O
+
+# sent_id = 509
+Sprytne O
+próbują O
+być O
+niektóre O
+reklamy O
+- O
+pudło O
+, O
+nie O
+kupiÄ™ O
+waszych O
+towarów O
+, O
+jestem O
+przybyszem O
+z O
+innego O
+internetu B-nam_oth_tech
+, O
+nie O
+rozumiem O
+, O
+i O
+tak O
+nie O
+wysyłacie O
+tego O
+do O
+Polski B-nam_loc_gpe_country
+. O
+
+# sent_id = 510
+Czy O
+nasza O
+klasa O
+będzie O
+chciała O
+wyjść O
+poza O
+browar O
+? O
+
+# sent_id = 511
+Czy O
+potrzebne O
+sÄ… O
+jej O
+inne O
+internety B-nam_oth_tech
+? O
+
+# sent_id = 512
+Ilu O
+użytkowników O
+Å‚Ä…czy O
+siÄ™ O
+z O
+Wielkiej B-nam_loc_gpe_country
+Brytanii I-nam_loc_gpe_country
+i O
+Irlandii B-nam_loc_gpe_country
+? O
+
+# sent_id = 513
+W O
+googlowym O
+Open O
+Social O
+dominujÄ… O
+firmy O
+amerykańskie B-nam_adj_country
+( O
+z O
+rodzynkami O
+między O
+innymi O
+z O
+Brazylii B-nam_loc_gpe_country
+i O
+Indii B-nam_loc_gpe_country
+) O
+, O
+więc O
+era O
+open O
+na O
+razie O
+raczej O
+nie O
+powtórzy O
+sukcesu O
+swej O
+tenisowej O
+imienniczki O
+. O
+
+# sent_id = 514
+Infrastruktura O
+internetowa O
+w O
+Stanach B-nam_loc_gpe_country
+Zjednoczonych I-nam_loc_gpe_country
+powstała O
+w O
+ramach O
+bańki O
+, O
+u O
+nas O
+balon O
+pompuje O
+nasza O
+klasa O
+, O
+może O
+więc O
+popyt O
+na O
+porzÄ…dne O
+Å‚Ä…cza O
+rzeczywiście O
+wzrośnie O
+, O
+a O
+UKE B-nam_org_organization
+niech O
+zamieni O
+kary O
+finansowe O
+na O
+inwestycje O
+w O
+infrastrukturÄ™ O
+, O
+w O
+tym O
+Å‚Ä…cza O
+, O
+które O
+nas O
+Å‚Ä…czÄ… O
+ze O
+światem O
+zewnętrznym O
+. O
+
+# sent_id = 515
+A O
+może O
+lepiej O
+zostać O
+w O
+naszym O
+własnym O
+starym O
+browarze O
+? O
+
+# sent_id = 532
+Z O
+ciekawości O
+napisał O
+em O
+nawet O
+do O
+kina O
+Atom B-nam_fac_goe
+, O
+ale O
+być O
+może O
+zajęci O
+byli O
+chodzeniem O
+do O
+kina O
+i O
+nie O
+doczekał O
+em O
+siÄ™ O
+odpowiedzi O
+w O
+sprawie O
+foteli O
+. O
+
+# sent_id = 533
+Nie O
+wszystko O
+stracone O
+, O
+w O
+końcu O
+nie O
+każdy O
+sprawdza O
+spam O
+codziennie O
+. O
+
+# sent_id = 534
+Z O
+tego O
+jednak O
+co O
+zrozumiał O
+em O
+z O
+jakichÅ› O
+występujących O
+w O
+sieci O
+strzępów O
+wypowiedzi O
+właścicieli O
+kina O
+i O
+przepisów O
+o O
+ochronie O
+zabytków O
+, O
+wymiana O
+foteli O
+jest O
+możliwa O
+jak O
+najbardziej O
+, O
+ale O
+nie O
+dość O
+, O
+że O
+trudna O
+administracyjnie O
+, O
+to O
+jeszcze O
+droga O
+, O
+bo O
+jak O
+siÄ™ O
+konserwator O
+zgodzi O
+, O
+to O
+tylko O
+na O
+nowoczesne O
+antyki O
+. O
+
+# sent_id = 535
+ZresztÄ… O
+z O
+tych O
+kawałków O
+informacji O
+wynika O
+, O
+że O
+sala O
+istnieje O
+od O
+1937 O
+, O
+czyli O
+obchodzi O
+okrągłą O
+rocznicÄ™ O
+, O
+co O
+mogło O
+by O
+stanowić O
+dobry O
+pretekst O
+do O
+namówienia O
+jakiejÅ› O
+instytucji O
+na O
+małą O
+dotacjÄ™ O
+. O
+
+# sent_id = 536
+Teraz O
+jest O
+oczywiście O
+za O
+późno O
+, O
+budżety O
+na O
+ten O
+rok O
+dawno O
+zamknięte O
+, O
+w O
+piłkę O
+w O
+Atomie B-nam_fac_goe
+zagrać O
+nie O
+można O
+, O
+elektrowni O
+jÄ…drowej O
+też O
+w O
+Polsce B-nam_loc_gpe_country
+nie O
+mamy O
+. O
+
+# sent_id = 537
+Co O
+do O
+filmów O
+i O
+festiwalu O
+. O
+
+# sent_id = 538
+Z O
+filmami O
+jest O
+tak O
+, O
+że O
+nie O
+wiadomo O
+. O
+
+# sent_id = 539
+Próbował O
+em O
+sprawdzić O
+, O
+czy O
+filmy O
+siÄ™ O
+nie O
+nadajÄ… O
+do O
+oglÄ…dania O
+, O
+ale O
+nie O
+miałem O
+karnetu O
+i O
+napięty O
+grafik O
+, O
+i O
+na O
+żaden O
+film O
+nie O
+udało O
+mi O
+siÄ™ O
+na O
+ostatniÄ… O
+chwilÄ™ O
+kupić O
+biletów O
+. O
+
+# sent_id = 540
+Obejrzał O
+em O
+więc O
+dwa O
+filmy O
+( O
+plus O
+jeden O
+na O
+Rynku B-nam_fac_square
+, O
+więc O
+siÄ™ O
+nie O
+liczy O
+) O
+, O
+jeden O
+dobry O
+, O
+a O
+drugi O
+bardzo O
+dobry O
+. O
+
+# sent_id = 541
+Drugi O
+( O
+Persepolis B-nam_pro_title
+) O
+wejdzie O
+nawet O
+do O
+dystrybucji O
+, O
+więc O
+siÄ™ O
+będzie O
+można O
+naocznie O
+przekonać O
+. O
+
+# sent_id = 542
+KiedyÅ› O
+na O
+pewno O
+by O
+m O
+wolał O
+każdy O
+film O
+zobaczyć O
+w O
+kinie O
+, O
+teraz O
+jednak O
+nie O
+chce O
+mi O
+siÄ™ O
+, O
+bo O
+z O
+jednej O
+strony O
+nie O
+lubiÄ™ O
+kameralnych O
+filmów O
+oglądać O
+w O
+multipleksie O
+, O
+z O
+drugiej O
+Atom B-nam_fac_goe
+też O
+nie O
+jest O
+moim O
+ulubionym O
+kinem O
+. O
+
+# sent_id = 543
+A O
+ponieważ O
+raczej O
+jest O
+mało O
+prawdopodobne O
+, O
+żeby O
+m O
+był O
+jedyny O
+taki O
+wybredny O
+, O
+więc O
+jakby O
+mi O
+ktoÅ› O
+dał O
+nielegalne O
+kopie O
+filmów O
+, O
+na O
+które O
+siÄ™ O
+nie O
+załapał O
+em O
+( O
+swojÄ… O
+drogÄ… O
+do O
+dystrybucji O
+pewnie O
+nie O
+wejdÄ… O
+, O
+DVD B-nam_oth_tech
+w O
+Polsce B-nam_loc_gpe_country
+też O
+ma O
+małe O
+szanse O
+) O
+, O
+to O
+by O
+m O
+brał O
+, O
+telewizor O
+mi O
+Å‚adnie O
+odbiera O
+. O
+
+# sent_id = 544
+Chodzi O
+o O
+to O
+, O
+że O
+liczba O
+osób O
+, O
+które O
+zobaczyły O
+by O
+film O
+w O
+kinie O
+, O
+gdyby O
+miały O
+lepszy O
+wybór O
+rodzajów O
+kin O
+jest O
+pewnie O
+na O
+tyle O
+duża O
+, O
+że O
+może O
+warto O
+siÄ™ O
+o O
+nie O
+starać O
+bardziej O
+. O
+
+# sent_id = 673
+Zachęceni O
+przełomowym O
+pomysłem O
+dystrybutorów O
+DVD B-nam_oth_tech
+, O
+do O
+niekonwencjonalnej O
+i O
+wreszcie O
+skutecznej O
+walki O
+z O
+piractwem O
+postanowili O
+włączyć O
+siÄ™ O
+również O
+inni O
+posiadacze O
+praw O
+autorskich O
+. O
+
+# sent_id = 674
+Åšladem O
+Filipa B-nam_liv_person
+II I-nam_liv_person
+do O
+walki O
+rzucili O
+wszystkie O
+siły O
+. O
+
+# sent_id = 675
+Wytwórnie O
+płytowe O
+sięgnęły O
+po O
+stare O
+sprawdzone O
+metody O
+i O
+do O
+Å‚ask O
+wróciła O
+kaseta O
+magnetofonowa O
+. O
+
+# sent_id = 676
+Nowoczesne O
+technologie O
+produkcji O
+pozwoliły O
+jednak O
+uzyskać O
+taśmę O
+wystarczajÄ…co O
+cienkÄ… O
+, O
+aby O
+już O
+po O
+kilkunastu O
+odtworzeniach O
+rwała O
+siÄ™ O
+na O
+kawałki O
+. O
+
+# sent_id = 677
+W O
+ten O
+sposób O
+na O
+nowo O
+zdefiniowane O
+zostało O
+pojęcie O
+remiksu O
+. O
+
+# sent_id = 678
+Temu O
+wciÄ…gajÄ…cemu O
+zajęciu O
+oddaje O
+siÄ™ O
+nowe O
+pokolenie O
+słuchaczy O
+muzyki O
+. O
+
+# sent_id = 679
+Niełatwe O
+zadanie O
+czekało O
+dystrybutorów O
+muzyki O
+w O
+formie O
+elektronicznej O
+, O
+ale O
+i O
+oni O
+znaleźli O
+sposób O
+. O
+
+# sent_id = 680
+DRM O
+odczytujÄ…cy O
+odcisk O
+palca O
+w O
+połączeniu O
+z O
+recytacjÄ… O
+Odysei B-nam_pro_title
+wspak O
+umożliwia O
+odsłuchanie O
+całości O
+utworu O
+. O
+
+# sent_id = 681
+Prawdziwi O
+melomani O
+recytujÄ… O
+także O
+IliadÄ™ B-nam_pro_title
+, O
+EneidÄ™ B-nam_pro_title
+, O
+względnie O
+inne O
+klasyczne O
+heksametry O
+. O
+
+# sent_id = 682
+W O
+celu O
+ochrony O
+przed O
+greko O
+- O
+łacińską O
+kakofoniÄ… O
+coraz O
+więcej O
+osób O
+nabywa O
+przenośne O
+odtwarzacze O
+i O
+zasila O
+szeregi O
+kupujÄ…cych O
+pliki O
+muzyczne O
+. O
+
+# sent_id = 683
+Programy O
+telewizyjne O
+co O
+45 O
+sekund O
+przerywajÄ… O
+plansze O
+ostrzegajÄ…ce O
+o O
+karach O
+za O
+naruszenie O
+prawa O
+autorskiego O
+, O
+równocześnie O
+na O
+wszystkich O
+kanałach O
+. O
diff --git a/notebooks/example_data/test.txt b/notebooks/example_data/test.txt
new file mode 100644
index 0000000..1f1977f
--- /dev/null
+++ b/notebooks/example_data/test.txt
@@ -0,0 +1,2062 @@
+# sent_id = 0
+W O
+końcu O
+wyszło O
+, O
+do O
+czego O
+potrzebne O
+było O
+Google B-nam_org_company
+Gears B-nam_pro_software
+. O
+
+# sent_id = 1
+Dorzucono O
+kilka O
+bardziej O
+smakowitych O
+kąsków O
+i O
+mamy O
+wreszcie O
+system O
+operacyjny O
+przeglÄ…darkÄ™ O
+Google B-nam_org_company
+Chrome B-nam_pro_software
+. O
+
+# sent_id = 2
+Niezależnie O
+od O
+tego O
+, O
+czy O
+będzie O
+to O
+śmiertelny O
+cios O
+dla O
+Windows B-nam_pro_software
+czy O
+dla O
+Firefoksa B-nam_pro_software
+, O
+program O
+jest O
+kolejnym O
+zwiastunem O
+zmian O
+w O
+interfejsie O
+graficznym O
+. O
+
+# sent_id = 3
+Po O
+kilku O
+minutach O
+rzeczywiście O
+da O
+siÄ™ O
+odczuć O
+szybkość O
+wczytywania O
+stron O
+z O
+JavaScriptem B-nam_oth_tech
+, O
+a O
+każda O
+zakładka O
+w O
+oddzielnym O
+procesie O
+też O
+brzmi O
+nieźle O
+( O
+szczególnie O
+pod O
+Linuksem B-nam_pro_software
+* O
+, O
+w O
+którym O
+Adobe B-nam_pro_software
+Flash I-nam_pro_software
+regularnie O
+wywala O
+przeglÄ…darki O
+- O
+niestety O
+wersji O
+dla O
+Linuksa B-nam_pro_software
+na O
+razie O
+brak O
+) O
+. O
+
+# sent_id = 4
+Beznadziejnie O
+na O
+pierwszy O
+rzut O
+oka O
+wyglÄ…dajÄ… O
+zakładki O
+( O
+foldery O
+? O
+! O
+) O
+, O
+ale O
+być O
+może O
+trzymanie O
+zakładek O
+w O
+przeglÄ…darce O
+jest O
+już O
+niemodne O
+. O
+
+# sent_id = 5
+SwojÄ… O
+drogÄ… O
+integracji O
+z O
+del.icio.us O
+też O
+nie O
+widać O
+. O
+
+# sent_id = 6
+Motywacje O
+Google B-nam_org_company
+też O
+sÄ… O
+raczej O
+jasne O
+( O
+konwergencja O
+, O
+znowu O
+) O
+- O
+gdy O
+Chrome B-nam_pro_software
+ustawimy O
+jako O
+domyślną O
+przeglÄ…darkÄ™ O
+w O
+Windows B-nam_pro_software
+, O
+nazwa O
+" O
+Internet B-nam_oth_tech
+" O
+w O
+menu O
+start O
+nabierze O
+właściwego O
+znaczenia O
+. O
+. O
+. O
+
+# sent_id = 7
+Chrome B-nam_pro_software
+wyglÄ…da O
+Å‚adnie O
+. O
+
+# sent_id = 8
+W O
+nowym O
+Firefoksie B-nam_pro_software
+jest O
+AwesomeBar B-nam_pro_software
+, O
+podobny O
+pasek O
+adresu O
+jest O
+też O
+w O
+Chrome B-nam_pro_software
+. O
+
+# sent_id = 9
+Niby O
+to O
+nic O
+wielkiego O
+- O
+użytkownicy O
+Apple B-nam_pro_software
+od O
+dawna O
+majÄ… O
+Spotlight B-nam_pro_software
+( O
+zresztÄ… O
+- O
+to O
+co O
+w O
+Windowsie B-nam_pro_software
+nazywa O
+siÄ™ O
+" O
+Explorer B-nam_pro_software
+" O
+, O
+na O
+Maku B-nam_pro_software
+od O
+dawna O
+nazywa O
+siÄ™ O
+" O
+Finder B-nam_pro_software
+" O
+) O
+, O
+w O
+Viście B-nam_pro_software
+też O
+jest O
+nieśmiałe O
+okienko O
+wyszukiwania O
+( O
+choć O
+prezentacja O
+wyników O
+w O
+postaci O
+nudnej O
+listy O
+) O
+, O
+Google B-nam_org_company
+Desktop B-nam_pro_software
+istnieje O
+już O
+długo O
+, O
+a O
+w O
+Linuksie B-nam_pro_software
+głowa O
+wręcz O
+boli O
+od O
+przybytku O
+( O
+Tracker B-nam_pro_software
+, O
+Beagle B-nam_pro_software
+, O
+Deskbar B-nam_pro_software
+) O
+, O
+ale O
+jedno O
+jest O
+pewne O
+: O
+rola O
+pisania O
+w O
+interfejsie O
+graficznym O
+siÄ™ O
+zwiększa O
+. O
+
+# sent_id = 10
+Jeśli O
+AwesomeBar B-nam_pro_software
+jest O
+za O
+mało O
+Awesome O
+- O
+można O
+zainstalować O
+Ubiquity B-nam_pro_software
+. O
+
+# sent_id = 11
+Jeśli O
+tekstowa O
+obsługa O
+przeglÄ…darki O
+to O
+za O
+mało O
+- O
+na O
+Maku B-nam_pro_software
+jest O
+Quicksilver B-nam_pro_software
+, O
+w O
+Linuksie B-nam_pro_software
+Gnome B-nam_pro_software
+Do O
+( O
+w O
+Windowsie B-nam_pro_software
+na O
+pewno O
+też O
+coÅ› O
+jest O
+) O
+: O
+piszesz O
+i O
+wybierasz O
+z O
+listy O
+, O
+program O
+zapamiętuje O
+zachowania O
+użytkownika O
+, O
+czasem O
+wystarczy O
+kilka O
+liter O
+. O
+
+# sent_id = 12
+Szukanie O
+nie O
+służy O
+już O
+tylko O
+znalezieniu O
+rzeczy O
+, O
+które O
+gdzieÅ› O
+siÄ™ O
+zapodziały O
+, O
+szukanie O
+zastępuje O
+przeglÄ…danie O
+. O
+
+# sent_id = 13
+Przecież O
+przed O
+pojawieniem O
+siÄ™ O
+Google B-nam_pro_software
+, O
+internet B-nam_oth_tech
+był O
+katalogowany O
+, O
+dopiero O
+później O
+został O
+tak O
+naprawdÄ™ O
+zindeksowany O
+. O
+
+# sent_id = 14
+Być O
+może O
+to O
+stara O
+forma O
+internetu B-nam_oth_tech
+była O
+przyczynÄ… O
+porażki O
+microsoftowego O
+Active O
+Desktop O
+. O
+
+# sent_id = 15
+W O
+końcu O
+kiepskie O
+wykonanie O
+, O
+wymuszanie O
+niestandardowych O
+formatów O
+i O
+zasobożerność O
+innym O
+produktom O
+MS B-nam_org_company
+nie O
+zaszkodziły O
+. O
+. O
+. O
+
+# sent_id = 16
+Tymczasem O
+teraz O
+nasze O
+dyski O
+sÄ… O
+już O
+zindeksowane O
+, O
+czas O
+wyrobić O
+odpowiednie O
+nawyki O
+. O
+
+# sent_id = 17
+A O
+wtedy O
+granica O
+między O
+online O
+i O
+offline O
+zatrze O
+siÄ™ O
+jeszcze O
+bardziej O
+. O
+
+# sent_id = 18
+I O
+kto O
+na O
+tym O
+skorzysta O
+? O
+
+# sent_id = 19
+* O
+Firma O
+Google B-nam_org_company
+zapisuje O
+Twój O
+adres O
+w O
+celu O
+przesyłania O
+wiadomości O
+dotyczÄ…cych O
+przeglÄ…darki O
+Google B-nam_org_company
+Chrome B-nam_pro_software
+oraz O
+inforlinuxji O
+o O
+aktualizacjach O
+i O
+wydaniu O
+gotowej O
+wersji O
+. O
+
+# sent_id = 20
+Podanie O
+adresu O
+oznacza O
+wyrażenie O
+zgody O
+na O
+otrzymywanie O
+e O
+- O
+maili O
+zawierajÄ…cych O
+inforlinuxje O
+tego O
+typu O
+. O
+
+# sent_id = 21
+Google B-nam_org_company
+będzie O
+przechowywać O
+Twój O
+adres O
+e O
+- O
+mail O
+przez O
+pewien O
+czas O
+po O
+wydaniu O
+przeglÄ…darki O
+Google B-nam_org_company
+Chrome B-nam_pro_software
+dla O
+systemu O
+Linux B-nam_pro_software
+, O
+a O
+następnie O
+go O
+usunie O
+. O
+
+# sent_id = 22
+Więcej O
+inforlinuxji O
+na O
+temat O
+przechowywania O
+danych O
+użytkowników O
+przez O
+Google B-nam_org_company
+można O
+znaleźć O
+w O
+zasadach O
+ochrony O
+prywatności O
+. O
+
+# sent_id = 23
+Subiektywny O
+przeglÄ…d O
+kaw O
+z O
+mlekiem O
+i O
+rogalików O
+. O
+
+# sent_id = 24
+Rogalik O
+spłaszczony O
+przez O
+toster O
+, O
+cukier O
+z O
+wierzchu O
+lekko O
+przypalony O
+, O
+w O
+stylu O
+crema O
+catalana O
+. O
+
+# sent_id = 25
+Ciepły O
+, O
+podany O
+ze O
+sztućcami O
+. O
+
+# sent_id = 26
+Pocięty O
+w O
+paski O
+. O
+
+# sent_id = 27
+Rogalik O
+pocięty O
+w O
+paski O
+, O
+na O
+zimno O
+. O
+
+# sent_id = 28
+Podany O
+ze O
+sztućcami O
+. O
+
+# sent_id = 29
+Zjadany O
+w O
+centrum O
+przed O
+wyjazdem O
+autobusu O
+na O
+plażę O
+. O
+
+# sent_id = 30
+Rogalik O
+zwykły O
+i O
+wymiętoszony O
+, O
+do O
+ręki O
+w O
+serwetce O
+, O
+kawa O
+w O
+szczycie O
+długiej O
+przerwy O
+podana O
+w O
+plastikowym O
+kubku O
+. O
+
+# sent_id = 31
+Ale O
+za O
+to O
+cały O
+zestaw O
+za O
+marne O
+1 O
+euro B-nam_oth_currency
+. O
+
+# sent_id = 32
+Stołówka O
+uniwersytecka O
+przerabia O
+kawÄ™ O
+i O
+rogaliki O
+w O
+tempie O
+kawiarni O
+na O
+dużym O
+dworcu O
+. O
+
+# sent_id = 33
+Kawa O
+z O
+mlekiem O
+ciepłym O
+lub O
+zimnym O
+, O
+cortado O
+( O
+mało O
+mleka O
+) O
+, O
+cortado O
+z O
+mlekiem O
+skondensowanym O
+( O
+ale O
+naprawdÄ™ O
+skondensowanym O
+, O
+cortado O
+podaje O
+siÄ™ O
+w O
+małych O
+szklaneczkach O
+, O
+na O
+dnie O
+gruba O
+warstwa O
+mleka O
+, O
+trzeba O
+energicznie O
+wymieszać O
+) O
+, O
+kawa O
+( O
+czyli O
+solo O
+, O
+czyli O
+espresso O
+) O
+. O
+. O
+. O
+
+# sent_id = 34
+Wszystko O
+po O
+pięćdziesiąt O
+centów O
+. O
+
+# sent_id = 35
+Inna O
+uniwersytecka O
+stołówka O
+, O
+100 O
+metrów O
+dalej O
+, O
+ale O
+ze O
+stolikami O
+na O
+dworze O
+. O
+
+# sent_id = 36
+Ceny O
+zupełnie O
+inne O
+- O
+kawa O
+z O
+mlekiem O
+i O
+rogalik O
+za O
+1 O
+, O
+45 O
+euro B-nam_oth_currency
+, O
+różne O
+ceny O
+na O
+różne O
+rodzaje O
+kaw O
+. O
+
+# sent_id = 37
+Ale O
+siedzenie O
+na O
+słońcu O
+, O
+w O
+grudniu O
+- O
+bezcenne O
+. O
+
+# sent_id = 38
+I O
+jeszcze O
+środek O
+niedzieli O
+- O
+Alek B-nam_liv_person
+Tarkowski I-nam_liv_person
+zwrócił O
+uwagÄ™ O
+na O
+przejmowanie O
+przez O
+banki O
+przestrzeni O
+publicznej O
+w O
+Warszawie B-nam_loc_gpe_city
+. O
+
+# sent_id = 39
+W O
+niedzielÄ™ O
+, O
+około O
+godziny O
+14 O
+zachciało O
+nam O
+siÄ™ O
+wyjść O
+na O
+kawÄ™ O
+, O
+a O
+dzielnica O
+jest O
+dopiero O
+w O
+budowie O
+( O
+ma O
+łączyć O
+wybudowany O
+w O
+szczerym O
+polu O
+uniwersytet O
+oraz O
+miasto O
+) O
+. O
+
+# sent_id = 40
+Na O
+rondzie O
+przy O
+głównym O
+wjeździe O
+na O
+teren O
+uniwersytetu O
+sÄ… O
+dwa O
+banki O
+. O
+
+# sent_id = 41
+Na O
+ulicy O
+, O
+która O
+będzie O
+prowadzić O
+do O
+miasta O
+, O
+sÄ… O
+jeszcze O
+dwa O
+, O
+mimo O
+że O
+nie O
+da O
+siÄ™ O
+niÄ… O
+na O
+razie O
+jeździć O
+. O
+
+# sent_id = 42
+Ale O
+kawÄ™ O
+( O
+bez O
+rogalika O
+) O
+udało O
+nam O
+siÄ™ O
+znaleźć O
+w O
+jednym O
+z O
+dziewięciu O
+barów O
+, O
+które O
+znajdujÄ… O
+siÄ™ O
+promieniu O
+500 O
+metrów O
+od O
+mieszkania O
+( O
+większość O
+była O
+zamknięta O
+, O
+bo O
+niedziela O
+/ O
+sjesta O
+, O
+jeden O
+nam O
+siÄ™ O
+nie O
+podobał O
+itp O
+. O
+) O
+. O
+
+# sent_id = 43
+Wszystkie O
+budynki O
+( O
+z O
+których O
+znaczna O
+część O
+nie O
+jest O
+zamieszkana O
+) O
+majÄ… O
+przeznaczone O
+miejsce O
+na O
+usługi O
+/ O
+sklepy O
+, O
+więc O
+można O
+siÄ™ O
+spodziewać O
+, O
+że O
+za O
+rok O
+będzie O
+już O
+można O
+wybierać O
+spośród O
+20 O
+barów O
+, O
+rogalików O
+na O
+ciepło O
+i O
+na O
+zimno O
+, O
+rogalików O
+pociętych O
+w O
+paseczki O
+. O
+. O
+. O
+
+# sent_id = 44
+Koniec O
+napisów O
+. O
+
+# sent_id = 45
+Już O
+od O
+dawna O
+trwała O
+walka O
+z O
+amatorami O
+tworzÄ…cymi O
+napisy O
+do O
+filmów O
+, O
+teraz O
+skończył O
+siÄ™ O
+czas O
+polemik O
+w O
+gazecie O
+, O
+pora O
+na O
+salÄ™ O
+sÄ…dowÄ… O
+. O
+
+# sent_id = 46
+Oczywiście O
+to O
+tylko O
+jedno O
+źródło O
+napisów O
+, O
+ale O
+" O
+sprawa O
+jest O
+rozwojowa O
+" O
+. O
+
+# sent_id = 47
+Łatwiej O
+będzie O
+zapewne O
+nauczyć O
+siÄ™ O
+angielskiego O
+, O
+niemieckiego O
+, O
+francuskiego O
+, O
+hiszpańskiego O
+, O
+włoskiego O
+, O
+japońskiego O
+i O
+czeskiego O
+( O
+na O
+poczÄ…tek O
+powinno O
+wystarczyć O
+) O
+niż O
+zmienić O
+prawo O
+autorskie O
+. O
+
+# sent_id = 48
+Tymczasem O
+ze O
+wszystkich O
+ogniw O
+" O
+pirackiego O
+" O
+łańcucha O
+tłumacze O
+napisów O
+sÄ… O
+pewnie O
+najmniej O
+groźni O
+, O
+ale O
+za O
+to O
+najłatwiejsi O
+do O
+wyśledzenia O
+. O
+
+# sent_id = 49
+I O
+jak O
+zabierze O
+siÄ™ O
+napisy O
+, O
+na O
+pewno O
+spadnie O
+liczba O
+ściąganych O
+i O
+udostępnianych O
+filmów O
+. O
+
+# sent_id = 50
+Na O
+pewno O
+. O
+
+# sent_id = 51
+W O
+okolicy O
+obowiÄ…zkowo O
+jest O
+grób O
+Hamleta B-nam_liv_person
+, O
+wiatraki O
+, O
+a O
+domy O
+kryte O
+sÄ… O
+strzechÄ… O
+lub O
+azbestem O
+. O
+
+# sent_id = 52
+Każdy O
+nosi O
+ze O
+sobÄ… O
+termos O
+, O
+z O
+prohibicjÄ… O
+ma O
+on O
+jednak O
+niewiele O
+wspólnego O
+, O
+w O
+środku O
+jest O
+kawa O
+, O
+bez O
+której O
+przeciętny O
+Duńczyk O
+nie O
+przetrwał O
+by O
+nawet O
+godziny O
+. O
+
+# sent_id = 53
+Kawa O
+jest O
+smolista O
+, O
+raczej O
+przyzwoita O
+i O
+jak O
+na O
+polskie O
+standardy O
+raczej O
+mocna O
+, O
+chociaż O
+fani O
+espresso O
+mogÄ… O
+poczuć O
+siÄ™ O
+obrażeni O
+takim O
+stwierdzeniem O
+. O
+
+# sent_id = 54
+KawÄ™ O
+podaje O
+siÄ™ O
+przy O
+każdej O
+okazji O
+, O
+również O
+w O
+porze O
+na O
+kawÄ™ O
+( O
+o O
+15 O
+) O
+, O
+do O
+kawy O
+sÄ… O
+wówczas O
+bułki O
+z O
+serem O
+żółtym O
+i O
+marmoladÄ… O
+, O
+ewentualnie O
+ciasto O
+. O
+
+# sent_id = 55
+Mleka O
+do O
+kawy O
+siÄ™ O
+nie O
+dolewa O
+, O
+w O
+końcu O
+jest O
+w O
+serze O
+. O
+
+# sent_id = 56
+Ser O
+to O
+tylko O
+jeden O
+element O
+deja O
+vu O
+, O
+które O
+napadło O
+mnie O
+w O
+Danii B-nam_loc_gpe_country
+, O
+gdzie O
+zaczÄ…Å‚ O
+em O
+czytać O
+nazwy O
+zgodnie O
+z O
+wymowÄ… O
+holenderskÄ… O
+. O
+
+# sent_id = 57
+Kawa O
+zresztÄ… O
+też O
+podobna O
+, O
+wioski O
+też O
+jak O
+z O
+Might B-nam_pro_software
+and I-nam_pro_software
+Magic I-nam_pro_software
+, O
+szosy O
+pełne O
+opli O
+astra B-nam_pro_brand
+i O
+fordów O
+focusów B-nam_pro_brand
+, O
+nawet O
+ziołowa O
+wódka O
+taka O
+sama O
+. O
+
+# sent_id = 58
+I O
+oczywiście O
+ser O
+z O
+kminkiem O
+. O
+
+# sent_id = 59
+Goudse O
+belegen O
+met O
+komijn O
+był O
+zawsze O
+moim O
+holenderskim O
+faworytem O
+, O
+w O
+Danii B-nam_loc_gpe_country
+sery O
+również O
+występują O
+w O
+różnym O
+stopniu O
+dojrzałości O
+, O
+a O
+dojrzały O
+danbo O
+. O
+. O
+. O
+
+# sent_id = 60
+Wystarczy O
+uchylić O
+lodówkę O
+, O
+żeby O
+wiedzieć O
+, O
+że O
+został O
+jeszcze O
+kawałek O
+. O
+
+# sent_id = 61
+Szkoda O
+, O
+że O
+taki O
+mały O
+. O
+
+# sent_id = 62
+W O
+Danii B-nam_loc_gpe_country
+trafił O
+em O
+akurat O
+na O
+ekspresowe O
+żniwa O
+, O
+cały O
+lipiec O
+padało O
+, O
+musieli O
+nadrabiać O
+. O
+
+# sent_id = 63
+PatrzÄ…c O
+na O
+gigantyczne O
+traktory O
+i O
+imperialne O
+kombajny O
+trudno O
+zrozumieć O
+duński O
+dystans O
+wobec O
+Unii B-nam_org_organization
+Europejskiej I-nam_org_organization
+. O
+
+# sent_id = 64
+Chociaż O
+rozmawiał O
+em O
+z O
+młodym O
+rolnikiem O
+, O
+który O
+ma O
+dwadzieścia O
+hektarów O
+, O
+biegle O
+mówi O
+po O
+angielsku O
+i O
+na O
+wakacje O
+jeździ O
+do O
+Austrii B-nam_loc_gpe_country
+na O
+narty O
+. O
+
+# sent_id = 65
+Uprawia O
+ziemiÄ™ O
+, O
+bo O
+lubi O
+, O
+uważa O
+to O
+za O
+ciekawÄ… O
+pracÄ™ O
+i O
+nie O
+ma O
+nic O
+do O
+UE B-nam_org_organization
+. O
+
+# sent_id = 66
+ZresztÄ… O
+duńscy B-nam_adj_country
+rolnicy O
+, O
+nie O
+tylko O
+młodzi O
+, O
+wyposażeni O
+sÄ… O
+w O
+komputery O
+i O
+stałe O
+Å‚Ä…cza O
+, O
+na O
+dodatek O
+potrafiÄ… O
+z O
+nich O
+korzystać O
+. O
+
+# sent_id = 67
+MajÄ… O
+swoje O
+strony O
+internetowe O
+, O
+wprawdzie O
+na O
+etapie O
+1 B-nam_oth_tech
+. I-nam_oth_tech
+0 I-nam_oth_tech
+, O
+nikt O
+mnie O
+do O
+facebooka O
+nie O
+zaprosił O
+, O
+ale O
+sieciowe O
+umiejętności O
+sÄ… O
+tam O
+nieporównywalnie O
+większe O
+niż O
+w O
+Polsce B-nam_loc_gpe_country
+. O
+
+# sent_id = 68
+Poza O
+tym O
+Dania B-nam_loc_gpe_country
+to O
+spokojne O
+wakacje O
+( O
+jeśli O
+zignorujemy O
+to O
+, O
+że O
+nasz O
+domek O
+wakacyjny O
+może O
+być O
+pokryty O
+azbestem O
+) O
+, O
+był O
+em O
+w O
+szczycie O
+sezonu O
+, O
+w O
+weekend O
+, O
+pogoda O
+momentami O
+niezła O
+, O
+a O
+plaże O
+i O
+deptaki O
+niemal O
+puste O
+. O
+
+# sent_id = 69
+We O
+wszystkich O
+wioskach O
+osiedla O
+domków O
+letniskowych O
+, O
+kemping O
+co O
+dwa O
+kilometry O
+, O
+ale O
+znikÄ…d O
+nie O
+dobiega O
+basowe O
+dudnienie O
+, O
+może O
+był O
+em O
+na O
+zbyt O
+głębokiej O
+prowincji O
+, O
+a O
+może O
+rozrywkowi O
+Niemcy B-nam_org_nation
+, O
+Duńczycy B-nam_org_nation
+i O
+Holendrzy B-nam_org_nation
+jeżdżą O
+raczej O
+do O
+Hiszpanii B-nam_loc_gpe_country
+. O
+
+# sent_id = 70
+Morza O
+szum O
+( O
+w O
+końcu O
+był O
+em O
+nad O
+Bałtykiem O
+) O
+, O
+tłuste O
+jedzenie O
+- O
+bo O
+oprócz O
+serów O
+występuje O
+sporo O
+mięsa O
+, O
+kotletów O
+mielonych O
+w O
+różnych O
+postaciach O
+, O
+boczku O
+w O
+grubych O
+plastrach O
+, O
+piwo O
+, O
+które O
+niegdyÅ› O
+sprowadzało O
+siÄ™ O
+do O
+dwóch O
+różnych O
+marek O
+( O
+w O
+tym O
+tego O
+w O
+prawdopodobnie O
+najlepszej O
+butelce O
+) O
+, O
+a O
+teraz O
+rzekomo O
+co O
+tydzień O
+powstaje O
+( O
+wskrzesza O
+siÄ™ O
+? O
+) O
+nowy O
+lokalny O
+browar O
+, O
+chociaż O
+trzeba O
+uważać O
+, O
+bo O
+ceny O
+lokalnych O
+specjałów O
+raczej O
+nie O
+dla O
+nas O
+, O
+chyba O
+że O
+w O
+przeliczeniu O
+na O
+procenty O
+, O
+bo O
+wtedy O
+niektórym O
+piwom O
+bliżej O
+zdecydowanie O
+do O
+wina O
+, O
+a O
+smak O
+bynajmniej O
+nie O
+przypomina O
+polskich O
+" O
+mocnych O
+" O
+i O
+powiewajÄ…ce O
+wszędzie O
+, O
+przed O
+domami O
+, O
+za O
+domami O
+i O
+obok O
+domów O
+, O
+duńskie O
+flagi O
+. O
+
+# sent_id = 71
+Czy O
+piosenka O
+to O
+samochód O
+? O
+
+# sent_id = 72
+Problem O
+, O
+czy O
+chronić O
+informacje O
+jak O
+własność O
+materialnÄ… O
+nie O
+jest O
+nowy O
+. O
+
+# sent_id = 73
+Dla O
+amerykańskiego B-nam_adj_country
+prawnika O
+, O
+który O
+przerabia O
+ekonomicznÄ… O
+analizÄ™ O
+prawa O
+na O
+studiach O
+, O
+to O
+oczywistość O
+. O
+
+# sent_id = 74
+Polski B-nam_adj_country
+prawnik O
+na O
+studiach O
+miał O
+może O
+wprowadzenie O
+do O
+mikro O
+i O
+makro O
+, O
+więc O
+przy O
+odrobinie O
+szczęścia O
+odróżni O
+inflacjÄ™ O
+od O
+elastyczności O
+popytu O
+. O
+
+# sent_id = 75
+W O
+zwiÄ…zku O
+z O
+tym O
+w O
+Polsce B-nam_loc_gpe_country
+można O
+zawsze O
+liczyć O
+na O
+to O
+, O
+że O
+prawnik O
+ZAiKSu B-nam_org_organization
+powie O
+, O
+że O
+przecież O
+to O
+oczywiste O
+, O
+że O
+samochód O
+i O
+zdjęcie O
+to O
+jest O
+dokładnie O
+to O
+samo O
+. O
+
+# sent_id = 76
+Bo O
+przyszedł O
+do O
+niego O
+zapłakany O
+fotograf O
+. O
+
+# sent_id = 77
+Bo O
+gdyby O
+chciał O
+wejść O
+do O
+czyjegoÅ› O
+samochodu O
+, O
+to O
+musiał O
+by O
+zapytać O
+o O
+zgodÄ™ O
+. O
+
+# sent_id = 78
+Musiał O
+by O
+zapytać O
+o O
+zgodÄ™ O
+właściciela O
+? O
+
+# sent_id = 79
+A O
+dlaczego O
+samochód O
+ma O
+właściciela O
+? O
+
+# sent_id = 80
+Dlaczego O
+o O
+zgodÄ™ O
+, O
+oprócz O
+użytkownika O
+, O
+nie O
+trzeba O
+pytać O
+więc O
+producenta O
+samochodu O
+? O
+
+# sent_id = 81
+Albo O
+koproducentów O
+, O
+producenta O
+klamki O
+, O
+tapicerki O
+? O
+
+# sent_id = 82
+Oczywiście O
+, O
+szybko O
+można O
+znaleźć O
+wyjÄ…tki O
+. O
+
+# sent_id = 83
+Samochód O
+wypożyczony O
+albo O
+samochód O
+w O
+leasingu O
+być O
+może O
+jest O
+bardziej O
+podobny O
+do O
+utworu O
+, O
+którego O
+licencjÄ™ O
+kupujemy O
+. O
+
+# sent_id = 84
+Jest O
+jednak O
+pewna O
+zasadnicza O
+różnica O
+, O
+jak O
+powiedział O
+Krzysztof B-nam_liv_person
+Siewicz I-nam_liv_person
+- O
+nie O
+ma O
+zaczarowanego O
+ołówka O
+, O
+którym O
+możemy O
+ten O
+wypożyczony O
+samochód O
+sobie O
+skopiować O
+. O
+
+# sent_id = 85
+Wciąż O
+jeden O
+samochód O
+w O
+tym O
+samym O
+czasie O
+może O
+pokonać O
+jednÄ… O
+trasÄ™ O
+, O
+zmieści O
+siÄ™ O
+w O
+nim O
+określona O
+liczba O
+osób O
+. O
+
+# sent_id = 86
+Dlaczego O
+producenci O
+nie O
+chcieli O
+by O
+zmienić O
+modelu O
+sprzedaży O
+samochodów O
+? O
+
+# sent_id = 87
+Może O
+powinni O
+zacząć O
+lobbować O
+za O
+takim O
+rozwiÄ…zaniem O
+( O
+oczywiście O
+, O
+jak O
+już O
+uda O
+im O
+siÄ™ O
+wylobbować O
+ratunek O
+przed O
+kryzysem O
+) O
+, O
+bo O
+przecież O
+nie O
+ma O
+nic O
+lepszego O
+niż O
+własność O
+dla O
+producenta O
+i O
+ustawowo O
+ograniczone O
+prawa O
+nabywców O
+. O
+
+# sent_id = 88
+Dlaczego O
+nie O
+wprowadzić O
+licencji O
+na O
+samochody O
+zamiast O
+własności O
+? O
+
+# sent_id = 89
+Albo O
+licencji O
+na O
+wszystko O
+? O
+
+# sent_id = 90
+Niech O
+tylko O
+pierwotny O
+twórca O
+- O
+stolarz O
+, O
+murarz O
+, O
+ślusarz O
+będzie O
+właścicielem O
+, O
+a O
+użytkownik O
+licencjobiorcÄ… O
+. O
+
+# sent_id = 91
+A O
+jeśli O
+produkcja O
+jest O
+bardziej O
+skomplikowana O
+? O
+
+# sent_id = 92
+Nic O
+prostszego O
+- O
+można O
+wprowadzić O
+takie O
+prawo O
+, O
+żeby O
+współproducentom O
+również O
+przysługiwało O
+wynagrodzenie O
+. O
+
+# sent_id = 93
+Jak O
+tego O
+pilnować O
+? O
+
+# sent_id = 94
+Czy O
+na O
+pewno O
+nabywca O
+krzesła O
+nie O
+korzysta O
+z O
+niego O
+na O
+imprezie O
+publicznej O
+? O
+
+# sent_id = 95
+Może O
+na O
+imprezÄ™ O
+przyszedł O
+ktoÅ› O
+spoza O
+kręgu O
+towarzyskiego O
+? O
+
+# sent_id = 96
+Czy O
+licencja O
+obejmuje O
+przewożenie O
+autostopowiczów O
+? O
diff --git a/notebooks/example_data/train.txt b/notebooks/example_data/train.txt
new file mode 100644
index 0000000..a3cfb21
--- /dev/null
+++ b/notebooks/example_data/train.txt
@@ -0,0 +1,12562 @@
+# sent_id = 619
+Niewybaczalnym O
+błędem O
+było O
+by O
+pominięcie O
+bogatej O
+gatunkowo O
+ichtiofauny O
+na O
+terenie O
+stawów O
+. O
+
+# sent_id = 620
+SkupiajÄ… O
+siÄ™ O
+tam O
+bardzo O
+rzadkie O
+w O
+naszym O
+kraju O
+gatunki O
+takie O
+jak O
+: O
+kiełb O
+białopłetwy O
+( O
+Gobio O
+albipinnatus O
+) O
+czy O
+koza O
+złota O
+( O
+Cobitis O
+aurata O
+) O
+. O
+
+# sent_id = 621
+Na O
+masowÄ… O
+skalÄ™ O
+( O
+90 O
+% O
+całej O
+produkcji O
+na O
+tych O
+terenach O
+) O
+hoduje O
+siÄ™ O
+karpia O
+( O
+Cyprinus O
+carpio O
+) O
+, O
+który O
+jest O
+szanowany O
+ze O
+względu O
+na O
+ekologicznÄ… O
+hodowlÄ™ O
+nie O
+tylko O
+w O
+Polsce B-nam_loc_gpe_country
+, O
+ale O
+i O
+w O
+Europie B-nam_loc_land_continent
+. O
+
+# sent_id = 622
+W O
+stawach O
+hodowany O
+jest O
+także O
+lin O
+( O
+Tinca O
+tinca O
+) O
+, O
+sandacz O
+( O
+Stizostedion O
+lucioperca O
+) O
+czy O
+szczupak O
+( O
+Esox O
+Lucius O
+) O
+. O
+
+# sent_id = 623
+CiekawostkÄ… O
+jest O
+występowanie O
+pstrÄ…ga O
+potokowego O
+( O
+Salmo O
+trutta O
+fario O
+) O
+w O
+górnej O
+części O
+rzeki O
+SÄ…siecznicy B-nam_loc_hydronym_river
+. O
+
+# sent_id = 624
+Oprócz O
+ptaków O
+i O
+ryb O
+występują O
+tam O
+także O
+cenne O
+gatunki O
+ssaków O
+( O
+których O
+jest O
+ponad O
+50 O
+) O
+: O
+m O
+. O
+in O
+. O
+gacek O
+szary O
+( O
+Plecotus O
+austriacus O
+) O
+, O
+nocek O
+wÄ…satek O
+( O
+Myotis O
+mystacinus O
+) O
+, O
+sarna O
+( O
+Capreolus O
+capreolus O
+) O
+, O
+daniel O
+( O
+Dama O
+dama O
+) O
+, O
+piżmak O
+( O
+Ondatra O
+zibethicus O
+) O
+, O
+wydra O
+( O
+Lutrinae O
+) O
+, O
+a O
+nawet O
+jenot O
+( O
+Nyctereutes O
+procyonoides O
+) O
+czy O
+norka O
+amerykańska O
+( O
+Neovison O
+vison O
+) O
+. O
+
+# sent_id = 625
+Z O
+herpetofauny O
+możemy O
+wyróżnić O
+m O
+. O
+in O
+. O
+: O
+rzekotkÄ™ O
+drzewnÄ… O
+( O
+Hyla O
+arboreta O
+) O
+, O
+traszkÄ™ O
+zwyczajnÄ… O
+( O
+Lissotriton O
+vulgaris O
+) O
+, O
+traszkÄ™ O
+grzebieniastÄ… O
+( O
+Triturus O
+cristatus O
+) O
+, O
+żabę O
+moczarowÄ… O
+( O
+Rana O
+arvalis O
+) O
+, O
+padalca O
+( O
+Anguis O
+fragilis O
+) O
+czy O
+żmiję O
+zygzakowatÄ… O
+( O
+Vipera O
+berus O
+) O
+. O
+
+# sent_id = 626
+Czy O
+na O
+ptaki O
+, O
+czy O
+na O
+ssaki O
+warto O
+tam O
+pojechać O
+, O
+zobaczyć O
+– O
+byle O
+z O
+bezpiecznej O
+odległości O
+– O
+i O
+sfotografować O
+. O
+
+# sent_id = 627
+W O
+tym O
+celu O
+właśnie O
+powstały O
+ścieżki O
+i O
+punkty O
+obserwatorskie O
+, O
+aby O
+tereny O
+nie O
+były O
+dewastowane O
+przez O
+skrywajÄ…cych O
+siÄ™ O
+potajemnie O
+i O
+płoszących O
+zwierzaki O
+pseudo O
+- O
+obserwatorów O
+. O
+
+# sent_id = 628
+Dostosujmy O
+siÄ™ O
+zatem O
+do O
+przepisów O
+wybierajÄ…c O
+siÄ™ O
+na O
+teren O
+Parku B-nam_loc_land
+Krajobrazowego I-nam_loc_land
+Doliny I-nam_loc_land
+Baryczy I-nam_loc_land
+. O
+
+# sent_id = 629
+Obszar O
+jak O
+każdy O
+naturalny O
+jest O
+zagrożony O
+zanikiem O
+i O
+wyginięciem O
+, O
+przez O
+ostatnie O
+lata O
+wiele O
+gatunków O
+ptaków O
+straciło O
+status O
+lęgowych O
+, O
+a O
+ssaki O
+takie O
+jak O
+daniele O
+( O
+Dama O
+dama O
+) O
+czy O
+sarny O
+( O
+Capreolus O
+capreolus O
+) O
+sÄ… O
+co O
+raz O
+częściej O
+kłusowane O
+, O
+a O
+dzik O
+( O
+Sus O
+strofa O
+) O
+, O
+sarna O
+( O
+Capreolus O
+capreolus O
+) O
+, O
+jeleń O
+( O
+Cervus O
+elaphus O
+) O
+– O
+eliminowane O
+przez O
+myśliwych O
+w O
+ramach O
+" O
+kontroli O
+" O
+nad O
+populacjÄ… O
+. O
+
+# sent_id = 630
+Inne O
+uciekajÄ… O
+od O
+zbliżających O
+siÄ™ O
+zabudowań O
+w O
+poszukiwaniu O
+jedzenia O
+. O
+
+# sent_id = 631
+Warto O
+przyczynić O
+siÄ™ O
+do O
+zadbania O
+o O
+nasze O
+najbardziej O
+cenne O
+tereny O
+, O
+a O
+takimi O
+niewÄ…tpliwie O
+sÄ… O
+rezerwaty O
+w O
+Parku B-nam_loc_land
+Krajobrazowym I-nam_loc_land
+Doliny I-nam_loc_land
+Baryczy I-nam_loc_land
+. O
+
+# sent_id = 12065
+Nawłoć O
+kanadyjska B-nam_adj_country
+
+# sent_id = 12066
+Nawłoć O
+kanadyjska B-nam_adj_country
+( O
+Solidago O
+canadensis O
+L O
+. O
+) O
+– O
+gatunek O
+rośliny O
+wieloletniej O
+, O
+należący O
+do O
+rodziny O
+astrowatych O
+. O
+
+# sent_id = 12067
+Nazwa O
+ludowa O
+: O
+" O
+Drzewko O
+Matki B-nam_liv_person
+Boskiej I-nam_liv_person
+" O
+. O
+
+# sent_id = 12068
+Pochodzi O
+z O
+wschodniej O
+części O
+Ameryki B-nam_loc_land_continent
+Północnej I-nam_loc_land_continent
+. O
+
+# sent_id = 12069
+Jako O
+uciekinier O
+z O
+upraw O
+rozprzestrzenił O
+siÄ™ O
+w O
+Europie B-nam_loc_land_continent
+. O
+
+# sent_id = 12070
+W O
+Polsce B-nam_loc_gpe_country
+rośnie O
+na O
+większości O
+terytorium O
+na O
+siedliskach O
+naturalnych O
+i O
+synantropijnych O
+. O
+
+# sent_id = 12071
+Status O
+gatunku O
+w O
+polskiej O
+florze O
+: O
+kenofit O
+, O
+agriofit O
+. O
+
+# sent_id = 12072
+Prawdopodobnie O
+rozprzestrzeniła O
+siÄ™ O
+z O
+uprawy O
+roślin O
+ozdobnych O
+, O
+doskonale O
+aklimatyzuje O
+siÄ™ O
+i O
+zaczyna O
+nawet O
+wypierać O
+gatunki O
+rodzime O
+. O
+
+# sent_id = 12073
+Specjaliści O
+uważają O
+, O
+że O
+z O
+tego O
+powodu O
+powinna O
+być O
+zwalczana O
+. O
+
+# sent_id = 12074
+Morfologia O
+
+# sent_id = 12075
+; O
+Łodyga O
+: O
+Wysokość O
+do O
+1 O
+, O
+5 O
+m O
+, O
+wzniesiona O
+, O
+sztywna O
+, O
+pojedyncza O
+, O
+naga O
+lub O
+rzadko O
+owłosiona O
+, O
+cienka O
+. O
+
+# sent_id = 12076
+WewnÄ…trz O
+jest O
+pusta O
+. O
+
+# sent_id = 12077
+; O
+Liście O
+: O
+Podługowatolancetowate O
+albo O
+lancetowate O
+, O
+o O
+zaostrzonych O
+końcach O
+, O
+brzegi O
+ostro O
+piłkowane O
+. O
+
+# sent_id = 12078
+Po O
+liściach O
+najłatwiej O
+odróżnić O
+jÄ… O
+od O
+podobnego O
+gatunku O
+– O
+nawłoci O
+pospolitej O
+. O
+
+# sent_id = 12079
+Wszystkie O
+liście O
+z O
+rzadka O
+owłosione O
+, O
+zmniejszajÄ…ce O
+siÄ™ O
+ku O
+wierzchołkowi O
+Å‚odygi O
+. O
+
+# sent_id = 12080
+; O
+Kwiaty O
+: O
+Drobne O
+, O
+żółte O
+, O
+zebrane O
+w O
+koszyczki O
+( O
+od O
+5 O
+do O
+14 O
+kwiatków O
+w O
+jednym O
+koszyczku O
+) O
+, O
+a O
+te O
+w O
+wiechowate O
+kwiatostany O
+na O
+szczycie O
+Å‚odygi O
+. O
+
+# sent_id = 12081
+Listki O
+okrywy O
+kwiatostanu O
+stępione O
+, O
+bardzo O
+nierówne O
+, O
+lancetowatego O
+kształtu O
+. O
+
+# sent_id = 12082
+; O
+Owoc O
+: O
+Niełupki O
+z O
+puchem O
+kielichowym O
+. O
+
+# sent_id = 12083
+; O
+KÅ‚Ä…cze O
+: O
+Silnie O
+rozgałęzione O
+. O
+
+# sent_id = 12084
+Biologia O
+i O
+ekologia O
+
+# sent_id = 12085
+Siedlisko O
+: O
+aluwia O
+nadrzeczne O
+, O
+rowy O
+melioracyjne O
+, O
+mokre O
+Å‚Ä…ki O
+. O
+
+# sent_id = 12086
+W O
+klasyfikacji O
+zbiorowisk O
+roślinnych O
+gatunek O
+charakterystyczny O
+dla O
+zespołu O
+Ass O
+. O
+
+# sent_id = 12087
+Rudbeckio O
+- O
+Solidaginetium O
+. O
+
+# sent_id = 12088
+Kwiaty O
+przedprÄ…tne O
+, O
+zapylane O
+przez O
+motyle O
+i O
+błonkówki O
+. O
+
+# sent_id = 12089
+Roślina O
+miododajna O
+. O
+
+# sent_id = 12090
+Kwitnie O
+od O
+lipca O
+do O
+sierpnia O
+. O
+
+# sent_id = 12091
+Nasiona O
+rozsiewane O
+przez O
+wiatr O
+. O
+
+# sent_id = 12092
+Roślina O
+trujÄ…ca O
+: O
+Podobnie O
+jak O
+nawłoć O
+pospolita O
+jest O
+rośliną O
+szkodliwÄ… O
+dla O
+bydła O
+domowego O
+. O
+
+# sent_id = 12093
+Stosowana O
+w O
+odpowiednich O
+dawkach O
+posiada O
+też O
+podobne O
+właściwości O
+lecznicze O
+. O
+
+# sent_id = 12094
+Zastosowanie O
+
+# sent_id = 12095
+Jest O
+uprawiana O
+jako O
+roślina O
+ozdobna O
+. O
+
+# sent_id = 12096
+Ciekawostki O
+
+# sent_id = 12097
+Indianie B-nam_org_nation
+Odżibwejowie I-nam_org_nation
+robili O
+lewatywy O
+z O
+korzeni O
+nawłoci O
+. O
+
+# sent_id = 12098
+Z O
+ziela O
+i O
+korzeni O
+sporzÄ…dzali O
+wyciÄ…gi O
+, O
+które O
+używali O
+wewnętrznie O
+jako O
+środki O
+pobudzajÄ…ce O
+i O
+wzmacniajÄ…ce O
+. O
+
+# sent_id = 12099
+Indianie B-nam_org_nation
+Alabama I-nam_org_nation
+używali O
+herbatki O
+z O
+nawłoci O
+do O
+leczenia O
+przeziębień O
+, O
+zaÅ› O
+zewnętrznie O
+do O
+leczenia O
+obolałych O
+miejsc O
+. O
+
+# sent_id = 0
+RoboRally B-nam_pro_title
+czy O
+Wysokie B-nam_pro_title
+napięcie I-nam_pro_title
+? O
+
+# sent_id = 1
+Ponieważ O
+nie O
+mamy O
+ostatnio O
+czasu O
+grać O
+w O
+żadne O
+gry O
+, O
+czas O
+kupić O
+nowÄ… O
+. O
+
+# sent_id = 2
+Zawsze O
+jest O
+to O
+jakaÅ› O
+dodatkowa O
+motywacja O
+do O
+ściągnięcia O
+znajomych O
+. O
+
+# sent_id = 3
+Roboty B-nam_pro_title
+majÄ… O
+kilkanaście O
+lat O
+i O
+pochodzÄ… O
+z O
+USA B-nam_loc_gpe_country
+, O
+Wysokie B-nam_pro_title
+napięcie I-nam_pro_title
+jest O
+dużo O
+młodsze O
+, O
+powstało O
+w O
+Niemczech B-nam_loc_gpe_country
+. O
+
+# sent_id = 4
+Do O
+robotów O
+zachęca O
+demo O
+, O
+w O
+którym O
+na O
+próbę O
+można O
+sobie O
+robota O
+zaprogramować O
+, O
+do O
+napięcia O
+dodatkowa O
+plansza O
+z O
+EuropÄ… B-nam_loc_land_region
+środkową I-nam_loc_land_region
+. O
+
+# sent_id = 5
+Dodatkowa O
+oznacza O
+dodatkowy O
+wydatek O
+. O
+
+# sent_id = 6
+Można O
+go O
+uniknąć O
+decydujÄ…c O
+siÄ™ O
+na O
+grÄ™ O
+w O
+USA B-nam_loc_gpe_country
+lub O
+w O
+Niemczech B-nam_loc_gpe_country
+( O
+dwa O
+największe O
+rynki O
+gier O
+planszowych O
+. O
+. O
+. O
+) O
+. O
+
+# sent_id = 7
+W O
+sumie O
+skoro O
+już O
+zbudowali O
+śmy O
+w O
+Stanach B-nam_loc_gpe_country
+linie O
+kolejowe O
+, O
+może O
+czas O
+na O
+elektryfikacjÄ™ O
+? O
+
+# sent_id = 8
+Za O
+robotami O
+przemawia O
+zapowiedź O
+kompletnego O
+chaosu O
+, O
+co O
+po O
+dopracowanych O
+do O
+ostatniego O
+szczegółu O
+i O
+uporzÄ…dkowanych O
+grach O
+niemieckich B-nam_adj_country
+może O
+być O
+miłą O
+odmianÄ… O
+. O
+
+# sent_id = 9
+W O
+Wysokim B-nam_pro_title
+napięciu I-nam_pro_title
+szans O
+na O
+robienie O
+drugiemu O
+co O
+tobie O
+niemiłe O
+jakby O
+mniej O
+, O
+szczęście O
+też O
+chyba O
+odgrywa O
+mniejszÄ… O
+rolÄ™ O
+. O
+
+# sent_id = 10
+Zamiast O
+laserów O
+atmosferÄ™ O
+podgrzewajÄ… O
+aukcje O
+surowców O
+, O
+choć O
+sÄ… O
+elektrownie O
+, O
+których O
+problem O
+zaopatrzenia O
+nie O
+dotyczy O
+. O
+
+# sent_id = 11
+Nie O
+minęło O
+wiele O
+czasu O
+od O
+Nagrody B-nam_pro_award
+Nobla I-nam_pro_award
+, O
+gdy O
+pani O
+Jelinek B-nam_liv_person
+znów O
+zrobiła O
+siÄ™ O
+trochÄ™ O
+zapomniana O
+. O
+
+# sent_id = 12
+ZresztÄ… O
+nagrodÄ™ O
+też O
+jej O
+przyznano O
+jakoÅ› O
+tak O
+półgębkiem O
+i O
+przy O
+akompaniamencie O
+szowinistycznych O
+wyzwisk O
+. O
+
+# sent_id = 13
+Weźmy O
+takÄ… O
+PianistkÄ™ B-nam_pro_title_book
+- O
+nie O
+jest O
+to O
+raczej O
+książka O
+do O
+omówienia O
+przy O
+rodzinnym O
+obiedzie O
+u O
+wujostwa O
+. O
+
+# sent_id = 14
+Nie O
+porusza O
+tematów O
+górnolotnych O
+, O
+przy O
+których O
+dobrze O
+upozować O
+siÄ™ O
+na O
+człowieka O
+wrażliwego O
+i O
+przenikliwego O
+, O
+gdzieÅ› O
+pomiędzy O
+kaczkÄ… O
+z O
+jabłkami O
+a O
+likierem O
+. O
+
+# sent_id = 15
+Porusza O
+tematy O
+bolesne O
+i O
+ciemne O
+, O
+przy O
+czym O
+porusza O
+je O
+uwodzicielsko O
+, O
+dawkuje O
+napięcie O
+i O
+sprawnie O
+snuje O
+historiÄ™ O
+. O
+
+# sent_id = 16
+Tworzy O
+ponurÄ… O
+i O
+złożoną O
+strukturÄ™ O
+powiązań O
+między O
+bohaterami O
+, O
+którą O
+później O
+równie O
+ponuro O
+i O
+w O
+napięciu O
+rozplÄ…tuje O
+. O
+
+# sent_id = 17
+I O
+co O
+to O
+w O
+ogóle O
+ma O
+znaczyć O
+, O
+że O
+nie O
+można O
+siÄ™ O
+oderwać O
+od O
+powieści O
+o O
+przemocy O
+psychicznej O
+i O
+napięciu O
+seksualnym O
+! O
+
+# sent_id = 18
+Co O
+więcej O
+, O
+można O
+jeszcze O
+uznać O
+, O
+że O
+historia O
+ta O
+jest O
+czymÅ› O
+więcej O
+niż O
+historiÄ… O
+tych O
+konkretnie O
+postaci O
+, O
+że O
+pokazuje O
+pewne O
+uniwersalne O
+sytuacje O
+( O
+jak O
+to O
+z O
+dobrÄ… O
+literaturÄ… O
+czasem O
+bywa O
+) O
+. O
+
+# sent_id = 19
+Oj O
+, O
+biada O
+. O
+
+# sent_id = 20
+To O
+może O
+obrzydzić O
+nam O
+deser O
+, O
+lub O
+sprawić O
+, O
+że O
+zamyślimy O
+siÄ™ O
+tak O
+, O
+że O
+nam O
+herbata O
+wystygnie O
+. O
+
+# sent_id = 21
+Jelinek B-nam_liv_person
+jest O
+jak O
+piękny O
+but O
+, O
+który O
+ciśnie O
+. O
+
+# sent_id = 22
+Zamiast O
+trzymać O
+takie O
+buty O
+na O
+widoku O
+i O
+cierpieć O
+z O
+powodu O
+pytań O
+: O
+
+# sent_id = 23
+O O
+, O
+jakie O
+piękne O
+, O
+czemu O
+ich O
+nie O
+nosisz O
+? O
+
+# sent_id = 24
+- O
+lepiej O
+wyrzucić O
+je O
+na O
+śmietnik O
+i O
+zapomnieć O
+. O
+
+# sent_id = 25
+Chyba O
+, O
+że O
+przypadkiem O
+będzie O
+tam O
+buszował O
+jakiÅ› O
+niepoważny O
+szwedzki B-nam_adj_country
+akademik O
+. O
+
+# sent_id = 26
+W O
+polskiej B-nam_adj_country
+lidze O
+koszykarzy O
+rozpoczęła O
+siÄ™ O
+faza O
+play O
+- O
+off O
+, O
+co O
+oznacza O
+, O
+że O
+mecze O
+sÄ… O
+często O
+, O
+nadszedł O
+czas O
+weteranów O
+itd O
+. O
+
+# sent_id = 27
+Częste O
+mecze O
+to O
+częste O
+wizyty O
+na O
+stronie O
+ligi O
+. O
+
+# sent_id = 28
+Dlaczego O
+więc O
+na O
+tym O
+nie O
+skorzystać O
+i O
+nie O
+wprowadzić O
+nagle O
+rejestracji O
+użytkowników O
+? O
+
+# sent_id = 29
+Ograniczenie O
+dostępu O
+nie O
+dotyczy O
+wszystkich O
+informacji O
+na O
+stronie O
+, O
+ale O
+mimo O
+to O
+jest O
+ciosem O
+poniżej O
+pasa O
+. O
+
+# sent_id = 30
+OglÄ…dasz O
+serial O
+? O
+
+# sent_id = 31
+Wszystko O
+wyjaśni O
+siÄ™ O
+w O
+ostatnim O
+odcinku O
+? O
+
+# sent_id = 32
+To O
+płać O
+. O
+
+# sent_id = 33
+Oczywiście O
+rejestracja O
+jest O
+zupełnie O
+bezpłatna O
+. O
+
+# sent_id = 34
+W O
+końcu O
+moje O
+imiÄ™ O
+i O
+nazwisko O
+, O
+telefon O
+, O
+adres O
+domowy O
+i O
+zgoda O
+na O
+otrzymywanie O
+spamu O
+od O
+sponsora O
+ligi O
+nie O
+sÄ… O
+nic O
+warte O
+. O
+
+# sent_id = 35
+Chcesz O
+posłuchać O
+mądrości O
+Radka B-nam_liv_person
+Hyżego I-nam_liv_person
+, O
+to O
+poczytaj O
+o O
+najnowszej O
+karcie O
+kredytowej O
+. O
+
+# sent_id = 36
+Czy O
+wypowiedzi O
+Radosława B-nam_liv_person
+sÄ… O
+dla O
+mnie O
+warte O
+więcej O
+niż O
+dla O
+banku O
+dane O
+o O
+moich O
+dochodach O
+( O
+te O
+akurat O
+podaje O
+siÄ™ O
+opcjonalnie O
+) O
+? O
+
+# sent_id = 37
+Czy O
+skoro O
+i O
+tak O
+dostajÄ™ O
+tyle O
+spamu O
+( O
+zamówionego O
+i O
+niezamówionego O
+) O
+, O
+to O
+czemu O
+jeszcze O
+jedno O
+źródło O
+miało O
+by O
+mi O
+zaszkodzić O
+? O
+
+# sent_id = 38
+DodajÄ™ O
+tutaj O
+parÄ™ O
+dalszych O
+informacji O
+o O
+mnie O
+i O
+o O
+blogu O
+, O
+w O
+postaci O
+Å‚atwej O
+do O
+czytania O
+ankiety O
+" O
+pytanie O
+i O
+odpowiedź O
+" O
+: O
+) O
+Kim O
+jest O
+autorka O
+tego O
+bloga O
+, O
+gdzie O
+mieszka O
+, O
+z O
+kim O
+, O
+dlaczego O
+i O
+po O
+co O
+? O
+
+# sent_id = 39
+Kto O
+wie O
+? O
+
+# sent_id = 40
+Mieszkam O
+na O
+Plejadach B-nam_loc_astronomical
+, O
+włóczę O
+siÄ™ O
+po O
+świecie O
+, O
+mąż O
+blisko O
+mnie O
+albo O
+daleko O
+, O
+zależy O
+jak O
+go O
+praca O
+pogoni O
+, O
+i O
+czy O
+wolno O
+mi O
+z O
+nim O
+jechać O
+( O
+ze O
+względu O
+na O
+zdrowie O
+) O
+. O
+
+# sent_id = 41
+Od O
+lat O
+już O
+moje O
+raczej O
+stałe O
+miejsca O
+pobytu O
+sÄ… O
+poza O
+PolskÄ… B-nam_loc_gpe_country
+. O
+
+# sent_id = 42
+A O
+po O
+za O
+tym O
+, O
+bardzo O
+ceniÄ™ O
+ochronÄ™ O
+sfery O
+prywatnej O
+. O
+
+# sent_id = 43
+Wiem O
+że O
+to O
+w O
+czasach O
+internetowo O
+- O
+multimedialnych O
+prawie O
+niemożliwe O
+. O
+
+# sent_id = 44
+Ale O
+mimo O
+wszystko O
+próbuję O
+. O
+
+# sent_id = 45
+Co O
+to O
+ma O
+znaczyć O
+" O
+prawie O
+wegetarianka O
+" O
+, O
+jest O
+to O
+wege O
+blog O
+czy O
+nie O
+? O
+
+# sent_id = 46
+To O
+jest O
+mój O
+prywatny O
+blog O
+o O
+tematach O
+kuchennych O
+, O
+bajecznych O
+i O
+innych O
+. O
+
+# sent_id = 47
+Zwykle O
+kuchennych O
+i O
+do O
+tego O
+zwiÄ…zanych O
+. O
+
+# sent_id = 48
+Bo O
+kuchnia O
+to O
+serce O
+domu O
+( O
+i O
+przede O
+wszystkim O
+osoba O
+lub O
+osoby O
+które O
+w O
+tej O
+kuchni O
+gotujÄ… O
+) O
+, O
+a O
+dom O
+to O
+poczÄ…tek O
+życia O
+człowieka O
+. O
+
+# sent_id = 49
+Ja O
+sama O
+jestem O
+praktycznie O
+100 O
+% O
+wege O
+- O
+wegan O
+( O
+przede O
+wszystkim O
+z O
+powodów O
+zdrowotnych O
+, O
+ale O
+nie O
+tylko O
+) O
+. O
+
+# sent_id = 50
+Jedynie O
+nie O
+lubiÄ™ O
+fanatyzmu O
+, O
+wszystko O
+jedno O
+w O
+którym O
+kierunku O
+( O
+więcej O
+o O
+tym O
+tutaj O
+) O
+Mąż O
+nie O
+jest O
+wegetarianinem O
+. O
+
+# sent_id = 51
+Co O
+to O
+znaczy O
+" O
+z O
+powodów O
+zdrowotnych O
+" O
+, O
+o O
+jakÄ… O
+chorobÄ™ O
+chodzi O
+? O
+
+# sent_id = 52
+To O
+niestety O
+nie O
+jest O
+tylko O
+jedna O
+choroba O
+, O
+to O
+mieszanka O
+paru O
+chorób O
+i O
+lekarze O
+do O
+dziÅ› O
+siÄ™ O
+kłócą O
+która O
+jest O
+która O
+, O
+gdzie O
+i O
+dlaczego O
+: O
+/ O
+Główną O
+częścią O
+jest O
+choroba O
+częściowo O
+zapalna O
+, O
+reumatyczna O
+i O
+anty O
+- O
+komórkowa O
+, O
+która O
+niszczy O
+organizm O
+od O
+środka O
+podobnie O
+do O
+raka O
+, O
+i O
+według O
+" O
+nowoczesnych O
+" O
+lekarzy O
+jest O
+nieuleczalna O
+. O
+
+# sent_id = 53
+JedynÄ… O
+" O
+opcjÄ… O
+" O
+dla O
+mnie O
+było O
+by O
+Å‚ykanie O
+setek O
+agresywnych O
+" O
+lekarstw O
+" O
+, O
+które O
+by O
+mnie O
+nawet O
+nie O
+wyleczyły O
+, O
+ani O
+bólów O
+nie O
+zatrzymały O
+, O
+jedynie O
+trzymały O
+w O
+stanie O
+pół O
+umarłym O
+. O
+
+# sent_id = 54
+Albo O
+i O
+nawet O
+ta O
+sama O
+chemio O
+- O
+terapia O
+jak O
+w O
+przypadku O
+raka O
+: O
+/ O
+( O
+ale O
+bez O
+żadnej O
+szansy O
+na O
+wyleczenie O
+) O
+. O
+
+# sent_id = 55
+Ale O
+ja O
+przecież O
+żyć O
+chcÄ™ O
+i O
+muszÄ™ O
+! O
+
+# sent_id = 56
+Więc O
+siÄ™ O
+sama O
+wzięła O
+m O
+za O
+to O
+, O
+i O
+po O
+wielu O
+latach O
+dosłownych O
+męk O
+i O
+ryzykowania O
+własnego O
+życia O
+znalazła O
+m O
+wiele O
+odpowiedzi O
+na O
+pytania O
+, O
+na O
+które O
+nawet O
+lekarze O
+mi O
+nie O
+odpowiadali O
+: O
+) O
+. O
+
+# sent_id = 57
+Ratuje O
+mnie O
+codziennie O
+magia O
+przyrody O
+, O
+i O
+jedzenia O
+prosto O
+od O
+przyrody O
+pochodzÄ…cego O
+: O
+) O
+. O
+
+# sent_id = 58
+Czy O
+w O
+tym O
+blogu O
+będzie O
+pisanie O
+o O
+chorobach O
+, O
+lekarzach O
+i O
+szpitalach O
+? O
+
+# sent_id = 59
+Absolutnie O
+nie O
+: O
+/ O
+Chyba O
+tylko O
+gdy O
+o O
+tym O
+napisać O
+muszÄ™ O
+, O
+bo O
+to O
+zatrzymuje O
+blogowanie O
+, O
+w O
+stylu O
+" O
+mam O
+właśnie O
+grypÄ™ O
+i O
+nie O
+będzie O
+mnie O
+tutaj O
+" O
+itp O
+. O
+
+# sent_id = 60
+Mam O
+bardzo O
+wielkÄ… O
+nadziejÄ™ O
+że O
+nigdy O
+tu O
+nic O
+o O
+żadnym O
+szpitalu O
+nie O
+będę O
+pisać O
+, O
+chyba O
+że O
+by O
+śmy O
+wreszcie O
+dziecko O
+mieli O
+, O
+ale O
+i O
+to O
+mnie O
+nie O
+zmusi O
+do O
+pisania O
+o O
+szpitalach O
+. O
+
+# sent_id = 61
+Tylko O
+spowoduje O
+otwarcie O
+blogu O
+specjalnie O
+dla O
+malucha O
+: O
+) O
+. O
+
+# sent_id = 62
+Ja O
+ten O
+( O
+i O
+poprzedni O
+) O
+blog O
+zaczęła O
+m O
+aby O
+właśnie O
+pomóc O
+sobie O
+skończyć O
+z O
+jakimikolwiek O
+chorobami O
+, O
+na O
+zawsze O
+. O
+
+# sent_id = 63
+Ja O
+tu O
+piszÄ™ O
+o O
+dobrych O
+rzeczach O
+: O
+słońcu O
+, O
+przyrodzie O
+, O
+dobrej O
+kuchni O
+, O
+poezji O
+, O
+bajkach O
+, O
+fantazji O
+, O
+muzyce O
+, O
+sztuce O
+, O
+dzieciach O
+, O
+humorze O
+. O
+. O
+. O
+
+# sent_id = 64
+O O
+mężu O
+mniej O
+, O
+aby O
+chronić O
+jego O
+sferÄ™ O
+prywatnÄ… O
+i O
+szczególnie O
+pracÄ™ O
+. O
+
+# sent_id = 65
+Od O
+kiedy O
+blogujÄ™ O
+bardziej O
+prywatnie O
+i O
+ostrożnie O
+mąż O
+przestał O
+siÄ™ O
+tak O
+gniewać O
+, O
+i O
+nawet O
+częściej O
+moje O
+blogi O
+odwiedza O
+( O
+co O
+mnie O
+bardzo O
+ucieszyło O
+! O
+) O
+. O
+
+# sent_id = 66
+SkÄ…d O
+pochodzÄ… O
+zdjęcia O
+w O
+blogu O
+? O
+
+# sent_id = 67
+Większość O
+z O
+nich O
+jest O
+z O
+Wikimedii B-nam_pro_media_web
+, O
+z O
+Flickr B-nam_pro_media_web
+Creative B-nam_pro_title_treaty
+Commons I-nam_pro_title_treaty
+albo O
+z O
+Google B-nam_pro_media_web
+Obrazy I-nam_pro_media_web
+Creative B-nam_pro_title_treaty
+Commons I-nam_pro_title_treaty
+. O
+
+# sent_id = 68
+Część O
+jest O
+moja O
+własna O
+. O
+
+# sent_id = 69
+Staram O
+siÄ™ O
+nie O
+dodawać O
+tu O
+żadnych O
+zdjęć O
+ani O
+obrazów O
+bez O
+otwartej O
+( O
+publicznej O
+) O
+licencji O
+. O
+
+# sent_id = 70
+Jeśli O
+siÄ™ O
+to O
+nie O
+udaje O
+to O
+sÄ… O
+zwykle O
+zdjęcia O
+ogólnie O
+publikowane O
+tysiÄ…ce O
+razy O
+w O
+internecie O
+. O
+
+# sent_id = 71
+Nigdy O
+nie O
+zabieram O
+nikomu O
+jego O
+prywatnych O
+, O
+blogowych O
+albo O
+podobnych O
+zdjęć O
+, O
+i O
+nigdy O
+nie O
+udajÄ™ O
+że O
+coÅ› O
+co O
+nie O
+moje O
+jest O
+moje O
+! O
+
+# sent_id = 72
+Mój O
+blog O
+jest O
+prywatny O
+, O
+nie O
+jestem O
+ani O
+firma O
+, O
+ani O
+biznes O
+ani O
+nic O
+, O
+nikomu O
+nic O
+nie O
+niszczÄ™ O
+ani O
+nie O
+zabieram O
+, O
+ani O
+nie O
+mam O
+żadnych O
+master O
+planów O
+do O
+podboju O
+wszechświata O
+: O
+) O
+. O
+
+# sent_id = 73
+Co O
+to O
+jest O
+" O
+Licencja O
+Creative B-nam_pro_title_treaty
+Commons I-nam_pro_title_treaty
+" O
+? O
+
+# sent_id = 74
+Nie O
+ma O
+praw O
+autorskich O
+? O
+
+# sent_id = 75
+Spokojnie O
+, O
+sÄ… O
+prawa O
+autorskie O
+- O
+podstawowe O
+: O
+) O
+Znaczy O
+siÄ™ O
+że O
+jeżeli O
+ja O
+zrobiÄ™ O
+zdjęcie O
+, O
+jak O
+np O
+to O
+tutaj O
+: O
+. O
+. O
+to O
+jest O
+to O
+zdjęcie O
+mojego O
+autorstwa O
+i O
+to O
+autorstwo O
+nie O
+znika O
+: O
+) O
+. O
+
+# sent_id = 76
+Ale O
+ja O
+po O
+prostu O
+decydujÄ™ O
+że O
+to O
+zdjęcie O
+może O
+każdy O
+kto O
+chce O
+używac O
+, O
+kiedy O
+chce O
+i O
+do O
+czego O
+chce O
+, O
+również O
+komercjalnie O
+. O
+
+# sent_id = 77
+Na O
+tym O
+polega O
+moja O
+licencja O
+: O
+) O
+. O
+
+# sent_id = 78
+Nie O
+zezłoszczę O
+siÄ™ O
+ani O
+nic O
+jeśli O
+ktoÅ› O
+nie O
+pamięta O
+mojego O
+adresu O
+i O
+tylko O
+wie O
+że O
+Creative B-nam_pro_title_treaty
+Commons I-nam_pro_title_treaty
+, O
+jedynie O
+w O
+przypadku O
+użycia O
+komercjalnego O
+proszÄ™ O
+o O
+zawsze O
+dodanie O
+linku O
+albo O
+podpisu O
+z O
+adresem O
+mojego O
+bloga O
+. O
+
+# sent_id = 79
+IstniejÄ… O
+różne O
+wersje O
+licencji O
+Creative B-nam_pro_title_treaty
+Commons I-nam_pro_title_treaty
+i O
+należy O
+trzymać O
+siÄ™ O
+tego O
+co O
+autor O
+albo O
+autorka O
+mówi O
+. O
+
+# sent_id = 80
+Co O
+siÄ™ O
+stało O
+z O
+poprzednim O
+blogiem O
+" O
+Kuchenka B-nam_pro_title
+Internetowa I-nam_pro_title
+" O
+? O
+
+# sent_id = 81
+TÅ‚umaczÄ™ O
+to O
+tutaj O
+. O
+
+# sent_id = 82
+Blog O
+zostaje O
+, O
+tyle O
+tylko O
+że O
+jako O
+strona O
+statyczna O
+, O
+bez O
+dalszych O
+wpisów O
+. O
+
+# sent_id = 83
+Wszystkie O
+przepisy O
+i O
+linki O
+i O
+zdjęcia O
+też O
+sÄ… O
+. O
+
+# sent_id = 84
+Ale O
+główna O
+strona O
+to O
+teraz O
+Kuchenne B-nam_pro_title
+bajki I-nam_pro_title
+: O
+) O
+( O
+czyli O
+ta O
+w O
+której O
+właśnie O
+jesteÅ› O
+) O
+. O
+
+# sent_id = 85
+Czemu O
+nagłówek O
+bloga O
+jest O
+taki O
+zimowy O
+i O
+niekulinarny O
+? O
+
+# sent_id = 86
+Bo O
+teraz O
+jest O
+zima O
+: O
+) O
+. O
+
+# sent_id = 87
+Ja O
+zmieniam O
+nagłówki O
+z O
+porami O
+roku O
+, O
+mój O
+poprzedni O
+( O
+nieaktywny O
+) O
+blog O
+ma O
+np O
+. O
+nadal O
+nagłówek O
+jesienny O
+, O
+bo O
+skończyła O
+m O
+tam O
+pisać O
+na O
+jesieni O
+. O
+
+# sent_id = 88
+Czyli O
+z O
+poczÄ…tkiem O
+wiosny O
+będzie O
+tu O
+nagłówek O
+wiosenny O
+, O
+potem O
+letni O
+itd O
+. O
+
+# sent_id = 89
+Zamierzam O
+również O
+nieco O
+przystosowywać O
+kolory O
+bloga O
+do O
+pór O
+roku O
+: O
+) O
+. O
+
+# sent_id = 90
+A O
+niekulinarny O
+jest O
+dlatego O
+, O
+bo O
+ja O
+kocham O
+przyrodÄ™ O
+nawet O
+bardziej O
+niż O
+kuchniÄ™ O
+, O
+i O
+bardzo O
+pragnęła O
+m O
+mieć O
+choć O
+trochÄ™ O
+przyrody O
+w O
+blogu O
+: O
+) O
+. O
+
+# sent_id = 91
+Ben B-nam_liv_person
+Vershbow I-nam_liv_person
+na O
+blogu O
+if B-nam_pro_title
+: I-nam_pro_title
+book I-nam_pro_title
+opisuje O
+rozwój O
+projektu O
+Google B-nam_pro_software
+Books I-nam_pro_software
+, O
+który O
+umożliwia O
+już O
+nie O
+tylko O
+przeglÄ…danie O
+zeskanowanych O
+w O
+ramach O
+projektu O
+książek O
+, O
+ale O
+też O
+przeglÄ…danie O
+informacji O
+o O
+książkach O
+, O
+których O
+skany O
+sÄ… O
+jeszcze O
+niedostępne O
+. O
+
+# sent_id = 92
+Vershbow B-nam_liv_person
+zauważa O
+, O
+że O
+w O
+takiej O
+postaci O
+Google B-nam_pro_software
+Books I-nam_pro_software
+, O
+podobnie O
+jak O
+katalog O
+Amazon B-nam_pro_media_web
+, O
+stajÄ… O
+siÄ™ O
+cennym O
+źródłem O
+bibliograficznym O
+. O
+
+# sent_id = 93
+Problem O
+w O
+tym O
+, O
+że O
+nie O
+sÄ… O
+to O
+źródła O
+otwarte O
+. O
+
+# sent_id = 94
+StÄ…d O
+pomysł O
+, O
+by O
+połączyć O
+razem O
+różnorakie O
+źródła O
+– O
+biorÄ…c O
+choćby O
+opisy O
+tytułów O
+z O
+Wikipedii B-nam_pro_media_web
+– O
+w O
+jeden O
+“ O
+Katalog B-nam_pro_media_web
+Społeczny I-nam_pro_media_web
+” O
+( O
+People B-nam_pro_media_web
+’ I-nam_pro_media_web
+s I-nam_pro_media_web
+Card I-nam_pro_media_web
+Catalogue I-nam_pro_media_web
+) O
+. O
+
+# sent_id = 95
+Katalog O
+ten O
+był O
+by O
+swobodnie O
+dostępny O
+, O
+także O
+do O
+edycji O
+, O
+a O
+w O
+nim O
+każda O
+książka O
+posiadała O
+by O
+własną O
+stronÄ™ O
+, O
+na O
+której O
+można O
+by O
+rozwijać O
+jej O
+opisy O
+, O
+toczyć O
+dyskusje O
+, O
+itd O
+. O
+
+# sent_id = 96
+“ O
+Jak O
+na O
+razie O
+Google B-nam_org_company
+prowadzi O
+w O
+budowaniu O
+nowoczesnego O
+systemu O
+bibliograficznego O
+. O
+
+# sent_id = 97
+Przez O
+to O
+katalog O
+tytułów O
+przyszłości O
+stanie O
+siÄ™ O
+równocześnie O
+źródłem O
+znaczÄ…cych O
+zysków O
+reklamowych O
+. O
+
+# sent_id = 98
+Niech O
+Google B-nam_org_company
+robi O
+swoje O
+– O
+ale O
+czy O
+nie O
+mogli O
+by O
+śmy O
+stworzyć O
+czegoÅ› O
+lepszego O
+? O
+” O
+
+# sent_id = 99
+Vershbow B-nam_liv_person
+zwraca O
+uwagÄ™ O
+na O
+kluczowÄ… O
+kwestiÄ™ O
+– O
+że O
+niezbędne O
+sÄ… O
+niekomercyjne O
+, O
+otwarte O
+alternatywy O
+dla O
+działań O
+dygitalizacyjnych O
+podejmowanych O
+dziÅ› O
+przede O
+wszystkim O
+przez O
+komercyjne O
+firmy O
+. O
+
+# sent_id = 123
+Otrzymali O
+śmy O
+patronat O
+PAN B-nam_org_organization
+
+# sent_id = 124
+Z O
+przyjemnością O
+informujemy O
+, O
+że O
+nasz O
+projekt O
+został O
+objęty O
+honorowym O
+patronatem O
+przez O
+PolskÄ… B-nam_org_organization
+AkademiÄ™ I-nam_org_organization
+Nauk I-nam_org_organization
+. O
+
+# sent_id = 125
+Na O
+podstawie O
+pytań O
+zgłaszanych O
+przez O
+osoby O
+, O
+z O
+którymi O
+rozmawiamy O
+o O
+projekcie O
+, O
+przygotowali O
+śmy O
+zbiór O
+pytań O
+i O
+odpowiedzi O
+zwiÄ…zanych O
+z O
+projektem O
+“ O
+Otwórz B-nam_eve_human
+książkę I-nam_eve_human
+” O
+. O
+
+# sent_id = 126
+Dokument O
+skierowany O
+jest O
+do O
+autorów O
+chcÄ…cych O
+udostępnić O
+swoje O
+książki O
+w O
+ramach O
+projektu O
+, O
+jego O
+współpracowników O
+, O
+oraz O
+wszystkich O
+osób O
+zainteresowanych O
+udziałem O
+w O
+projekcie O
+. O
+
+# sent_id = 127
+19 O
+grudnia O
+2008 O
+roku O
+odbyło O
+siÄ™ O
+pierwsze O
+nasze O
+spotkanie O
+ze O
+współpracownikami O
+projektu O
+„ O
+Otwórz B-nam_eve_human
+książkę I-nam_eve_human
+” O
+. O
+
+# sent_id = 128
+W O
+spotkaniu O
+wzięli O
+udział O
+: O
+Marta B-nam_liv_person
+Zimniak I-nam_liv_person
+- I-nam_liv_person
+Hałajko I-nam_liv_person
+i O
+Zofia B-nam_liv_person
+Dworakowska I-nam_liv_person
+z O
+Instytutu B-nam_org_institution
+Kultury I-nam_org_institution
+Polskiej I-nam_org_institution
+na O
+UW B-nam_org_organization
+, O
+Jan B-nam_liv_person
+ZajÄ…c I-nam_liv_person
+z O
+Wydziału B-nam_org_institution
+Psychologii I-nam_org_institution
+UW B-nam_org_organization
+, O
+Paweł B-nam_liv_person
+Krzyworzeka I-nam_liv_person
+z O
+Instytutu B-nam_org_institution
+Etnologii I-nam_org_institution
+i I-nam_org_institution
+Antropologi I-nam_org_institution
+Kulturowej I-nam_org_institution
+UW B-nam_org_organization
+oraz O
+Michał B-nam_liv_person
+Piotr I-nam_liv_person
+Pręgowski I-nam_liv_person
+z O
+Politechniki B-nam_org_organization
+Warszawskiej I-nam_org_organization
+. O
+
+# sent_id = 129
+Na O
+spotkaniu O
+krótko O
+opowiedzieli O
+śmy O
+o O
+projekcie O
+i O
+porozmawiali O
+śmy O
+o O
+istotnych O
+kwestiach O
+– O
+takich O
+jak O
+prawne O
+aspekty O
+projektu O
+( O
+licencje O
+Creative B-nam_oth_license
+Commons I-nam_oth_license
+, O
+dozwolony O
+użytek O
+, O
+pola O
+eksploatacji O
+, O
+przejście O
+praw O
+etc O
+. O
+) O
+, O
+sposób O
+prezentacji O
+książek O
+w O
+Internecie B-nam_oth_tech
+( O
+kształt O
+serwisu O
+internetowego O
+, O
+formaty O
+, O
+w O
+których O
+będą O
+udostępniane O
+książki O
+, O
+strony O
+– O
+wizytówki O
+autorów O
+) O
+, O
+prawdopodobne O
+pytania O
+i O
+obawy O
+ze O
+strony O
+autorów O
+( O
+argumenty O
+za O
+wzięciem O
+udziału O
+w O
+projekcie O
+, O
+konsekwencje O
+udostępnienia O
+książki O
+w O
+wersji O
+elektronicznej O
+, O
+problem O
+plagiatów O
+) O
+, O
+relacje O
+między O
+cyfrowymi O
+wersjami O
+książek O
+a O
+obiegiem O
+wydawniczym O
+, O
+możliwość O
+włączenia O
+instytucji O
+, O
+z O
+którymi O
+sÄ… O
+zwiÄ…zani O
+współpracownicy O
+, O
+w O
+projekt O
+jako O
+jego O
+partnerów O
+. O
+
+# sent_id = 130
+Paweł B-nam_liv_person
+Krzyworzeka I-nam_liv_person
+opowiedział O
+o O
+ciekawym O
+projekcie O
+digitalizacji O
+czasopism O
+etnograficznych O
+, O
+który O
+prowadzi O
+w O
+Polskim B-nam_org_organization
+Instytucie I-nam_org_organization
+Antropologii I-nam_org_organization
+. O
+
+# sent_id = 131
+Celem O
+projektu O
+„ O
+Otwórz B-nam_eve_human
+książkę I-nam_eve_human
+” O
+jest O
+stworzenie O
+cyfrowej O
+kolekcji O
+współczesnych O
+książek O
+naukowych O
+, O
+udostępnionych O
+przez O
+autorów O
+. O
+
+# sent_id = 132
+W O
+jej O
+skład O
+wejdÄ… O
+również O
+książki O
+niedostępne O
+już O
+na O
+rynku O
+w O
+wersji O
+drukowanej O
+, O
+a O
+mimo O
+to O
+posiadajÄ…ce O
+wartość O
+naukowÄ… O
+i O
+edukacyjnÄ… O
+. O
+
+# sent_id = 133
+Chcemy O
+z O
+pomocÄ… O
+nowych O
+technologii O
+zwiększyć O
+dostępność O
+publikacji O
+naukowych O
+. O
+
+# sent_id = 134
+Ich O
+niskie O
+nakłady O
+drukiem O
+powodujÄ… O
+, O
+że O
+z O
+czasem O
+korzysta O
+siÄ™ O
+z O
+nich O
+rzadziej O
+, O
+niż O
+to O
+mogło O
+by O
+i O
+powinno O
+mieć O
+miejsce O
+. O
+
+# sent_id = 135
+Do O
+współpracy O
+w O
+projekcie O
+zapraszamy O
+samodzielnych O
+pracowników O
+naukowych O
+, O
+którzy O
+posiadajÄ… O
+prawa O
+autorskie O
+do O
+opublikowanych O
+przez O
+siebie O
+książek O
+. O
+
+# sent_id = 136
+Będą O
+one O
+udostępnione O
+w O
+internecie B-nam_oth_tech
+z O
+poszanowaniem O
+praw O
+autorów O
+i O
+na O
+zasadach O
+przez O
+nich O
+określonych O
+. O
+
+# sent_id = 137
+W O
+tym O
+celu O
+wykorzystamy O
+między O
+innymi O
+system O
+licencji O
+Creative B-nam_oth_license
+Commons I-nam_oth_license
+, O
+opartych O
+na O
+zasadzie O
+„ O
+Pewne O
+prawa O
+zastrzeżone O
+” O
+. O
+
+# sent_id = 138
+Projekt O
+„ O
+Otwórz B-nam_eve_human
+książkę I-nam_eve_human
+” O
+jest O
+prowadzony O
+przez O
+Interdyscyplinarne B-nam_org_institution
+Centrum I-nam_org_institution
+Modelowania I-nam_org_institution
+na O
+Uniwersytecie B-nam_org_organization
+Warszawskim I-nam_org_organization
+( O
+ICM B-nam_org_institution
+UW B-nam_org_organization
+) O
+, O
+w O
+ramach O
+projektów O
+Biblioteka B-nam_eve_human
+Wirtualna I-nam_eve_human
+Nauki I-nam_eve_human
+oraz O
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+Polska I-nam_org_organization
+. O
+
+# sent_id = 139
+Po O
+drugie O
+, O
+książki O
+z O
+naszej O
+kolekcji O
+, O
+które O
+sÄ… O
+dostępne O
+na O
+licencji O
+Creative B-nam_oth_license
+Commons I-nam_oth_license
+umieścili O
+śmy O
+– O
+na O
+mocy O
+licencji O
+– O
+w O
+serwisie O
+Scribd B-nam_pro_media_web
+. O
+
+# sent_id = 140
+Pozwala O
+on O
+publikować O
+w O
+sieci O
+PDFy B-nam_oth_tech
+, O
+które O
+sÄ… O
+widoczne O
+bezpośrednio O
+w O
+przeglÄ…darce O
+i O
+dajÄ… O
+siÄ™ O
+Å‚atwo O
+i O
+elegancko O
+umieszczać O
+na O
+innych O
+stronach O
+. O
+
+# sent_id = 141
+Do O
+tego O
+system O
+Scribd B-nam_pro_media_web
+umożliwia O
+licencjonowanie O
+Creative B-nam_oth_license
+Commons I-nam_oth_license
+. O
+
+# sent_id = 142
+Po O
+trzecie O
+– O
+i O
+chyba O
+najważniejsze O
+– O
+uruchomili O
+śmy O
+protokół O
+OAI B-nam_oth_tech
+PMH I-nam_oth_tech
+, O
+pozwalajÄ…cy O
+automatycznie O
+katalogować O
+z O
+zewnÄ…trz O
+metadane O
+książek O
+z O
+naszej O
+kolekcji O
+( O
+opisujemy O
+je O
+w O
+modelu O
+Dublin B-nam_oth_tech
+Core I-nam_oth_tech
+) O
+. O
+
+# sent_id = 143
+Oznacza O
+to O
+między O
+innymi O
+, O
+że O
+treści O
+naszego O
+serwisu O
+mogÄ… O
+być O
+przeszukiwane O
+w O
+ramach O
+wyszukiwarek O
+agregujÄ…cych O
+zbiory O
+różnych O
+kolekcji O
+. O
+
+# sent_id = 144
+WykorzystujÄ…c O
+OAI B-nam_oth_tech
+PMH I-nam_oth_tech
+podpięli O
+śmy O
+nasz O
+serwis O
+do O
+Federacji B-nam_fac_system
+Bibliotek I-nam_fac_system
+Cyfrowych I-nam_fac_system
+– O
+ogólnopolskiej O
+wyszukiwarki O
+pozwalajÄ…cej O
+przeszukiwać O
+naraz O
+kilkadziesiÄ…t O
+bibliotek O
+cyfrowych O
+i O
+kilkaset O
+tysięcy O
+pozycji O
+. O
+
+# sent_id = 145
+KolejnÄ… O
+kwestiÄ… O
+spornÄ… O
+, O
+dotyczÄ…cÄ… O
+mieszkanka O
+, O
+jest O
+rozstaw O
+mebli O
+w O
+kuchni O
+, O
+tak O
+by O
+wygodnie O
+móc O
+z O
+niej O
+korzystać O
+, O
+ale O
+przy O
+jednoczesnym O
+ocaleniu O
+istnienia O
+drzwi O
+kuchennych O
+. O
+
+# sent_id = 146
+Osobiście O
+wydaje O
+mi O
+siÄ™ O
+to O
+nierealne O
+i O
+optujÄ™ O
+za O
+wywaleniem O
+tych O
+drzwi O
+niezgody O
+w O
+cholerÄ™ O
+( O
+czyli O
+do O
+piwnicy O
+; O
+dla O
+informatyków O
+: O
+/ O
+dev O
+/ O
+null O
+) O
+, O
+ale O
+męska O
+część O
+decydentów O
+jest O
+najwidoczniej O
+w O
+nich O
+zakochana O
+, O
+więc O
+nie O
+wiem O
+czy O
+mojej O
+despotyczności O
+wystarczy O
+, O
+by O
+postawić O
+na O
+swoim O
+. O
+
+# sent_id = 147
+KolejnÄ… O
+kolejnÄ… O
+kwestiÄ… O
+spornÄ… O
+jest O
+szafka O
+pod O
+umywalkÄ™ O
+. O
+
+# sent_id = 148
+Posiadamy O
+dwie O
+opcje O
+, O
+które O
+majÄ… O
+swoich O
+zwolenników O
+i O
+przeciwników O
+. O
+
+# sent_id = 149
+JednÄ… O
+z O
+nich O
+jest O
+odratowanie O
+szafki O
+z O
+tarasu O
+, O
+która O
+wymagała O
+by O
+zaślepienia O
+dziur O
+z O
+jednej O
+strony O
+i O
+wydrążenia O
+ich O
+z O
+drugiej O
+. O
+
+# sent_id = 150
+Istnieje O
+też O
+prawdopodobieństwo O
+niekompatybilności O
+szafki O
+ze O
+starÄ… O
+umywalkÄ… O
+. O
+
+# sent_id = 151
+Natomiast O
+drugÄ… O
+jest O
+kupienie O
+nowej O
+szafki O
+z O
+umywalkÄ… O
+i O
+co O
+za O
+tym O
+idzie O
+brak O
+problemów O
+Å‚atajÄ…co O
+- O
+dopasowawczych O
+. O
+
+# sent_id = 152
+I O
+chyba O
+na O
+tym O
+zakończymy O
+doniesienia O
+z O
+linii O
+frontu O
+. O
+
+# sent_id = 153
+Pozdrawiamy O
+sÄ…siadki O
+- O
+podglÄ…daczki O
+z O
+wieżowca O
+obok O
+. O
+
+# sent_id = 154
+Obiecujemy O
+zainspirować O
+Panie O
+do O
+lepszego O
+zaspokajania O
+potrzeb O
+Waszych O
+mężów O
+. O
+
+# sent_id = 155
+OglÄ…dajcie O
+nas O
+już O
+od O
+Nowego B-nam_eve_human_holiday
+Roku I-nam_eve_human_holiday
+. O
+
+# sent_id = 156
+Jak O
+wykorzystywane O
+sÄ… O
+licencje O
+CC B-nam_oth_license
+
+# sent_id = 157
+JakiÅ› O
+czas O
+temu O
+Unia B-nam_org_organization
+Europejska I-nam_org_organization
+wsparła O
+eksperyment O
+dotyczÄ…cy O
+planowania O
+przestrzeni O
+zurbanizowanej O
+, O
+w O
+ramach O
+którego O
+kilka O
+europejskich B-nam_adj
+miast O
+usunęło O
+wszystkie O
+znaki O
+drogowe O
+ze O
+swoich O
+ulic O
+. O
+
+# sent_id = 158
+Na O
+razie O
+nic O
+tutaj O
+nie O
+ma O
+– O
+co O
+nawet O
+daje O
+siÄ™ O
+zauważyć O
+. O
+
+# sent_id = 159
+DostosowujÄ™ O
+spokojnie O
+i O
+bez O
+pośpiechu O
+ten O
+blog O
+. O
+
+# sent_id = 160
+Szablon O
+do O
+WordPress B-nam_pro_software
+’ O
+a O
+– O
+co O
+także O
+widać O
+– O
+nie O
+jest O
+mojego O
+autorstwa O
+. O
+
+# sent_id = 161
+ZmieniÄ™ O
+go O
+dopiero O
+na O
+końcu O
+– O
+zresztÄ… O
+jeszcze O
+nie O
+wiem O
+, O
+czy O
+będę O
+robiła O
+szablon O
+od O
+podstaw O
+, O
+czy O
+przerobiÄ™ O
+jakiÅ› O
+dostępny O
+w O
+sieci O
+. O
+
+# sent_id = 162
+Póki O
+co O
+dopiero O
+poznajÄ… O
+możliwości O
+WordPress B-nam_pro_software
+. O
+
+# sent_id = 163
+Już O
+dawno O
+miała O
+m O
+zamiar O
+postawić O
+blog O
+na O
+skrypcie O
+WordPress B-nam_pro_software
+. O
+
+# sent_id = 164
+Testowała O
+m O
+różne O
+skrypty O
+, O
+ale O
+WordPress B-nam_pro_software
+spodobał O
+mi O
+siÄ™ O
+najbardziej O
+. O
+
+# sent_id = 165
+Moim O
+zdaniem O
+jego O
+popularność O
+jest O
+w O
+pełni O
+zasłużona O
+. O
+
+# sent_id = 166
+Co O
+prawda O
+– O
+przy O
+okazji O
+– O
+„ O
+męczą O
+” O
+na O
+innym O
+serwerze O
+Textpattern B-nam_pro_software
+. O
+
+# sent_id = 167
+Skrypt O
+, O
+o O
+którym O
+pisała O
+m O
+kiedyÅ› O
+na O
+swoim O
+bloggerowym O
+blogu O
+. O
+
+# sent_id = 168
+Od O
+tamtego O
+czasu O
+Textpattern B-nam_pro_software
+doczekał O
+siÄ™ O
+polskiego O
+tłumaczenia O
+– O
+i O
+w O
+końcu O
+postanowiła O
+m O
+go O
+przetestować O
+. O
+
+# sent_id = 169
+Nadal O
+twierdzÄ™ O
+, O
+że O
+to O
+ciekawy O
+skrypt O
+– O
+ale O
+nie O
+specjalnie O
+odpowiada O
+mi O
+rozwiÄ…zanie O
+dotyczÄ…ce O
+szablonów O
+. O
+
+# sent_id = 170
+Co O
+prawda O
+sama O
+struktura O
+szablonu O
+jest O
+przejrzysta O
+– O
+i O
+tworzenie O
+nowych O
+szablonów O
+nie O
+sprawia O
+problemu O
+. O
+
+# sent_id = 171
+Jednak O
+mniej O
+przyjemnÄ… O
+okolicznością O
+przyrody O
+jest O
+to O
+, O
+iż O
+w O
+Textpattern B-nam_pro_software
+nie O
+ma O
+odrębnego O
+folderu O
+z O
+szablonami O
+. O
+
+# sent_id = 172
+Każdy O
+szablon O
+trzeba O
+tworzyć O
+edytujÄ…c O
+podstawowy O
+. O
+
+# sent_id = 173
+To O
+wyklucza O
+możliwość O
+wyboru O
+szablonu O
+z O
+poziomu O
+panelu O
+administracyjnego O
+. O
+
+# sent_id = 174
+TÄ™ O
+niedogodność O
+częściowo O
+likwiduje O
+dodatek O
+umożliwiający O
+eksport O
+i O
+import O
+szablonów O
+– O
+jednak O
+nie O
+do O
+końca O
+. O
+
+# sent_id = 175
+WracajÄ…c O
+do O
+tego O
+blogu O
+– O
+powstaje O
+ponieważ O
+coraz O
+bardziej O
+denerwuje O
+mnie O
+blogger B-nam_pro_media_web
+. O
+
+# sent_id = 176
+Przeszkadza O
+mi O
+brak O
+kategorii O
+i O
+podziału O
+wpisów O
+na O
+wstęp O
+i O
+pełen O
+tekst O
+. O
+
+# sent_id = 177
+Nie O
+zrezygnujÄ™ O
+z O
+Bloggera B-nam_pro_media_web
+– O
+włożyła O
+m O
+trochÄ™ O
+pracy O
+w O
+pozycjonowanie O
+tego O
+blogu O
+– O
+i O
+zwyczajnie O
+szkoda O
+mi O
+jej O
+efektów O
+. O
+
+# sent_id = 178
+Jednak O
+dalsze O
+pisanie O
+o O
+wszystkich O
+moich O
+zainteresowaniach O
+zwiÄ…zanych O
+z O
+internetem B-nam_oth_tech
+na O
+Bloggerze B-nam_pro_media_web
+mija O
+siÄ™ O
+z O
+celem O
+. O
+
+# sent_id = 179
+Czym O
+więcej O
+wpisów O
+– O
+tym O
+większy O
+bałagan O
+– O
+i O
+trudniej O
+cokolwiek O
+znaleść O
+. O
+
+# sent_id = 180
+Postanowiła O
+m O
+więc O
+na O
+Bloggerze B-nam_pro_media_web
+pisać O
+drobne O
+„ O
+zajawki O
+” O
+dotyczÄ…ce O
+wpisów O
+na O
+tym O
+blogu O
+. O
+
+# sent_id = 181
+Myślała O
+m O
+teÄ… O
+nad O
+innÄ… O
+opcjÄ… O
+. O
+
+# sent_id = 182
+Ograniczenia O
+tematyki O
+blogu O
+tylko O
+do O
+wpisów O
+na O
+temat O
+blogosfery O
+. O
+
+# sent_id = 183
+W O
+sumie O
+nadal O
+nie O
+jestem O
+pewna O
+, O
+którą O
+opcjÄ™ O
+wybrał O
+– O
+zdecydowanie O
+nie O
+jest O
+mojÄ… O
+mocnÄ… O
+stronÄ… O
+. O
+
+# sent_id = 184
+Na O
+razie O
+dostosowujÄ™ O
+WordPress B-nam_pro_software
+’ I-nam_pro_software
+a I-nam_pro_software
+– O
+jak O
+skończę O
+to O
+pomyślę O
+. O
+
+# sent_id = 185
+Recenzowany O
+gatunek O
+: O
+Flor B-nam_pro_brand
+de I-nam_pro_brand
+Obera I-nam_pro_brand
+. O
+
+# sent_id = 186
+TroszkÄ™ O
+testów O
+nie O
+zaszkodzi O
+, O
+a O
+że O
+ostatnio O
+pijam O
+przeróżne O
+gatunki O
+Yerba O
+Mate O
+postanowił O
+em O
+stworzyć O
+cykl O
+, O
+majÄ…cy O
+na O
+celu O
+przedstawić O
+moje O
+subiektywne O
+odczucia O
+na O
+temat O
+różniastych O
+gatunków O
+. O
+
+# sent_id = 187
+Na O
+poczÄ…tek O
+chciał O
+by O
+m O
+opisać O
+mało O
+popularny O
+w O
+naszym O
+kraju O
+gatunek O
+, O
+mianowicie O
+" O
+Flor B-nam_pro_brand
+de I-nam_pro_brand
+Obera I-nam_pro_brand
+" O
+. O
+
+# sent_id = 188
+Do O
+wyboru O
+tej O
+Yerby O
+namówiła O
+mnie O
+zawsze O
+przyjemna O
+Pani O
+ze O
+Szczypty B-nam_fac_goe
+, O
+kiedy O
+to O
+szukał O
+em O
+mocniejszego O
+gatunku O
+. O
+
+# sent_id = 189
+Postanowił O
+em O
+jÄ… O
+zamówić O
+w O
+Herbatkowo B-nam_pro_media_web
+- O
+wybieram O
+zawsze O
+najtańszy O
+sklep O
+, O
+także O
+nie O
+traktujcie O
+tego O
+jako O
+reklamÄ™ O
+, O
+jeden O
+gatunek O
+jest O
+tam O
+droższy O
+inny O
+- O
+jak O
+ten O
+- O
+tańszy O
+. O
+
+# sent_id = 190
+Zamówił O
+em O
+w O
+piÄ…tek O
+, O
+powinien O
+em O
+dostać O
+w O
+poniedziałek O
+, O
+jednak O
+ze O
+względu O
+na O
+chochliki O
+komputerowe O
+powstało O
+jednodniowe O
+opóźnienie O
+( O
+za O
+co O
+dostał O
+em O
+gratisowÄ… O
+przesyłkę O
+. O
+) O
+
+# sent_id = 191
+Kurier O
+dostarczył O
+mi O
+jÄ… O
+we O
+wtorek O
+, O
+po O
+otworzeniu O
+, O
+niestety O
+kiepskiej O
+jakości O
+papierowego O
+opakowania O
+wydobył O
+siÄ™ O
+przyjemny O
+zapach O
+, O
+lekko O
+gorzkawy O
+, O
+jednak O
+charakterystyczny O
+dla O
+argentyńskich O
+gatunków O
+. O
+
+# sent_id = 192
+Bardzo O
+mała O
+ilość O
+pyłu O
+zrobiła O
+na O
+mnie O
+dobre O
+wrażenie O
+. O
+
+# sent_id = 193
+Więcej O
+listków O
+niż O
+gałązek O
+daje O
+kolejny O
+plus O
+. O
+
+# sent_id = 194
+PoczÄ…tek O
+świetny O
+. O
+
+# sent_id = 195
+3 O
+/ O
+4 O
+matero O
+zostało O
+napełnione O
+, O
+La B-nam_pro_brand
+Mulata I-nam_pro_brand
+AL I-nam_pro_brand
+17 I-nam_pro_brand
+" O
+wkręcona O
+" O
+w O
+susz O
+, O
+woda O
+w O
+temperaturze O
+niższej O
+niż O
+standardowo O
+- O
+75 O
+st O
+. O
+C O
+( O
+tak O
+miałem O
+polecane O
+i O
+to O
+siÄ™ O
+sprawdziło O
+) O
+gotowa O
+więc O
+czas O
+na O
+pierwsze O
+zalanie O
+. O
+
+# sent_id = 196
+Święty B-nam_liv_person
+Tomasz I-nam_liv_person
+ciÄ…gnie O
+bardzo O
+szybko O
+, O
+więc O
+kolejne O
+zalanie O
+po O
+krótkiej O
+chwili O
+. O
+
+# sent_id = 197
+Pierwszy O
+siorb O
+i O
+. O
+. O
+. O
+miłe O
+zaskoczenie O
+, O
+mimo O
+zapowiadanej O
+dużej O
+mocy O
+, O
+czuć O
+dużo O
+Yerby O
+, O
+mało O
+goryczy O
+, O
+lekko O
+- O
+kwaśny O
+smak O
+. O
+
+# sent_id = 198
+Nie O
+chcÄ…c O
+używać O
+porównań O
+do O
+innych O
+gatunków O
+i O
+nie O
+majÄ…c O
+takiej O
+potrzeby O
+stwierdzam O
+oryginalny O
+smak O
+. O
+
+# sent_id = 199
+Po O
+szóstym O
+zalaniu O
+nadal O
+czuć O
+porzÄ…dny O
+smak O
+Yerby O
+, O
+bez O
+większej O
+straty O
+, O
+do O
+tego O
+mocne O
+pobudzenie O
+. O
+
+# sent_id = 200
+PodsumowujÄ…c O
+- O
+Gatunek O
+dla O
+tych O
+, O
+którzy O
+nie O
+lubiÄ… O
+kwaśnych O
+, O
+cierpkich O
+smaków O
+, O
+natomiast O
+uwielbiajÄ… O
+duże O
+, O
+a O
+do O
+tego O
+długie O
+pobudzenie O
+. O
+
+# sent_id = 201
+Yerba O
+ta O
+stawia O
+na O
+nogi O
+szybko O
+i O
+przyjemnie O
+, O
+pobudza O
+ciało O
+, O
+uspokaja O
+ducha O
+. O
+
+# sent_id = 202
+Opakowanie O
+: O
+3 O
+/ O
+10 O
+- O
+jak O
+zwykle O
+śliski O
+papier O
+, O
+pękający O
+od O
+spodu O
+. O
+
+# sent_id = 203
+Zapach O
+: O
+9 O
+/ O
+10 O
+- O
+lekko O
+gorzkawy O
+, O
+ogólnie O
+przyjemny O
+i O
+delikatny O
+. O
+
+# sent_id = 204
+Smak O
+: O
+9 O
+/ O
+10 O
+- O
+lekko O
+kwaśny O
+, O
+czuć O
+dużo O
+Yerby O
+. O
+
+# sent_id = 205
+Pobudzenie O
+: O
+10 O
+/ O
+10 O
+- O
+jedna O
+z O
+najmocniejszych O
+jakie O
+pił O
+em O
+i O
+chyba O
+jakie O
+sÄ… O
+. O
+
+# sent_id = 206
+Wytrzymałość O
+: O
+8 O
+/ O
+10 O
+- O
+po O
+szóstym O
+zalaniu O
+bez O
+większej O
+utraty O
+smaku O
+. O
+
+# sent_id = 207
+Cena O
+- O
+jakość O
+: O
+10 O
+/ O
+10 O
+- O
+Jak O
+na O
+tÄ… O
+jakość O
+cena O
+( O
+od O
+20PLN O
+/ O
+0 O
+, O
+5kg O
+) O
+jest O
+bardzo O
+niska O
+. O
+
+# sent_id = 208
+TworzÄ… O
+siÄ™ O
+w O
+okresach O
+przelotów O
+, O
+konstruujÄ…c O
+przeróżne O
+figury O
+na O
+niebie O
+. O
+
+# sent_id = 209
+Niekiedy O
+jest O
+to O
+najpopularniejszy O
+klucz O
+, O
+innym O
+razem O
+znane O
+laikom O
+tylko O
+z O
+popularnego O
+powiedzenia O
+szyk O
+" O
+gęsiego O
+" O
+. O
+
+# sent_id = 210
+Naukowcy O
+od O
+lat O
+badajÄ… O
+fenomen O
+tego O
+zjawiska O
+. O
+
+# sent_id = 211
+Najbardziej O
+skrajne O
+opinie O
+mówiły O
+o O
+przypadku O
+, O
+a O
+drugie O
+o O
+zamontowanym O
+systemie O
+nawigacji O
+GPS B-nam_oth_tech
+. O
+
+# sent_id = 212
+Jak O
+jest O
+naprawdÄ™ O
+z O
+ptasimi O
+formacjami O
+? O
+
+# sent_id = 213
+Dlaczego O
+i O
+kiedy O
+wędrują O
+? O
+
+# sent_id = 214
+Podstawowym O
+powodem O
+jest O
+oczywiście O
+zmiana O
+pór O
+roku O
+. O
+
+# sent_id = 215
+Szczególnie O
+jest O
+to O
+zauważane O
+w O
+krajach O
+w O
+klimacie O
+umiarkowanym O
+, O
+na O
+półkuli O
+północnej O
+. O
+
+# sent_id = 216
+Można O
+wtedy O
+odróżnić O
+porÄ™ O
+ciepłą O
+( O
+okres O
+od O
+poczÄ…tku O
+marca O
+do O
+połowy O
+października O
+) O
+i O
+porÄ™ O
+mroźną O
+( O
+listopad O
+- O
+luty O
+) O
+. O
+
+# sent_id = 217
+Warunkuje O
+to O
+dostęp O
+do O
+pożywienia O
+, O
+dlatego O
+ptaki O
+sÄ… O
+zmuszone O
+przenosić O
+siÄ™ O
+zimÄ… O
+w O
+tereny O
+ciepłe O
+, O
+na O
+półkulę O
+południową O
+. O
+
+# sent_id = 218
+Dla O
+przykładu O
+weźmy O
+jeden O
+popularnych O
+polskich O
+gatunków O
+– O
+obecnÄ… O
+niemal O
+w O
+każdym O
+regionie O
+kaczkÄ™ O
+krzyżówkę O
+. O
+
+# sent_id = 219
+Jest O
+to O
+gatunek O
+wędrowny O
+, O
+jednak O
+kilkanaście O
+procent O
+osobników O
+z O
+naszego O
+kraju O
+pozostaje O
+u O
+nas O
+nawet O
+w O
+okresie O
+zimowym O
+. O
+
+# sent_id = 220
+Ulubionymi O
+zimowiskami O
+sÄ… O
+dla O
+nich O
+regiony O
+południowo O
+- O
+zachodniej O
+i O
+północnej O
+Polski B-nam_loc_gpe_country
+przy O
+niezamarzajÄ…cych O
+rzekach O
+. O
+
+# sent_id = 221
+Pozostałe O
+osobniki O
+odlatujÄ… O
+znad O
+Wisły B-nam_loc_hydronym_river
+między O
+wrześniem O
+, O
+a O
+grudniem O
+. O
+
+# sent_id = 222
+PowracajÄ… O
+do O
+nas O
+od O
+lutego O
+do O
+kwietnia O
+. O
+
+# sent_id = 223
+SÄ… O
+także O
+gatunki O
+, O
+którym O
+wystarczy O
+przemieszczenie O
+siÄ™ O
+o O
+kilkaset O
+kilometrów O
+np O
+. O
+z O
+północy O
+Polski B-nam_loc_gpe_country
+na O
+południe O
+, O
+gdzie O
+różnica O
+temperatur O
+może O
+wynieść O
+kilka O
+stopni O
+C O
+. O
+, O
+dla O
+nich O
+jednak O
+to O
+wystarczy O
+. O
+
+# sent_id = 224
+Tak O
+jest O
+z O
+myszołowem O
+, O
+który O
+wędrując O
+np O
+. O
+z O
+Norwegii B-nam_loc_gpe_country
+znajdzie O
+cieplejsze O
+rejony O
+już O
+w O
+Polsce B-nam_loc_gpe_country
+powiększając O
+tym O
+samym O
+populacjÄ™ O
+tego O
+gatunku O
+w O
+naszym O
+kraju O
+. O
+
+# sent_id = 225
+Wtedy O
+powstaje O
+walka O
+o O
+pokarm O
+i O
+myszołowy O
+muszÄ… O
+szukać O
+pożywienia O
+nawet O
+na O
+północnych O
+częściach O
+Afryki B-nam_loc_land_continent
+. O
+
+# sent_id = 226
+Co O
+ciekawe O
+sÄ… O
+w O
+stanie O
+pokonać O
+podczas O
+przelotu O
+ponad O
+dziesięć O
+tysięcy O
+kilometrów O
+. O
+
+# sent_id = 227
+Gatunek O
+ten O
+nie O
+układa O
+siÄ™ O
+w O
+formacje O
+, O
+lecÄ…c O
+w O
+parach O
+. O
+
+# sent_id = 228
+Dlaczego O
+więc O
+ptaki O
+poświęcają O
+tyle O
+czasu O
+na O
+odloty O
+i O
+później O
+majÄ… O
+chęć O
+powrócić O
+na O
+letnisko O
+? O
+
+# sent_id = 229
+Odpowiedź O
+jest O
+prosta O
+– O
+pokarm O
+. O
+
+# sent_id = 230
+Na O
+północnej O
+części O
+globu O
+sezon O
+letni O
+oznacza O
+wielkÄ… O
+stołówkę O
+, O
+od O
+owadów O
+do O
+gryzoni O
+– O
+wszystkie O
+gatunki O
+stajÄ… O
+siÄ™ O
+liczniejsze O
+, O
+co O
+daje O
+pole O
+do O
+popisu O
+dla O
+wygłodniałych O
+ptaków O
+, O
+przebywajÄ…cych O
+w O
+okresie O
+lęgowym O
+, O
+bądź O
+już O
+dokarmiajÄ…cych O
+młode O
+. O
+
+# sent_id = 231
+Można O
+napisać O
+" O
+co O
+gatunek O
+to O
+obyczaj O
+" O
+– O
+każdy O
+z O
+nich O
+charakteryzuje O
+siÄ™ O
+innym O
+okresem O
+odlotu O
+oraz O
+innym O
+sposobem O
+zimowania O
+. O
+
+# sent_id = 232
+Dr O
+Wiesław B-nam_liv_person
+Nowicki I-nam_liv_person
+długo O
+stał O
+w O
+obronie O
+polskiej O
+przyrody O
+i O
+walczył O
+z O
+różnymi O
+samorzÄ…dami O
+w O
+Polsce B-nam_loc_gpe_country
+. O
+
+# sent_id = 233
+Przez O
+wiele O
+lat O
+blokował O
+on O
+budowÄ™ O
+mostu O
+północnego O
+w O
+Warszawie B-nam_loc_gpe_city
+. O
+
+# sent_id = 234
+Jednak O
+, O
+kiedy O
+uległ O
+- O
+postanowił O
+skutecznie O
+doradzić O
+jak O
+usuwać O
+drzewa O
+zgodnie O
+z O
+naturÄ… O
+i O
+ustalił O
+miejsca O
+wystawienia O
+budek O
+lęgowych O
+dla O
+ptaków O
+itd O
+. O
+
+# sent_id = 235
+Dostał O
+za O
+to O
+wynagrodzenie O
+i O
+co O
+? O
+
+# sent_id = 236
+" O
+Przepiękny O
+artykuł O
+" O
+w O
+naszej O
+naczelnej O
+, O
+narodowej O
+GAZECIE O
+. O
+
+# sent_id = 237
+Został O
+skrytykowany O
+za O
+pobór O
+wynagrodzenia O
+, O
+zwany O
+przez O
+redaktorów O
+jako O
+" O
+haracz O
+" O
+. O
+
+# sent_id = 238
+Każdy O
+pracuje O
+i O
+stara O
+siÄ™ O
+jak O
+może O
+, O
+jeśli O
+dostał O
+za O
+to O
+pieniÄ…dze O
+to O
+chwała O
+mu O
+za O
+to O
+co O
+robił O
+. O
+
+# sent_id = 239
+Gorzej O
+jakby O
+dostał O
+pieniÄ…dze O
+, O
+a O
+nic O
+nie O
+zrobił O
+. O
+
+# sent_id = 240
+Inni O
+siedzÄ… O
+za O
+biurkiem O
+, O
+zbijajÄ… O
+przysłowiowe O
+bÄ…ki O
+i O
+biorÄ… O
+wynagrodzenie O
+. O
+
+# sent_id = 241
+On O
+przynajmniej O
+spróbował O
+walczyć O
+z O
+systemem O
+. O
+
+# sent_id = 242
+Lepsze O
+otrzymywanie O
+pieniędzy O
+za O
+" O
+doradzanie O
+" O
+jak O
+to O
+napisała O
+wypiórcza O
+, O
+niż O
+za O
+kłamstwa O
+i O
+oszczerstwa O
+jakie O
+sÄ… O
+wypisywane O
+na O
+Å‚amach O
+w O
+/ O
+w O
+gazety O
+. O
+
+# sent_id = 243
+Pozdrawiam O
+serdecznie O
+i O
+życzę O
+wszystkim O
+optymizmu O
+. O
+
+# sent_id = 244
+Do O
+tej O
+pory O
+myślał O
+em O
+, O
+że O
+gwoździem O
+do O
+trumny O
+promocji O
+Krakowa B-nam_loc_gpe_city
+był O
+szaliczek O
+, O
+ale O
+ostatnio O
+zobaczył O
+em O
+reklamÄ™ O
+pigułki O
+z O
+hasłem O
+" O
+72 O
+godziny O
+po O
+. O
+. O
+. O
+Krakowie B-nam_loc_gpe_city
+" O
+. O
+
+# sent_id = 245
+Ostatni O
+weekend O
+spędzili O
+śmy O
+właśnie O
+w O
+Krakowie B-nam_loc_gpe_city
+, O
+gdzie O
+mieli O
+śmy O
+nadziejÄ™ O
+przekonać O
+siÄ™ O
+, O
+że O
+Wrocław B-nam_loc_gpe_city
+wciąż O
+jest O
+miastem O
+pustym O
+i O
+cichym O
+. O
+
+# sent_id = 246
+W O
+poszukiwaniu O
+boozy O
+Brits B-nam_org_nation
+obeszli O
+śmy O
+rynek B-nam_fac_square
+i O
+planty B-nam_fac_park
+, O
+ale O
+o O
+dziwo O
+trafiła O
+siÄ™ O
+tylko O
+jedna O
+grupa O
+. O
+
+# sent_id = 247
+Czyli O
+tyle O
+ile O
+w O
+piÄ…tkowy O
+wieczór O
+można O
+spotkać O
+we O
+Wrocławiu B-nam_loc_gpe_city
+. O
+
+# sent_id = 248
+Może O
+jednak O
+było O
+za O
+wcześnie O
+. O
+
+# sent_id = 249
+Może O
+nie O
+było O
+na O
+ten O
+weekend O
+tanich O
+biletów O
+. O
+
+# sent_id = 250
+CiÄ…gle O
+zastanawia O
+mnie O
+czemu O
+Kraków B-nam_loc_gpe_city
+, O
+miasto O
+, O
+które O
+wygrało O
+na O
+loterii O
+brak O
+zniszczeń O
+wojennych O
+i O
+jeszcze O
+zamek O
+na O
+wzgórzu O
+, O
+wybrał O
+turystykÄ™ O
+imprezowÄ… O
+. O
+
+# sent_id = 251
+Chociaż O
+może O
+billboardy O
+z O
+nierozpakowanÄ… O
+czekoladkÄ… O
+miały O
+odnosić O
+siÄ™ O
+do O
+nocy O
+muzeów O
+, O
+podobnie O
+jak O
+ostatnia O
+akcja O
+ze O
+zmęczonymi O
+pomnikami O
+? O
+
+# sent_id = 252
+Inna O
+sprawa O
+, O
+że O
+w O
+zabawie O
+nie O
+uczestniczył O
+Aleksander B-nam_liv_person
+Fredro I-nam_liv_person
+, O
+co O
+być O
+może O
+świadczy O
+o O
+tym O
+, O
+że O
+Wrocław B-nam_loc_gpe_city
+nie O
+dorobił O
+siÄ™ O
+rozpoznawalnego O
+symbolu O
+. O
+
+# sent_id = 253
+Tymczasem O
+każdy O
+zna O
+wierszyk O
+o O
+starym O
+pierniku O
+, O
+kto O
+nie O
+pamięta O
+magazynu O
+morze O
+( O
+zaczynajÄ…cego O
+siÄ™ O
+piosenkÄ… O
+o O
+piratach O
+) O
+, O
+syrenka O
+straszy O
+też O
+od O
+dawna O
+. O
+
+# sent_id = 254
+Poznań B-nam_loc_gpe_city
+litościwie O
+też O
+pominięto O
+, O
+bo O
+kto O
+chciał O
+by O
+wybrać O
+siÄ™ O
+do O
+miasta O
+, O
+do O
+którego O
+imprezować O
+jeżdżą O
+koziołki O
+? O
+
+# sent_id = 255
+Okazało O
+siÄ™ O
+, O
+że O
+rowerzyści O
+jednak O
+robiÄ… O
+zakupy O
+. O
+
+# sent_id = 256
+Żeby O
+siÄ™ O
+zbytnio O
+nie O
+rozochocili O
+, O
+stojaki O
+pod O
+centrum B-nam_fac_goe
+arkady I-nam_fac_goe
+sÄ… O
+małe O
+, O
+w O
+końcu O
+parking O
+też O
+mieści O
+marne O
+kilkaset O
+samochodów O
+, O
+a O
+ilu O
+może O
+być O
+rowerzystów O
+? O
+
+# sent_id = 257
+Dwudziestu O
+? O
+
+# sent_id = 258
+Oczywiście O
+to O
+miłe O
+, O
+że O
+już O
+po O
+dwóch O
+miesiÄ…cach O
+od O
+otwarcia O
+stojaki O
+siÄ™ O
+pojawiły O
+, O
+chociaż O
+pod O
+konkurencjÄ… O
+na O
+placu B-nam_fac_square
+Grunwaldzkim I-nam_fac_square
+były O
+już O
+od O
+otwarcia O
+. O
+
+# sent_id = 259
+Na O
+obrazku O
+można O
+dodatkowo O
+podziwiać O
+uprzejmość O
+kierowcy O
+, O
+który O
+zaparkował O
+na O
+końcu O
+ścieżki O
+rowerowej O
+, O
+a O
+mógł O
+przecież O
+stanąć O
+pod O
+stojakiem O
+na O
+rowery O
+. O
+
+# sent_id = 260
+Tymczasem O
+w O
+poszukiwaniu O
+wszystkich O
+wrocławskich O
+rowerzystów O
+wystarczy O
+wybrać O
+siÄ™ O
+kawałek O
+dalej O
+. O
+
+# sent_id = 261
+Za O
+centrum O
+handlowym O
+znajduje O
+siÄ™ O
+stary O
+dom O
+towarowy O
+, O
+w O
+którym O
+mieści O
+siÄ™ O
+obecnie O
+HP B-nam_org_company
+, O
+a O
+wkrótce O
+znajdzie O
+siÄ™ O
+tam O
+także O
+kolejna O
+galeria O
+, O
+mimo O
+że O
+tuż O
+obok O
+jest O
+już O
+jeszcze O
+inna O
+galeria O
+, O
+znana O
+ostatnio O
+z O
+tego O
+, O
+że O
+radny O
+pobił O
+tam O
+policjanta O
+. O
+
+# sent_id = 262
+Pracownicy O
+HP B-nam_org_company
+udajÄ… O
+, O
+że O
+sÄ… O
+w O
+Amsterdamie B-nam_loc_gpe_city
+czy O
+innej O
+Kopenhadze B-nam_loc_gpe_city
+: O
+Zaraz O
+za O
+rowerami O
+znajdujÄ… O
+siÄ™ O
+wizualizacje O
+nowego O
+domu O
+towarowego O
+, O
+zielona O
+trawa O
+, O
+szkło O
+i O
+beton O
+. O
+
+# sent_id = 263
+Ludzie O
+łażą O
+, O
+samochody O
+jeżdżą O
+( O
+tu O
+spory O
+optymizm O
+twórców O
+widać O
+- O
+na O
+pierwszym O
+obrazku O
+trzy O
+samochody O
+: O
+BMW B-nam_org_company
+, O
+saab B-nam_org_company
+i O
+porsche B-nam_pro_brand
+, O
+na O
+kolejnych O
+zresztÄ… O
+dość O
+podobnie O
+) O
+, O
+nawet O
+autobus O
+siÄ™ O
+pojawił O
+. O
+
+# sent_id = 264
+Żadnych O
+rowerzystów O
+, O
+żadnych O
+stojaków O
+. O
+
+# sent_id = 265
+Dobra O
+wiadomość O
+dla O
+pracowników O
+HP B-nam_org_company
+: O
+szykujÄ… O
+siÄ™ O
+podwyżki O
+. O
+
+# sent_id = 266
+Sam O
+by O
+m O
+chciał O
+, O
+żeby O
+było O
+różowo O
+i O
+żeby O
+w O
+zwiÄ…zku O
+z O
+euro B-nam_eve_human_sport
+powstały O
+drogi O
+, O
+linie O
+kolejowe O
+, O
+lotniska O
+i O
+kina O
+studyjne O
+. O
+
+# sent_id = 267
+Euro B-nam_eve_human_sport
+to O
+piękny O
+pretekst O
+i O
+być O
+może O
+nawet O
+Komisja B-nam_org_institution
+Europejska I-nam_org_institution
+zmiękła O
+by O
+i O
+dorzuciła O
+kilka O
+miliardów O
+albo O
+chociaż O
+uprościła O
+procedury O
+. O
+
+# sent_id = 268
+Minęło O
+kilka O
+miesięcy O
+od O
+przyznania O
+Polsce B-nam_loc_gpe_country
+imprezy O
+i O
+nic O
+siÄ™ O
+jednak O
+nie O
+dzieje O
+. O
+
+# sent_id = 269
+Odwoływane O
+sÄ… O
+kolejne O
+plany O
+( O
+autostrad O
+, O
+szybkich O
+pociągów O
+) O
+, O
+gazety O
+i O
+blogi O
+lamentujÄ… O
+. O
+
+# sent_id = 270
+Czym O
+biedny O
+kibic O
+dojedzie O
+na O
+mecz O
+? O
+
+# sent_id = 271
+Jak O
+siÄ™ O
+przemieści O
+? O
+
+# sent_id = 272
+Tymczasem O
+organizatorzy O
+ewidentnie O
+nic O
+sobie O
+z O
+tego O
+nie O
+robiÄ… O
+. O
+
+# sent_id = 273
+I O
+nie O
+będą O
+. O
+
+# sent_id = 274
+Nie O
+muszÄ… O
+. O
+
+# sent_id = 275
+Wizja O
+wielkich O
+stadionów O
+i O
+setek O
+tysięcy O
+kibiców O
+wędrujących O
+po O
+Polsce B-nam_loc_gpe_country
+wzdłuż O
+i O
+wszerz O
+została O
+stworzona O
+przez O
+media O
+, O
+a O
+organizatorzy O
+wiedzÄ… O
+, O
+że O
+ratuje O
+ich O
+system O
+sprzedaży O
+biletów O
+. O
+
+# sent_id = 276
+Według O
+tego O
+systemu O
+połowę O
+miejsc O
+na O
+stadionach O
+dostajÄ… O
+sponsorzy O
+. O
+
+# sent_id = 277
+Ci O
+organizujÄ… O
+konkursy O
+, O
+ale O
+przede O
+wszystkim O
+wysyłają O
+swoich O
+pracowników O
+. O
+
+# sent_id = 278
+Reszta O
+biletów O
+jest O
+w O
+większości O
+losowana O
+( O
+gospodarz O
+dostaje O
+nikłą O
+pulÄ™ O
+) O
+i O
+szansa O
+, O
+że O
+ten O
+sam O
+kibic O
+wylosuje O
+bilet O
+w O
+Poznaniu B-nam_loc_gpe_city
+i O
+we O
+Wrocławiu B-nam_loc_gpe_city
+jest O
+raczej O
+mała O
+. O
+
+# sent_id = 279
+W O
+ten O
+sposób O
+potrzebne O
+sÄ… O
+po O
+pierwsze O
+stadiony O
+, O
+a O
+po O
+drugie O
+lotniska O
+. O
+
+# sent_id = 280
+Oczywiście O
+- O
+też O
+nie O
+jest O
+tak O
+Å‚atwo O
+w O
+Polsce B-nam_loc_gpe_country
+je O
+zbudować O
+, O
+ale O
+dużo O
+Å‚atwiej O
+niż O
+zbudować O
+stadiony O
+, O
+lotniska O
+i O
+tysiÄ…ce O
+kilometrów O
+dróg O
+. O
+
+# sent_id = 281
+Zdecydowana O
+większość O
+kibiców O
+przyjedzie O
+na O
+jeden O
+mecz O
+, O
+co O
+najmniej O
+połowa O
+( O
+bo O
+gospodarz O
+też O
+część O
+biletów O
+rozdaje O
+) O
+przyjedzie O
+nie O
+za O
+własne O
+pieniÄ…dze O
+w O
+ramach O
+wycieczek O
+korporacyjno O
+- O
+szkolnych O
+, O
+a O
+na O
+takich O
+czas O
+płynie O
+inaczej O
+i O
+45 O
+godzin O
+w O
+podróży O
+też O
+ma O
+swoje O
+zalety O
+. O
+. O
+. O
+
+# sent_id = 282
+Pozostaje O
+ewentualnie O
+niewielka O
+grupa O
+kibiców O
+, O
+którzy O
+kibicujÄ… O
+samej O
+imprezie O
+- O
+lubiÄ… O
+po O
+prostu O
+malować O
+sobie O
+twarze O
+i O
+pić O
+ciepłe O
+piwo O
+przed O
+telebimem O
+albo O
+wybijać O
+szyby O
+w O
+sklepach O
+. O
+
+# sent_id = 283
+Srebrni O
+siatkarze O
+i O
+srebrni O
+piłkarze O
+ręczni O
+grali O
+świetnie O
+przez O
+całe O
+turnieje O
+( O
+jedni O
+bez O
+, O
+drudzy O
+z O
+jednÄ… O
+porażką O
+) O
+, O
+żeby O
+gładko O
+przegrać O
+w O
+finałach O
+. O
+
+# sent_id = 284
+Jedni O
+i O
+drudzy O
+zapewniali O
+, O
+że O
+sÄ… O
+gotowi O
+wygrać O
+, O
+że O
+jeśli O
+nie O
+teraz O
+to O
+kiedy O
+, O
+a O
+Niemców B-nam_org_nation
+mogÄ… O
+zlać O
+z O
+marszu O
+. O
+
+# sent_id = 285
+Najwyraźniej O
+jednak O
+zapomnieli O
+o O
+dwóch O
+równych O
+skokach O
+i O
+zasłużyli O
+, O
+żeby O
+maskotkÄ… O
+drużyny O
+został O
+Robert B-nam_liv_person
+Mateja I-nam_liv_person
+( O
+uczeń O
+Masahiko B-nam_liv_person
+Harady I-nam_liv_person
+) O
+. O
+
+# sent_id = 286
+To O
+też O
+przypomina O
+mi O
+być O
+może O
+Steca B-nam_liv_person
+, O
+być O
+może O
+Zczuba B-nam_pro_media_web
+, O
+że O
+polski B-nam_adj_country
+piłkarz O
+stara O
+siÄ™ O
+do O
+pierwszej O
+beemki O
+. O
+
+# sent_id = 287
+Nie O
+bramki O
+, O
+beemki O
+. O
+
+# sent_id = 288
+Srebrny O
+medal O
+jest O
+Å‚adny O
+, O
+Polacy B-nam_org_nation
+lubiÄ… O
+gadać O
+, O
+zawsze O
+mogÄ… O
+powiedzieć O
+, O
+że O
+Niemcy B-nam_org_nation
+specjalnie O
+zesłali O
+ich O
+do O
+Hamburga B-nam_loc_gpe_city
+, O
+miasta O
+, O
+które O
+dało O
+swojÄ… O
+nazwÄ™ O
+frankfurterkom O
+, O
+żeby O
+do O
+złota O
+Renu B-nam_loc_hydronym_river
+mieli O
+daleko O
+. O
+
+# sent_id = 289
+Oczywiście O
+na O
+szczęście O
+ani O
+piłkarze O
+ręczni O
+, O
+ani O
+siatkarze O
+aż O
+tak O
+głupio O
+siÄ™ O
+nie O
+tłumaczyli O
+, O
+to O
+tylko O
+telewizja O
+publiczna O
+, O
+w O
+końcu O
+po O
+tylu O
+latach O
+transmisji O
+ze O
+skoków O
+trudno O
+siÄ™ O
+odzwyczaić O
+. O
+
+# sent_id = 290
+Nic O
+siÄ™ O
+nie O
+stało O
+panie O
+trenerze O
+, O
+powiedział O
+buldog O
+. O
+
+# sent_id = 291
+Z O
+jednej O
+strony O
+medale O
+w O
+sportach O
+zespołowych O
+i O
+wśród O
+seniorów O
+to O
+miła O
+odmiana O
+, O
+z O
+całym O
+szacunkiem O
+dla O
+siatkarek O
+i O
+koszykarek O
+. O
+
+# sent_id = 292
+Nietłumaczenie O
+siÄ™ O
+głupio O
+z O
+porażki O
+też O
+raczej O
+po O
+stronie O
+korzyści O
+. O
+
+# sent_id = 293
+Jednak O
+dlaczego O
+w O
+kluczowych O
+momentach O
+siÄ™ O
+zawodzi O
+? O
+
+# sent_id = 294
+Po O
+co O
+heroiczne O
+boje O
+z O
+RosjÄ… B-nam_loc_gpe_country
+i O
+DaniÄ… B-nam_loc_gpe_country
+? O
+
+# sent_id = 295
+Czy O
+polscy B-nam_adj_country
+zawodnicy O
+sÄ… O
+zbyt O
+skromni O
+? O
+
+# sent_id = 296
+JakiÅ› O
+kompleks O
+nie O
+pozwala O
+im O
+uznać O
+, O
+że O
+sÄ… O
+godni O
+złota O
+? O
+
+# sent_id = 297
+Holendrzy B-nam_org_nation
+popijajÄ…cy O
+mlekiem O
+bułkę O
+z O
+salami O
+nigdy O
+nie O
+przestali O
+mnie O
+dziwić O
+, O
+chociaż O
+może O
+to O
+tylko O
+wariacja O
+na O
+temat O
+baraniny O
+z O
+jogurtem O
+czy O
+wołowiny O
+z O
+parmezanem O
+. O
+
+# sent_id = 298
+W O
+końcu O
+Kalwin B-nam_liv_person
+popijał O
+jajko O
+kieliszkiem O
+wina O
+, O
+a O
+Holendrzy B-nam_org_nation
+wszystko O
+potrafiÄ… O
+zreformować O
+. O
+
+# sent_id = 299
+Winiarze O
+zresztÄ… O
+nie O
+byli O
+w O
+Holandii B-nam_loc_gpe_country
+mile O
+widziani O
+, O
+a O
+tymczasem O
+to O
+właśnie O
+w O
+depresji O
+winnica O
+wydała O
+plon O
+, O
+w O
+wyniku O
+ponadświatowego O
+spisku O
+, O
+w O
+którym O
+epizodyczne O
+role O
+odegrali O
+Fidel B-nam_liv_person
+Castro I-nam_liv_person
+, O
+Gawriło B-nam_liv_person
+Princip I-nam_liv_person
+i O
+pewien O
+zakonnik O
+, O
+który O
+dodatkowo O
+potwierdza O
+nabiałowe O
+podłoże O
+całej O
+sprawy O
+. O
+
+# sent_id = 300
+Bohaterowie O
+świadomi O
+swojej O
+wartości O
+, O
+znawcy O
+wszechświata O
+i O
+wszechrzeczy O
+, O
+tańczą O
+jak O
+im O
+zagrajÄ… O
+na O
+wiolonczeli O
+i O
+innych O
+strunach O
+. O
+
+# sent_id = 301
+UczestniczÄ… O
+w O
+miłosnym O
+trójkącie O
+, O
+który O
+okazuje O
+siÄ™ O
+raczej O
+trapezem O
+, O
+na O
+dodatek O
+z O
+obeliskiem O
+pośrodku O
+. O
+
+# sent_id = 302
+ZostajÄ… O
+ojcami O
+, O
+chociaż O
+przede O
+wszystkim O
+swoimi O
+, O
+nawet O
+jeżeli O
+sÄ… O
+tylko O
+ich O
+całkowitym O
+przeciwieństwem O
+. O
+
+# sent_id = 303
+W O
+poszukiwaniu O
+środka O
+, O
+bo O
+tylko O
+środka O
+nam O
+brakuje O
+, O
+jeśli O
+historia O
+ma O
+toczyć O
+siÄ™ O
+kołem O
+, O
+musi O
+mieć O
+środek O
+, O
+którego O
+nie O
+majÄ… O
+przecież O
+rzeczy O
+, O
+które O
+nie O
+majÄ… O
+końca O
+, O
+takie O
+jak O
+wszechświat O
+, O
+trzeba O
+przedostać O
+siÄ™ O
+przez O
+grafiki O
+Eschera B-nam_liv_person
+, O
+ukryte O
+za O
+renesansowÄ… O
+fasadÄ… O
+. O
+
+# sent_id = 304
+Wcześniej O
+jednak O
+trzeba O
+odbyć O
+podróż O
+w O
+towarzystwie O
+Francisa B-nam_liv_person
+Bacona I-nam_liv_person
+, O
+który O
+może O
+siÄ™ O
+nawet O
+okazać O
+środkiem O
+tej O
+opowieści O
+. O
+
+# sent_id = 305
+O O
+ile O
+" O
+Odkrycie B-nam_pro_title
+nieba I-nam_pro_title
+" O
+ma O
+koniec O
+, O
+a O
+Harry B-nam_liv_person
+Mulisch I-nam_liv_person
+nie O
+napisał O
+dzieł O
+Szekspira B-nam_liv_person
+. O
+
+# sent_id = 306
+Cyniczny O
+student O
+otworzył O
+portal O
+z O
+mapÄ… O
+nalotów O
+, O
+o O
+którym O
+czytał O
+em O
+kiedyÅ› O
+, O
+ale O
+dopiero O
+absurdalny O
+tekst O
+z O
+częstochowskiej O
+wyborczej O
+zwrócił O
+na O
+Å„ O
+mojÄ… O
+uwagÄ™ O
+. O
+
+# sent_id = 307
+Strona O
+ma O
+promować O
+używanie O
+legalnego O
+oprogramowania O
+. O
+
+# sent_id = 308
+TrochÄ™ O
+jak O
+mapa O
+fotoradarów O
+lub O
+znaki O
+z O
+czarnym O
+punktem O
+, O
+które O
+w O
+tym O
+kontekście O
+powinny O
+siÄ™ O
+oczywiście O
+znajdować O
+w O
+większych O
+skupiskach O
+politechnicznych O
+akademików O
+. O
+
+# sent_id = 309
+O O
+ile O
+mapa O
+fotoradarów O
+ma O
+sens O
+: O
+tam O
+gdzie O
+fotoradar O
+kierowca O
+zwalnia O
+i O
+być O
+może O
+jest O
+bezpieczniej O
+, O
+podobnie O
+działają O
+czarne O
+punkty O
+. O
+
+# sent_id = 310
+Ale O
+mapa O
+nalotów O
+jako O
+promocja O
+legalnego O
+oprogramowania O
+? O
+
+# sent_id = 311
+Chyba O
+w O
+formie O
+budzenia O
+paranoi O
+? O
+
+# sent_id = 312
+Bo O
+jeśli O
+na O
+ulicy O
+Sienkiewicza B-nam_fac_road
+, O
+róg O
+Ukrytej B-nam_fac_road
+zgłoszono O
+nalot O
+, O
+to O
+co O
+zrobi O
+pirat O
+? O
+
+# sent_id = 313
+Przejdzie O
+z O
+odtwarzaczem O
+naładowanym O
+nielegalnymi O
+empetrójkami O
+na O
+drugÄ… O
+stronÄ™ O
+ulicy O
+? O
+
+# sent_id = 314
+Przebojem O
+jest O
+jednak O
+to O
+zgłoszenie O
+. O
+
+# sent_id = 315
+Potwierdzone O
+, O
+bo O
+notka O
+z O
+serwisu O
+policji O
+. O
+
+# sent_id = 316
+Ale O
+policja O
+nie O
+podała O
+ulicy O
+, O
+więc O
+zmyślny O
+zgłaszający O
+zaznaczył O
+siedzibÄ™ O
+komendy O
+wojewódzkiej O
+. O
+
+# sent_id = 317
+Najciemniej O
+jest O
+pod O
+latarniÄ… O
+? O
+
+# sent_id = 318
+Trzeba O
+było O
+tak O
+Billowi B-nam_liv_person
+dokładać O
+? O
+
+# sent_id = 319
+Zemsta O
+nadeszła O
+szybko O
+, O
+choć O
+nie O
+niespodziewanie O
+. O
+
+# sent_id = 320
+Pierwsza O
+rocznica O
+wydania O
+Visty B-nam_pro_software
+w O
+ręce O
+konsumentów O
+już O
+niedługo O
+, O
+a O
+ja O
+w O
+ramach O
+prezentu O
+postanowił O
+em O
+sprawić O
+sobie O
+egzemplarz O
+. O
+
+# sent_id = 321
+Już O
+po O
+trzech O
+dniach O
+mam O
+działający O
+system O
+. O
+
+# sent_id = 322
+Wydawało O
+by O
+siÄ™ O
+, O
+że O
+po O
+instalacji O
+kilku O
+dystrybucji O
+Linuksa B-nam_pro_software
+na O
+różnych O
+komputerach O
+, O
+instalacja O
+Windowsa B-nam_pro_software
+nie O
+będzie O
+sprawiała O
+większych O
+problemów O
+. O
+
+# sent_id = 323
+Spodziewał O
+em O
+siÄ™ O
+, O
+że O
+nie O
+będzie O
+siÄ™ O
+Viście B-nam_pro_software
+podobało O
+, O
+że O
+dysk O
+zarażony O
+jest O
+Linuksem B-nam_pro_software
+, O
+więc O
+dostała O
+własny O
+. O
+
+# sent_id = 324
+Instalował O
+em O
+w O
+ciemno O
+, O
+bo O
+program O
+do O
+sprawdzenia O
+, O
+czy O
+komputer O
+spełnia O
+wymagania O
+Visty B-nam_pro_software
+, O
+działa O
+tylko O
+pod O
+Windows B-nam_pro_software
+. O
+
+# sent_id = 325
+Po O
+uruchomieniu O
+płyty O
+instalacyjnej O
+, O
+po O
+chwili O
+pojawia O
+siÄ™ O
+kolorowy O
+ekran O
+i O
+kursor O
+. O
+
+# sent_id = 326
+I O
+nic O
+siÄ™ O
+nie O
+dzieje O
+. O
+
+# sent_id = 327
+Na O
+ekranie O
+żadnych O
+informacji O
+, O
+najmniejszego O
+choćby O
+" O
+czekaj O
+" O
+( O
+które O
+później O
+za O
+to O
+występuje O
+obficie O
+) O
+. O
+
+# sent_id = 328
+Można O
+siÄ™ O
+domyślać O
+, O
+co O
+siÄ™ O
+dzieje O
+. O
+
+# sent_id = 329
+Vista B-nam_pro_software
+formatuje O
+dysk O
+z O
+Linuksem B-nam_pro_software
+? O
+
+# sent_id = 330
+Vista B-nam_pro_software
+próbuje O
+połączyć O
+siÄ™ O
+z O
+Redmond B-nam_loc_gpe_city
+i O
+przesłać O
+tam O
+moje O
+dane O
+osobowe O
+? O
+
+# sent_id = 331
+Vista B-nam_pro_software
+sprawdza O
+numery O
+seryjne O
+wszystkich O
+podzespołów O
+? O
+
+# sent_id = 332
+Wciąż O
+nic O
+siÄ™ O
+nie O
+dzieje O
+, O
+akurat O
+dotarł O
+" O
+Lód B-nam_pro_title
+" O
+Dukaja B-nam_liv_person
+, O
+może O
+zdążę O
+przeczytać O
+, O
+zanim O
+wreszcie O
+system O
+zacznie O
+siÄ™ O
+instalować O
+? O
+
+# sent_id = 333
+Nareszcie O
+- O
+można O
+wybrać O
+dysk O
+dla O
+instalacji O
+. O
+
+# sent_id = 334
+Wybieram O
+, O
+ale O
+" O
+System O
+Windows B-nam_pro_software
+nie O
+może O
+znaleźć O
+woluminu O
+systemowego O
+spełniającego O
+kryteria O
+instalacji O
+" O
+. O
+
+# sent_id = 335
+Pomaga O
+to O
+, O
+czego O
+siÄ™ O
+spodziewał O
+em O
+- O
+fizyczne O
+odłączenie O
+dysku O
+linuksowego O
+. O
+
+# sent_id = 336
+Instalator O
+idzie O
+dalej O
+, O
+dochodzi O
+do O
+" O
+kończenia O
+instalacji O
+" O
+, O
+które O
+trwa O
+nieznośnie O
+długo O
+, O
+tak O
+, O
+już O
+wiem O
+, O
+że O
+ważne O
+jest O
+, O
+jak O
+siÄ™ O
+kończy O
+, O
+byle O
+dziÅ› O
+, O
+resetuje O
+siÄ™ O
+i O
+siÄ™ O
+nie O
+włącza O
+. O
+
+# sent_id = 337
+Okazuje O
+siÄ™ O
+, O
+że O
+reset O
+nie O
+był O
+jednak O
+w O
+planach O
+. O
+
+# sent_id = 338
+Instalacji O
+nie O
+można O
+naprawić O
+ani O
+przywrócić O
+, O
+zaczynam O
+od O
+nowa O
+. O
+
+# sent_id = 339
+" O
+Lód B-nam_pro_title
+" O
+leży O
+i O
+kusi O
+, O
+może O
+zdążę O
+. O
+
+# sent_id = 340
+Licencja O
+przewiduje O
+, O
+że O
+pomoc O
+techniczna O
+przysługuje O
+mi O
+od O
+producenta O
+i O
+montera O
+sprzętu O
+. O
+
+# sent_id = 341
+Hmm O
+. O
+
+# sent_id = 342
+To O
+chyba O
+ja O
+. O
+
+# sent_id = 343
+Mam O
+szczęście O
+, O
+trafił O
+em O
+na O
+kogoÅ› O
+, O
+do O
+kogo O
+dodzwoniÄ™ O
+siÄ™ O
+za O
+pierwszym O
+razem O
+i O
+nie O
+będę O
+musiał O
+słuchać O
+przez O
+pół O
+godziny O
+Stinga B-nam_liv_person
+w O
+czasie O
+Å‚Ä…czenia O
+z O
+właściwym O
+działem O
+. O
+
+# sent_id = 344
+Rada O
+pierwsza O
+- O
+rekompilacja O
+jÄ…dra O
+. O
+
+# sent_id = 345
+Nie O
+? O
+
+# sent_id = 346
+To O
+może O
+wyjść O
+i O
+wejść O
+? O
+
+# sent_id = 347
+WychodzÄ™ O
+i O
+wchodzÄ™ O
+od O
+nowa O
+. O
+
+# sent_id = 348
+Nie O
+pomaga O
+. O
+
+# sent_id = 349
+Nie O
+pomaga O
+z O
+przyłączonym O
+ponownie O
+dyskiem O
+, O
+nie O
+pomaga O
+z O
+wyjętą O
+kartÄ… O
+wifi B-nam_oth_tech
+, O
+nie O
+pomaga O
+z O
+przyłączonym O
+kablem O
+sieciowym O
+( O
+żeby O
+aktualizacje O
+mogły O
+siÄ™ O
+zaktualizować O
+) O
+, O
+nie O
+pomaga O
+z O
+odłączonym O
+w O
+BIOSie B-nam_pro_software
+ethernetem B-nam_oth_tech
+( O
+tak O
+niby O
+sugeruje O
+strona O
+producenta O
+płyty O
+głównej O
+) O
+. O
+
+# sent_id = 350
+Przychodzi O
+czas O
+rozwiązań O
+desperackich O
+, O
+mija O
+już O
+około O
+8 O
+godzin O
+od O
+rozpoczęcia O
+zabawy O
+, O
+" O
+Lód B-nam_pro_title
+" O
+siÄ™ O
+już O
+czyta O
+siÄ™ O
+, O
+na O
+jakimÅ› O
+forum O
+przeczytało O
+siÄ™ O
+, O
+że O
+należy O
+zamienić O
+miejscami O
+kości O
+pamięci O
+RAM B-nam_oth_tech
+. O
+
+# sent_id = 351
+Pił O
+em O
+wczoraj O
+herbatÄ™ O
+z O
+fusami O
+i O
+proszÄ™ O
+- O
+fusy O
+ułożyły O
+siÄ™ O
+znaczÄ…co O
+, O
+pozwalajÄ…c O
+na O
+przeprowadzenie O
+dokładnej O
+analizy O
+globalnej O
+sytuacji O
+gospodarczej O
+. O
+
+# sent_id = 352
+Zainteresowanych O
+metodami O
+badawczymi O
+odsyłam O
+do O
+źródeł O
+. O
+
+# sent_id = 353
+Niestety O
+, O
+nie O
+udało O
+mi O
+siÄ™ O
+ustalić O
+kolejności O
+chronologicznej O
+tych O
+wszystkich O
+tragicznych O
+zdarzeń O
+, O
+do O
+tego O
+trzeba O
+było O
+by O
+zrobić O
+mocnÄ… O
+zalewanÄ… O
+kawÄ™ O
+. O
+
+# sent_id = 354
+Jeszcze O
+nie O
+jestem O
+gotów O
+na O
+takie O
+poświęcenie O
+dla O
+ludzkości O
+. O
+
+# sent_id = 355
+Przedstawiam O
+więc O
+zdarzenia O
+w O
+kolejności O
+przypadkowej O
+. O
+
+# sent_id = 356
+Wielki O
+pożar O
+zniszczy O
+chiński B-nam_adj_country
+bank O
+centralny O
+, O
+gdzie O
+spłoną O
+żywcem O
+miliardy O
+dolarów B-nam_oth_currency
+w O
+dolarach B-nam_oth_currency
+i O
+obligacjach O
+. O
+
+# sent_id = 357
+PociÄ…gnie O
+to O
+za O
+sobÄ… O
+wielki O
+krach O
+na O
+tamtejszej O
+giełdzie O
+i O
+odwołanie O
+Expo B-nam_eve_human
+w O
+Szanghaju B-nam_loc_gpe_city
+( O
+Wrocław B-nam_loc_gpe_city
+będzie O
+starał O
+siÄ™ O
+naprędce O
+zorganizować O
+wystawÄ™ O
+w O
+Hali B-nam_fac_goe
+Stulecia I-nam_fac_goe
+, O
+ale O
+BIE B-nam_org_organization
+zdecyduje O
+, O
+że O
+lepszym O
+miejscem O
+jest O
+boisko O
+do O
+krykieta O
+w O
+Saint B-nam_loc_gpe_city
+John's I-nam_loc_gpe_city
+) O
+. O
+
+# sent_id = 358
+PrawdopodobnÄ… O
+przyczynÄ… O
+pożaru O
+będzie O
+chęć O
+zniszczenia O
+dowodów O
+na O
+doping O
+chińskich B-nam_adj_country
+sportowców O
+podczas O
+igrzysk O
+w O
+Pekinie B-nam_loc_gpe_city
+. O
+
+# sent_id = 359
+Krach O
+na O
+chińskiej B-nam_adj_country
+giełdzie O
+pociÄ…gnie O
+za O
+sobÄ… O
+krach O
+w O
+USA B-nam_loc_gpe_country
+, O
+wyginÄ… O
+najpierw O
+najsłabsze O
+firmy O
+internetowe B-nam_adj
+i O
+telekomunikacyjne O
+, O
+róbcie O
+kopie O
+zapasowe O
+danych O
+z O
+Facebooka B-nam_pro_media_web
+! O
+
+# sent_id = 360
+RosnÄ…ce O
+ceny O
+energii O
+( O
+ropa O
+po O
+206 O
+, O
+50 O
+$ B-nam_oth_currency
+za O
+baryłkę O
+, O
+było O
+to O
+wyraźnie O
+widoczne O
+w O
+ułożeniu O
+kawałka O
+łodyżki O
+na O
+połówce O
+liścia O
+) O
+doprowadzÄ… O
+do O
+szybkiego O
+wzrostu O
+cen O
+przechowywania O
+danych O
+, O
+co O
+uderzy O
+bezpośrednio O
+w O
+Google B-nam_org_company
+, O
+Yahoo B-nam_org_company
+i O
+inne O
+duże O
+firmy O
+, O
+których O
+nie O
+dobił O
+jeszcze O
+krach O
+na O
+giełdzie O
+. O
+
+# sent_id = 361
+Fundacja O
+państwa O
+Gatesów B-nam_liv_person
+przeznaczy O
+ogromne O
+środki O
+na O
+ratowanie O
+internetu B-nam_oth_tech
+, O
+ale O
+niewiele O
+to O
+pomoże O
+- O
+konieczne O
+będzie O
+wprowadzenie O
+opłat O
+. O
+
+# sent_id = 362
+Koniec O
+z O
+trzymaniem O
+całej O
+poczty O
+na O
+serwerach O
+, O
+koniec O
+z O
+WikipediÄ… B-nam_pro_media_web
+, O
+iTunes B-nam_pro_software
+, O
+Second B-nam_pro_media_web
+Life I-nam_pro_media_web
+, O
+Last.fm B-nam_pro_media_web
+i O
+inne O
+pożeracze O
+przepustowości O
+tylko O
+dla O
+prawdziwych O
+bogaczy O
+, O
+kampanie O
+reklamowe O
+we O
+flashu O
+również O
+nie O
+dla O
+każdego O
+. O
+
+# sent_id = 363
+Internet B-nam_oth_tech
+schudnie O
+, O
+w O
+większości O
+wróci O
+do O
+formatu O
+tekstowego O
+z O
+poczÄ…tku O
+lat O
+dziewięćdziesiątych O
+, O
+a O
+za O
+wszystkie O
+wodotryski O
+trzeba O
+będzie O
+słono O
+płacić O
+. O
+
+# sent_id = 364
+Handel O
+internetowy O
+wróci O
+do O
+źródeł O
+- O
+na O
+łóżka O
+polowe O
+i O
+do O
+szczęk O
+, O
+najwięcej O
+będzie O
+można O
+zaoszczędzić O
+na O
+elektryczności O
+. O
+
+# sent_id = 365
+Coraz O
+większy O
+koszt O
+alternatywny O
+czasu O
+wolnego O
+i O
+coraz O
+droższe O
+przechowywanie O
+danych O
+, O
+przepustowość O
+i O
+nawet O
+włączanie O
+własnego O
+komputera O
+na O
+cały O
+dzień O
+spowodujÄ… O
+, O
+że O
+dramatycznie O
+zmaleje O
+liczba O
+ochotników O
+w O
+projektach O
+wolnego O
+oprogramowania O
+i O
+wolnej O
+kultury O
+. O
+
+# sent_id = 366
+Creative B-nam_org_organization
+Commons I-nam_org_organization
+zejdzie O
+do O
+podziemia O
+, O
+gdzie O
+dzięki O
+energii O
+pozyskiwanej O
+z O
+kiszonej O
+kapusty O
+będzie O
+wciąż O
+promować O
+wolne O
+( O
+i O
+niewolne O
+) O
+licencje O
+, O
+w O
+tym O
+nowÄ… O
+licencjÄ™ O
+Attribution B-nam_oth_license
+- I-nam_oth_license
+ShareAlike I-nam_oth_license
+- I-nam_oth_license
+LowWatt I-nam_oth_license
+. O
+
+# sent_id = 385
+Punktem O
+wyjścia O
+dla O
+Benklera B-nam_liv_person
+jest O
+analiza O
+ekonomiczna O
+, O
+ale O
+to O
+z O
+wykształcenia O
+prawnik O
+, O
+więc O
+nic O
+dziwnego O
+, O
+że O
+szuka O
+następnie O
+drugiego O
+dna O
+. O
+
+# sent_id = 386
+Potem O
+trzeciego O
+, O
+czwartego O
+. O
+. O
+. O
+
+# sent_id = 387
+" O
+Bogactwo B-nam_pro_title
+sieci I-nam_pro_title
+" O
+, O
+instrukcja O
+do O
+rozdziałów O
+1 O
+- O
+6 O
+. O
+
+# sent_id = 388
+Rozdział O
+1 O
+- O
+Wprowadzenie O
+Cała O
+książka O
+w O
+pigułce O
+. O
+
+# sent_id = 389
+Przed O
+zażyciem O
+skonsultuj O
+siÄ™ O
+z O
+lekarzem O
+lub O
+farmaceutÄ… O
+. O
+
+# sent_id = 390
+Jeśli O
+przełkniesz O
+bez O
+trudu O
+- O
+to O
+książka O
+dla O
+Ciebie O
+, O
+nawet O
+najbardziej O
+zawiłe O
+rozważania O
+przeczytasz O
+od O
+razu O
+. O
+
+# sent_id = 391
+Jeśli O
+nie O
+- O
+wciąż O
+możesz O
+dać O
+reszcie O
+rozdziałów O
+szansÄ™ O
+, O
+a O
+wprowadzenie O
+przeczytać O
+sobie O
+na O
+końcu O
+. O
+
+# sent_id = 392
+Chociaż O
+to O
+właśnie O
+tu O
+Benkler B-nam_liv_person
+wyjaśnia O
+, O
+że O
+nie O
+jest O
+anarchokomunistÄ… O
+. O
+
+# sent_id = 393
+Rozdział O
+2 O
+- O
+Wybrane O
+cechy O
+ekonomiczne O
+produkcji O
+informacji O
+oraz O
+innowacyjności O
+. O
+
+# sent_id = 394
+Właściwie O
+dlaczego O
+informacja O
+nie O
+powinna O
+być O
+przedmiotem O
+własności O
+tak O
+samo O
+jak O
+samochód O
+? O
+
+# sent_id = 395
+Czy O
+prawo O
+powinno O
+uwzględniać O
+różne O
+strategie O
+produkcji O
+i O
+wymiany O
+informacji O
+? O
+
+# sent_id = 396
+Dlaczego O
+oparcie O
+siÄ™ O
+na O
+prawach O
+wyłącznych O
+faworyzuje O
+jeden O
+model O
+, O
+który O
+Benkler B-nam_liv_person
+niewinnie O
+nazywa O
+MyszkÄ… B-nam_liv_character
+Miki I-nam_liv_character
+? O
+
+# sent_id = 397
+Rozdział O
+3 O
+- O
+Produkcja O
+partnerska O
+i O
+dzielenie O
+siÄ™ O
+Istota O
+rozważań O
+Benklera B-nam_liv_person
+. O
+
+# sent_id = 398
+Może O
+o O
+kilka O
+zdań O
+za O
+dużo O
+, O
+ale O
+jeśli O
+pominie O
+siÄ™ O
+rozdział O
+o O
+produkcji O
+partnerskiej O
+, O
+to O
+można O
+już O
+zacząć O
+siÄ™ O
+zastanawiać O
+, O
+czy O
+jak O
+na O
+przycisk O
+do O
+papieru O
+ksiÄ…zka O
+nie O
+jest O
+jednak O
+zbyt O
+nieporęczna O
+. O
+
+# sent_id = 399
+Rozdział O
+4 O
+- O
+Ekonomika O
+produkcji O
+społecznej O
+Produkcja O
+partnerska O
+to O
+piękna O
+teoria O
+, O
+ale O
+czy O
+to O
+przypadkiem O
+nie O
+Adam B-nam_liv_person
+Smith I-nam_liv_person
+przewraca O
+siÄ™ O
+w O
+grobie O
+? O
+
+# sent_id = 400
+Chyba O
+jednak O
+nie O
+, O
+Benkler B-nam_liv_person
+konsekwentnie O
+dowodzi O
+, O
+że O
+produkcja O
+społeczna O
+, O
+to O
+nie O
+to O
+samo O
+co O
+gospodarka O
+uspołeczniona O
+. O
+
+# sent_id = 401
+To O
+więcej O
+liberalizmu O
+w O
+liberalizmie O
+niż O
+na O
+Wall B-nam_fac_road
+Street I-nam_fac_road
+. O
+
+# sent_id = 402
+Rozdział O
+5 O
+- O
+Wolność O
+osobista O
+- O
+autonomia O
+, O
+informacja O
+i O
+prawo O
+. O
+
+# sent_id = 403
+Masz O
+problemy O
+z O
+zasypianiem O
+? O
+
+# sent_id = 404
+Dość O
+rozwlekłe O
+tłumaczenia O
+prostej O
+prawdy O
+, O
+że O
+duży O
+wybór O
+jest O
+dobry O
+. O
+
+# sent_id = 405
+Owszem O
+, O
+ciekawe O
+, O
+ale O
+następne O
+rozdziały O
+sÄ… O
+ciekawsze O
+. O
+
+# sent_id = 406
+Rozdział O
+6 O
+- O
+Wolność O
+polityczna O
+- O
+część O
+1 O
+; O
+Problem O
+ze O
+środkami O
+masowego O
+przekazu O
+. O
+
+# sent_id = 407
+Rozważania O
+o O
+tym O
+, O
+jak O
+działają O
+media O
+i O
+dlaczego O
+, O
+a O
+w O
+nagrodÄ™ O
+bardzo O
+ciekawa O
+historia O
+radia O
+i O
+tabelka O
+, O
+która O
+wyjaśnia O
+jak O
+to O
+siÄ™ O
+dzieje O
+, O
+że O
+większość O
+stacji O
+telewizyjnych O
+pokazuje O
+seriale O
+. O
+
+# sent_id = 415
+Microsoft B-nam_org_company
+po O
+raz O
+kolejny O
+udaje O
+, O
+że O
+ugiÄ…Å‚ O
+siÄ™ O
+pod O
+naciskiem O
+Komisji B-nam_org_institution
+Europejskiej I-nam_org_institution
+i O
+po O
+raz O
+kolejny O
+ogłasza O
+zasady O
+interoperacyjności O
+obiecujÄ…c O
+wolność O
+, O
+równość O
+i O
+braterstwo O
+. O
+
+# sent_id = 416
+W O
+" O
+zasadach O
+interoperacyjności O
+" O
+słowo O
+" O
+otwarte O
+" O
+powtórzone O
+zostało O
+czterdzieści O
+razy O
+. O
+
+# sent_id = 417
+Jednak O
+" O
+otwartość O
+" O
+według O
+Microsoftu B-nam_org_company
+oznacza O
+po O
+pierwsze O
+, O
+że O
+za O
+korzystanie O
+z O
+otwartych O
+protokołów O
+trzeba O
+płacić O
+. O
+
+# sent_id = 418
+Gest O
+polega O
+na O
+tym O
+, O
+że O
+opłata O
+nie O
+będzie O
+nikogo O
+dyskryminować O
+, O
+nazwijmy O
+to O
+równością O
+. O
+
+# sent_id = 419
+Nie O
+ma O
+co O
+siÄ™ O
+czepiać O
+, O
+że O
+patenty O
+na O
+oprogramowanie O
+jako O
+takie O
+w O
+Europie B-nam_loc_land_continent
+nie O
+powinny O
+obowiązywać O
+- O
+Amerykanie B-nam_org_nation
+płacą O
+, O
+więc O
+Europejczycy B-nam_org_nation
+też O
+powinni O
+. O
+
+# sent_id = 420
+Niech O
+to O
+będzie O
+braterstwo O
+. O
+
+# sent_id = 421
+Po O
+drugie O
+" O
+otwartość O
+" O
+( O
+protokołów O
+) O
+oznacza O
+, O
+że O
+programiści O
+tworzÄ…cy O
+wolne O
+oprogramowanie O
+mogÄ… O
+owszem O
+z O
+niej O
+korzystać O
+, O
+ale O
+tylko O
+do O
+celów O
+niekomercyjnych O
+, O
+na O
+podstawie O
+jednostronnego O
+oświadczenia O
+MS B-nam_org_company
+, O
+że O
+nie O
+zostanÄ… O
+pozwani O
+. O
+
+# sent_id = 422
+No O
+i O
+mamy O
+wolność O
+. O
+
+# sent_id = 423
+A O
+gdyby O
+tak O
+pójść O
+w O
+drugÄ… O
+stronÄ™ O
+i O
+zmusić O
+MS B-nam_org_company
+do O
+zamknięcia O
+wszystkich O
+API O
+i O
+protokołów O
+, O
+dać O
+im O
+możliwość O
+zrobienia O
+kompletnego O
+systemu O
+z O
+programami O
+do O
+wszystkiego O
+- O
+z O
+Officem B-nam_pro_software
+od O
+razu O
+wbudowanym O
+w O
+Windows B-nam_pro_software
+, O
+nieusuwalnym O
+Internet B-nam_pro_software
+Explorerem I-nam_pro_software
+, O
+odtwarzaczem O
+multimedialnym O
+grajÄ…cym O
+wyłącznie O
+microsoftowy O
+DRM O
+. O
+. O
+. O
+
+# sent_id = 424
+Chcesz O
+grać O
+? O
+
+# sent_id = 425
+Kup O
+konsolÄ™ O
+, O
+a O
+najlepiej O
+trzy O
+. O
+
+# sent_id = 426
+Chcesz O
+Photoshopa B-nam_pro_software
+? O
+
+# sent_id = 427
+Kup O
+maka O
+. O
+
+# sent_id = 428
+Chcesz O
+system O
+do O
+sprawdzania O
+poczty O
+i O
+profilu O
+na O
+naszej B-nam_pro_media_web
+klasie I-nam_pro_media_web
+? O
+
+# sent_id = 429
+Jest O
+Ubuntu B-nam_pro_software
+. O
+
+# sent_id = 430
+Może O
+zamiast O
+otwierać O
+oprogramowanie O
+wszystkich O
+urządzeń O
+, O
+żeby O
+były O
+podobne O
+do O
+pecetów O
+( O
+droga O
+, O
+którą O
+wybrała O
+FSF B-nam_org_organization
+wydajÄ…c O
+GPLv3 B-nam_oth_license
+) O
+, O
+należy O
+rynek O
+pecetów O
+upodobnić O
+do O
+rynku O
+komórek O
+? O
+
+# sent_id = 431
+W O
+końcu O
+już O
+teraz O
+kupujÄ…c O
+dostęp O
+do O
+internetu B-nam_oth_tech
+można O
+dostać O
+na O
+kredyt O
+laptopa O
+. O
+
+# sent_id = 432
+Czy O
+to O
+aż O
+tak O
+wielka O
+różnica O
+, O
+jaki O
+system O
+jest O
+na O
+nim O
+preinstalowany O
+? O
+
+# sent_id = 433
+W O
+dzień B-nam_eve_human_holiday
+matki I-nam_eve_human_holiday
+program B-nam_pro_media_radio
+trzeci I-nam_pro_media_radio
+polskiego B-nam_org_company
+radia I-nam_org_company
+zapowiedział O
+- O
+przygotowany O
+specjalnie O
+na O
+tÄ™ O
+okazjÄ™ O
+( O
+sic O
+! O
+) O
+- O
+reportaż O
+o O
+zagrożeniach O
+czyhajÄ…cych O
+na O
+młodzież O
+w O
+dzisiejszych O
+czasach O
+. O
+
+# sent_id = 434
+Redaktor O
+jednym O
+tchem O
+wymienił O
+" O
+alkohol O
+, O
+narkotyki O
+i O
+internet B-nam_oth_tech
+" O
+. O
+
+# sent_id = 435
+Reportaż O
+jakoÅ› O
+mi O
+umknÄ…Å‚ O
+, O
+została O
+w O
+głowie O
+zapowiedź O
+, O
+która O
+wraca O
+przy O
+okazji O
+rzÄ…dowych O
+planów O
+rozdawania O
+laptopów O
+gimnazjalistom O
+. O
+
+# sent_id = 436
+RzÄ…dowe O
+plany O
+też O
+nie O
+sÄ… O
+szczególnie O
+nowe O
+, O
+przypomniały O
+mi O
+siÄ™ O
+w O
+zwiÄ…zku O
+z O
+Rybczyńskim B-nam_liv_person
+( O
+wkrótce O
+) O
+, O
+a O
+wczoraj O
+nawet O
+trafił O
+siÄ™ O
+w O
+Wyborczej B-nam_pro_media_periodic
+artykuł O
+na O
+ten O
+temat O
+, O
+w O
+którym O
+dziennikarz O
+zaczyna O
+od O
+odkrywczego O
+pytania O
+, O
+dlaczego O
+Intelowi B-nam_org_company
+zależy O
+na O
+sprzedaży O
+większej O
+liczby O
+komputerów O
+, O
+a O
+pani O
+z O
+Intela B-nam_org_company
+opowiada O
+ciekawe O
+anegdoty O
+o O
+podobnych O
+programach O
+w O
+innych O
+krajach O
+( O
+mimo O
+pierwszego O
+pytania O
+warto O
+przeczytać O
+) O
+. O
+
+# sent_id = 437
+Na O
+dodatek O
+w O
+ostatniej O
+swojej O
+wypowiedzi O
+wypowiada O
+kluczowÄ… O
+kwestiÄ™ O
+" O
+a O
+co O
+potem O
+? O
+" O
+
+# sent_id = 438
+PomijajÄ…c O
+chwilowo O
+kwestiÄ™ O
+tego O
+, O
+co O
+znajdzie O
+siÄ™ O
+w O
+rozdawanych O
+komputerach O
+, O
+zastanawiam O
+siÄ™ O
+, O
+w O
+jaki O
+sposób O
+te O
+laptopy O
+będą O
+łączyć O
+siÄ™ O
+z O
+internetem B-nam_oth_tech
+. O
+
+# sent_id = 439
+Rozumiem O
+, O
+że O
+zasypywanie O
+cyfrowych O
+podziałów O
+wymaga O
+dofinansowania O
+Intela B-nam_org_company
+/ O
+AMD B-nam_org_company
+i O
+Microsoftu B-nam_org_company
+( O
+który O
+bez O
+mrugnięcia O
+może O
+wyposażyć O
+każdą O
+ilość O
+komputerów O
+dla O
+uczniów O
+w O
+oprogramowanie O
+za O
+symbolicznÄ… O
+opłatą O
+) O
+, O
+ale O
+czyżby O
+również O
+ostatecznie O
+państwo O
+miało O
+by O
+sfinansować O
+infrastrukturÄ™ O
+3G B-nam_oth_tech
+dla O
+firm O
+telekomunikacyjnych O
+? O
+
+# sent_id = 440
+Czy O
+może O
+poza O
+miastami O
+gimnazjaliści O
+mieli O
+by O
+zadowolić O
+siÄ™ O
+dostępem O
+przez O
+GPRS B-nam_oth_tech
+/ O
+EDGE B-nam_oth_tech
+? O
+
+# sent_id = 441
+To O
+może O
+równie O
+dobrze O
+od O
+razu O
+rozdać O
+im O
+Playstation B-nam_pro_brand
+? O
+
+# sent_id = 442
+W O
+ramach O
+programu O
+pojawiajÄ… O
+siÄ™ O
+hasła O
+o O
+" O
+doprowadzaniu O
+szerokopasmowego O
+internetu B-nam_oth_tech
+" O
+, O
+czy O
+to O
+zapowiedź O
+światłowodów O
+traktowanych O
+na O
+równi O
+z O
+kanalizacjÄ… O
+? O
+
+# sent_id = 443
+Nawet O
+jeżeli O
+zapomnieć O
+o O
+polskich B-nam_adj_country
+realiach O
+i O
+uznać O
+, O
+że O
+do O
+każdej O
+gminnej O
+szkoły O
+dociągnięty O
+zostanie O
+światłowód O
+, O
+co O
+z O
+ostatniÄ… O
+milÄ… O
+? O
+
+# sent_id = 444
+Czy O
+szkoła O
+ma O
+stać O
+siÄ™ O
+podstawÄ… O
+dla O
+gminnej O
+sieci O
+WiFi B-nam_oth_tech
+? O
+
+# sent_id = 445
+Czy O
+za O
+darmo O
+będą O
+mogli O
+z O
+niej O
+korzystać O
+jedynie O
+gimnazjaliści O
+w O
+swoich O
+laptopach O
+? O
+
+# sent_id = 446
+Można O
+sięgnąć O
+do O
+utopijnych O
+wizji O
+wszechobecnych O
+sieci O
+bezprzewodowych O
+Benklera B-nam_liv_person
+, O
+który O
+liczy O
+na O
+to O
+, O
+że O
+domyślnym O
+ustawieniem O
+ruterów O
+pozostanÄ… O
+sieci O
+otwarte O
+, O
+bez O
+żadnych O
+wepów O
+i O
+wapów O
+, O
+dzięki O
+czemu O
+każdy O
+zawsze O
+i O
+wszędzie O
+będzie O
+mógł O
+skorzystać O
+z O
+zasięgu O
+. O
+
+# sent_id = 447
+Benkler B-nam_liv_person
+starannie O
+omija O
+problem O
+gapowicza O
+- O
+w O
+przypadku O
+rzÄ…dowego O
+programu O
+ominięcie O
+problemu O
+można O
+wymusić O
+rozdajÄ…c O
+oprócz O
+laptopów O
+bezprzewodowe O
+rutery O
+, O
+w O
+których O
+żadnych O
+zabezpieczeń O
+nie O
+można O
+włączyć O
+( O
+o O
+matko O
+! O
+) O
+. O
+
+# sent_id = 448
+A O
+może O
+pójść O
+jeszcze O
+dalej O
+i O
+zaplanować O
+rzeczywiście O
+nowatorskie O
+oprogramowanie O
+i O
+odpowiednie O
+urzÄ…dzenia O
+w O
+laptopach O
+, O
+które O
+odtwarzały O
+by O
+windowsowego O
+buga O
+, O
+słynne O
+" O
+Free B-nam_eve_human
+Public I-nam_eve_human
+WiFi I-nam_eve_human
+" O
+. O
+
+# sent_id = 449
+Szkoła O
+była O
+by O
+źródłem O
+pierwszego O
+sygnału O
+, O
+który O
+rozprzestrzeniał O
+by O
+siÄ™ O
+dzięki O
+laptopom O
+działającym O
+w O
+trybie O
+ad O
+hoc O
+( O
+czy O
+też O
+" O
+komputer O
+- O
+komputer O
+" O
+) O
+. O
+
+# sent_id = 450
+W O
+końcu O
+nastąpiło O
+oficjalne O
+kulinarne O
+rozpoczęcie O
+sezonu O
+wiosennego O
+. O
+
+# sent_id = 451
+Flamandzkie O
+radioaktywne O
+pomidory O
+i O
+nadmuchiwane O
+rzodkiewki O
+nas O
+nie O
+zmyliły O
+, O
+czekali O
+śmy O
+na O
+poczÄ…tek O
+maja O
+, O
+który O
+kojarzy O
+nam O
+siÄ™ O
+z O
+jednym O
+. O
+
+# sent_id = 452
+Kiełbasą O
+z O
+grilla O
+. O
+
+# sent_id = 453
+Karkówką O
+. O
+
+# sent_id = 454
+DÅ‚ugim O
+weekendem O
+. O
+
+# sent_id = 455
+Kilka O
+dni O
+temu O
+po O
+raz O
+pierwszy O
+w O
+naszym O
+sklepie O
+mignęły O
+nam O
+jakieÅ› O
+wysuszone O
+, O
+w O
+zaporowej O
+cenie O
+, O
+nie O
+dali O
+śmy O
+siÄ™ O
+nabrać O
+. O
+
+# sent_id = 456
+Czekali O
+śmy O
+. O
+
+# sent_id = 457
+Wreszcie O
+pojawiły O
+siÄ™ O
+warzywniaku O
+. O
+
+# sent_id = 458
+Białe O
+, O
+w O
+dwóch O
+rozmiarach O
+. O
+
+# sent_id = 459
+Grube O
+i O
+cienkie O
+. O
+
+# sent_id = 460
+Wiosna O
+w O
+kuchni O
+rozpoczęta O
+. O
+
+# sent_id = 461
+Na O
+debiut O
+wybrali O
+śmy O
+od O
+razu O
+dwie O
+paczki O
+( O
+w O
+końcu O
+sezon O
+jednak O
+krótki O
+) O
+. O
+
+# sent_id = 462
+Żeby O
+podkreślić O
+rangÄ™ O
+wydarzenia O
+zrobili O
+śmy O
+suflety O
+z O
+kozim O
+serem O
+. O
+
+# sent_id = 463
+Sufletów O
+nie O
+robili O
+śmy O
+nigdy O
+wcześniej O
+, O
+ale O
+skoro O
+dorobili O
+śmy O
+siÄ™ O
+foremek O
+, O
+należało O
+siÄ™ O
+kiedyÅ› O
+odważyć O
+. O
+
+# sent_id = 464
+Nie O
+był O
+to O
+na O
+pewno O
+ostatni O
+raz O
+. O
+
+# sent_id = 465
+Zestaw O
+okazał O
+siÄ™ O
+w O
+ogóle O
+udany O
+, O
+może O
+było O
+by O
+ciekawiej O
+z O
+zielonymi O
+zamiast O
+białych O
+. O
+
+# sent_id = 466
+Szparagami O
+oczywiście O
+. O
+
+# sent_id = 467
+IdÄ™ O
+do O
+sklepu O
+. O
+
+# sent_id = 468
+SÄ…dy O
+wciąż O
+nie O
+rozumiejÄ… O
+koncepcji O
+linków O
+, O
+poza O
+tym O
+orzecznictwo O
+w O
+Polsce B-nam_loc_gpe_country
+ma O
+zastosowanie O
+w O
+konkretnych O
+sprawach O
+. O
+
+# sent_id = 469
+Gdyby O
+polegać O
+na O
+wyrokach O
+z O
+całego O
+świata O
+w O
+sprawie O
+linków O
+, O
+internetu B-nam_oth_tech
+już O
+dawno O
+by O
+nie O
+było O
+. O
+
+# sent_id = 470
+Pewnym O
+ułatwieniem O
+w O
+dyskusji O
+było O
+by O
+odróżnienie O
+linków O
+do O
+youtube B-nam_pro_media_web
+( O
+które O
+na O
+przykład O
+ja O
+mam O
+u O
+siebie O
+, O
+głównie O
+dlatego O
+, O
+że O
+flash O
+pod O
+linuksem B-nam_pro_software
+to O
+wciąż O
+nie O
+jest O
+miłe O
+doświadczenie O
+mimo O
+wersji O
+stabilnej O
+i O
+oficjalnej O
+, O
+na O
+moim O
+starym O
+notebooku O
+można O
+grillować O
+kiełbaski O
+już O
+w O
+drugiej O
+minucie O
+filmu O
+) O
+od O
+" O
+embedów O
+" O
+, O
+które O
+jednak O
+sÄ… O
+bliżej O
+rozpowszechniania O
+. O
+
+# sent_id = 471
+Miłośnikom O
+takich O
+terminów O
+jak O
+" O
+pola O
+eksploatacji O
+" O
+i O
+" O
+głębokie O
+linki O
+" O
+polecam O
+archiwum O
+listy O
+CC B-nam_org_organization
+, O
+gdzie O
+odbyła O
+siÄ™ O
+miła O
+dyskusja O
+na O
+ten O
+temat O
+. O
+
+# sent_id = 472
+Na O
+youtube B-nam_pro_media_web
+poszkodowanym O
+przysługują O
+według O
+prawa O
+amerykańskiego O
+całkiem O
+sprawne O
+procedury O
+żądania O
+usunięcia O
+treści O
+, O
+może O
+nie O
+tak O
+dobre O
+jak O
+wizyta O
+policji O
+o O
+szóstej O
+rano O
+, O
+ale O
+równie O
+skuteczne O
+- O
+na O
+hasło O
+DMCA B-nam_pro_title_document
+niejeden O
+twardziel O
+sformatował O
+dysk O
+twardy O
+. O
+
+# sent_id = 473
+Z O
+ciekawych O
+naciÄ…ganych O
+analogii O
+jest O
+jeszcze O
+sprawa O
+chłopaka O
+, O
+który O
+linkował O
+do O
+teledysku O
+depeche B-nam_org_group_band
+mode I-nam_org_group_band
+. O
+
+# sent_id = 474
+Podał O
+link O
+, O
+a O
+potem O
+poddał O
+siÄ™ O
+dobrowolnie O
+karze O
+, O
+co O
+automatycznie O
+oznacza O
+, O
+że O
+przyznał O
+siÄ™ O
+do O
+winy O
+, O
+a O
+winÄ™ O
+tÄ™ O
+zaklepał O
+sÄ…d O
+. O
+
+# sent_id = 475
+Czyli O
+jest O
+precedens O
+, O
+oczywiście O
+w O
+kraju O
+bez O
+precedensów O
+. O
+
+# sent_id = 476
+Z O
+drugiej O
+strony O
+też O
+mi O
+oczywiście O
+przychodzi O
+do O
+głowy O
+art O
+. O
+29 O
+ust O
+. O
+1 O
+prawa B-nam_pro_title_document
+autorskiego I-nam_pro_title_document
+, O
+w O
+końcu O
+" O
+prawami O
+gatunku O
+twórczości O
+blog O
+" O
+jest O
+włączanie O
+filmów O
+z O
+youtube B-nam_pro_media_web
+, O
+szczególnie O
+gdy O
+siÄ™ O
+o O
+nich O
+pisze O
+. O
+
+# sent_id = 516
+BrnÄ…c O
+dalej O
+w O
+brodatÄ… O
+metaforÄ™ O
+drogi O
+, O
+nowÄ… O
+propozycjÄ™ O
+UKE B-nam_org_institution
+trudno O
+nawet O
+porównać O
+z O
+typowÄ… O
+polskÄ… O
+drogÄ… O
+krajowÄ… O
+, O
+pełną O
+kolein O
+, O
+źle O
+wyprofilowanych O
+zakrętów O
+i O
+nieoznakowanych O
+skrzyżowań O
+. O
+
+# sent_id = 517
+To O
+raczej O
+droga O
+polna O
+, O
+na O
+niektórych O
+odcinkach O
+wyasfaltowana O
+, O
+ale O
+też O
+niechlujnie O
+. O
+
+# sent_id = 518
+Pomysł O
+UKE B-nam_org_institution
+zakłada O
+, O
+że O
+darmowy O
+bezprzewodowy O
+internet B-nam_oth_tech
+- O
+do O
+którego O
+, O
+podobnie O
+jak O
+w O
+projekcie O
+FCC B-nam_org_institution
+w O
+USA B-nam_loc_gpe_country
+- O
+zmuszÄ… O
+operatora O
+warunki O
+koncesji O
+na O
+częstotliwość O
+, O
+będzie O
+ograniczony O
+w O
+każdy O
+możliwy O
+sposób O
+: O
+256kb O
+na O
+sekundÄ™ O
+, O
+500MB O
+danych O
+na O
+miesiÄ…c O
+i O
+jedna O
+sesja O
+maksymalnie O
+na O
+30 O
+minut O
+. O
+
+# sent_id = 519
+Nawet O
+na O
+korzystanie O
+z O
+naszej B-nam_pro_media_web
+klasy I-nam_pro_media_web
+to O
+za O
+mało O
+. O
+
+# sent_id = 520
+To O
+kolejny O
+projekt O
+na O
+froncie O
+walki O
+z O
+cyfrowym O
+wykluczeniem O
+, O
+który O
+nawet O
+w O
+statystykach O
+nie O
+będzie O
+widoczny O
+. O
+
+# sent_id = 521
+Dostęp O
+szerokopasmowy O
+jako O
+wskaźnik O
+zaawansowania O
+cywilizacyjnego O
+przestaje O
+bowiem O
+wystarczać O
+. O
+
+# sent_id = 522
+Unia B-nam_org_organization
+Europejska I-nam_org_organization
+- O
+do O
+niedawna O
+zwracajÄ…ca O
+szczególną O
+uwagÄ™ O
+na O
+zasięg O
+szerokopasmowego O
+internetu B-nam_oth_tech
+, O
+który O
+pozwalał O
+twierdzić O
+, O
+że O
+w O
+rozwoju O
+społeczeństwa O
+informacyjnego O
+wyprzedzamy O
+( O
+przynajmniej O
+w O
+rozmiarze O
+EU B-nam_org_organization_sub
+- I-nam_org_organization_sub
+15 I-nam_org_organization_sub
+) O
+USA B-nam_loc_gpe_country
+- O
+poszerza O
+perspektywÄ™ O
+i O
+przyjmuje O
+wskaźnik O
+złożony O
+- O
+Broadband B-nam_oth_tech
+Performance I-nam_oth_tech
+Index I-nam_oth_tech
+( O
+BPI B-nam_oth_tech
+) O
+. O
+
+# sent_id = 523
+Sam O
+ogólny O
+zasięg O
+dostępu O
+szerokopasmowego O
+nie O
+jest O
+nawet O
+składnikiem O
+BPI B-nam_oth_tech
+. O
+
+# sent_id = 524
+Liczy O
+siÄ™ O
+dostęp O
+na O
+obszarach O
+wiejskich O
+i O
+to O
+tylko O
+przez O
+kabel O
+( O
+czyli O
+całe O
+darmowe O
+wifi B-nam_oth_tech
+na O
+razie O
+siÄ™ O
+nie O
+załapie O
+) O
+, O
+a O
+ze O
+starego O
+wskaźnika O
+zostały O
+elementy O
+jakościowe O
+- O
+prędkość O
+, O
+cena O
+i O
+korzystanie O
+z O
+usług O
+. O
+
+# sent_id = 525
+Co O
+ciekawe O
+- O
+bierze O
+siÄ™ O
+pod O
+uwagÄ™ O
+ceny O
+wyłącznie O
+w O
+zakresach O
+1 O
+- O
+2 O
+Mbit O
+oraz O
+2 O
+- O
+8 O
+Mbit O
+( O
+w O
+EU B-nam_org_organization_sub
+- I-nam_org_organization_sub
+15 I-nam_org_organization_sub
+niski O
+standard O
+to O
+1 O
+, O
+5 O
+Mbit O
+) O
+, O
+czyli O
+presja O
+na O
+operatorów O
+, O
+żeby O
+obniżyli O
+ceny O
+w O
+przedziale O
+poniżej O
+1 O
+Mbit O
+, O
+którą O
+swoim O
+pomysłem O
+ma O
+zamiar O
+wywierać O
+UKE B-nam_org_institution
+, O
+niewiele O
+pomoże O
+. O
+
+# sent_id = 526
+A O
+tymczasem O
+w O
+kategorii O
+" O
+cena O
+" O
+Polska B-nam_loc_gpe_country
+wypada O
+w O
+zasadzie O
+najgorzej O
+w O
+całej O
+UE B-nam_org_organization
+( O
+porównywalnie O
+źle O
+jedynie O
+SÅ‚owacja B-nam_loc_gpe_country
+) O
+. O
+
+# sent_id = 527
+Internet B-nam_oth_tech
+według O
+UKE B-nam_org_institution
+nie O
+pomoże O
+też O
+w O
+rozwoju O
+zaawansowanych O
+usług O
+. O
+
+# sent_id = 528
+500MB O
+pójdzie O
+na O
+samo O
+pobieranie O
+aktualizacji O
+systemu O
+operacyjnego O
+, O
+baz O
+danych O
+wirusów O
+( O
+w O
+każdym O
+razie O
+na O
+niektórych O
+systemach O
+) O
+, O
+sprawdzanie O
+prognozy O
+pogody O
+na O
+portalu O
+i O
+czytanie O
+poczty O
+przez O
+www B-nam_oth_tech
+. O
+
+# sent_id = 529
+Może O
+i O
+nie O
+będzie O
+darmowych O
+torrentów O
+, O
+ale O
+nie O
+będzie O
+też O
+ściągania O
+wolnego O
+oprogramowania O
+, O
+tekstów O
+naukowych O
+udostępnianych O
+w O
+sposób O
+otwarty O
+, O
+ani O
+kupowania O
+jakichkolwiek O
+cyfrowych O
+treści O
+. O
+
+# sent_id = 530
+UKE B-nam_org_institution
+ma O
+zamiar O
+zaoferować O
+więc O
+wykluczonym O
+internet B-nam_oth_tech
+( O
+inne O
+ministerstwo O
+da O
+im O
+laptopy O
+? O
+) O
+, O
+który O
+pozostawi O
+ich O
+w O
+tym O
+samym O
+miejscu O
+, O
+bo O
+granica O
+cyfrowego O
+wykluczenia O
+siÄ™ O
+przesunie O
+. O
+
+# sent_id = 531
+Tymczasem O
+wciąż O
+nowoczesnych O
+usług O
+w O
+polskim O
+internecie B-nam_oth_tech
+jest O
+mało O
+- O
+e O
+- O
+administracja O
+prawie O
+nie O
+istnieje O
+( O
+tu O
+wskaźniki O
+siÄ™ O
+pewnie O
+pogorszÄ… O
+, O
+gdy O
+wygasnÄ… O
+certyfikaty O
+rozdawane O
+przez O
+ZUS B-nam_org_institution
+, O
+a O
+mikroprzedsiębiorcy O
+zamiast O
+płacić O
+za O
+bezpieczny O
+podpis O
+elektroniczny O
+stanÄ… O
+w O
+kolejce O
+na O
+poczcie O
+) O
+, O
+uniwersytety O
+bardzo O
+słabo O
+radzÄ… O
+sobie O
+z O
+obecnością O
+w O
+sieci O
+, O
+a O
+telewizja O
+plÄ…cze O
+siÄ™ O
+w O
+DRMach O
+. O
+
+# sent_id = 545
+W O
+odstępie O
+kilku O
+dni O
+pojawiły O
+siÄ™ O
+dwie O
+zupełnie O
+sprzeczne O
+diagnozy O
+wpływu O
+kryzysu O
+na O
+wolne O
+oprogramowanie O
+i O
+wolnÄ… O
+kulturÄ™ O
+. O
+
+# sent_id = 546
+W O
+narożniku O
+czerwonym O
+, O
+po O
+stronie O
+popytu O
+, O
+szef O
+Red B-nam_org_company
+Hata I-nam_org_company
+Jim B-nam_liv_person
+Whitehurst I-nam_liv_person
+widzi O
+te O
+wszystkie O
+zamówienia O
+na O
+oprogramowanie O
+bez O
+opłat O
+licencyjnych O
+. O
+
+# sent_id = 547
+W O
+narożniku O
+czarnym O
+, O
+po O
+stronie O
+podaży O
+, O
+dyżurny O
+krytyk O
+Web B-nam_oth_tech
+2 I-nam_oth_tech
+. I-nam_oth_tech
+0 I-nam_oth_tech
+, O
+Andrew B-nam_liv_person
+Keen I-nam_liv_person
+, O
+z O
+wizjÄ… O
+bezrobotnych O
+pożerających O
+ostatnie O
+myszki O
+. O
+
+# sent_id = 548
+W O
+skrócie O
+: O
+popyt O
+na O
+" O
+darmowe O
+" O
+towary O
+siÄ™ O
+zwiększy O
+, O
+bo O
+trzeba O
+ciąć O
+koszty O
+( O
+tak O
+mówi O
+Whitehurst B-nam_liv_person
+) O
+, O
+a O
+podaż O
+pracowników O
+chętnych O
+do O
+poświęcania O
+swojego O
+czasu O
+siÄ™ O
+zmniejszy O
+, O
+bo O
+ludzie O
+poznajÄ… O
+wartość O
+swojej O
+pracy O
+( O
+tak O
+mówi O
+Keen B-nam_liv_person
+) O
+. O
+
+# sent_id = 549
+Czyli O
+Red B-nam_org_company
+Hat I-nam_org_company
+będzie O
+miał O
+więcej O
+zamówień O
+, O
+ale O
+nikt O
+mu O
+za O
+darmo O
+już O
+nie O
+pomoże O
+. O
+
+# sent_id = 550
+Keen B-nam_liv_person
+zaczyna O
+po O
+swojemu O
+od O
+błędnego O
+założenia O
+- O
+że O
+darmowa O
+praca O
+w O
+ramach O
+wolnego O
+oprogramowania O
+, O
+wolnej O
+kultury O
+i O
+Web B-nam_oth_tech
+2 I-nam_oth_tech
+. I-nam_oth_tech
+0 I-nam_oth_tech
+pozbawiona O
+jest O
+wartości O
+, O
+bo O
+nikt O
+nie O
+płaci O
+za O
+niÄ… O
+pieniędzmi O
+, O
+a O
+ludzie O
+pracujÄ… O
+bez O
+sensu O
+za O
+darmo O
+, O
+bo O
+w O
+czasach O
+dobrobytu O
+nisko O
+ceniÄ… O
+pracÄ™ O
+i O
+pieniÄ…dze O
+( O
+jest O
+to O
+jakieÅ› O
+alternatywne O
+wytłumaczenie O
+dla O
+recesji O
+- O
+ludziom O
+przewraca O
+siÄ™ O
+w O
+głowach O
+i O
+kiepsko O
+pracujÄ… O
+) O
+, O
+więc O
+sÄ… O
+skłonni O
+pisać O
+hasła O
+do O
+Wikipedii B-nam_pro_media_web
+. O
+
+# sent_id = 551
+I O
+można O
+było O
+by O
+tutaj O
+wesoło O
+popastwić O
+siÄ™ O
+nad O
+jednowymiarowym O
+punktem O
+widzenia O
+Keena B-nam_liv_person
+, O
+złośliwa O
+notka O
+na O
+poniedziałek O
+, O
+w O
+końcu O
+tylko O
+Bill B-nam_liv_person
+Gates I-nam_liv_person
+to O
+lepszy O
+temat O
+do O
+żartów O
+. O
+
+# sent_id = 552
+Jednak O
+im O
+dłużej O
+pisał O
+em O
+notkÄ™ O
+, O
+tym O
+bardziej O
+szła O
+ona O
+do O
+kosza O
+. O
+
+# sent_id = 553
+I O
+poszła O
+. O
+
+# sent_id = 554
+Nie O
+to O
+, O
+żeby O
+m O
+miał O
+teraz O
+siÄ™ O
+z O
+diagnozÄ… O
+Keena B-nam_liv_person
+zgodzić O
+, O
+produkcja O
+partnerska O
+nie O
+zniknie O
+, O
+ale O
+- O
+jeśli O
+rzeczywiście O
+dojdzie O
+do O
+głębokiej O
+recesji O
+- O
+coÅ› O
+musi O
+siÄ™ O
+zmienić O
+. O
+
+# sent_id = 555
+Produkcja O
+partnerska O
+opiera O
+siÄ™ O
+na O
+kilku O
+elementach O
+, O
+uproszczony O
+podział O
+może O
+być O
+taki O
+: O
+
+# sent_id = 556
+1 O
+. O
+
+# sent_id = 557
+Nadmiar O
+mocy O
+obliczeniowych O
+i O
+pojemności O
+sieci O
+w O
+wielu O
+krajach O
+. O
+
+# sent_id = 558
+Komputer O
+włączony O
+bez O
+przerwy O
+i O
+bez O
+przerwy O
+przesyłający O
+dane O
+w O
+internecie B-nam_oth_tech
+jest O
+normÄ… O
+: O
+przy O
+założeniu O
+, O
+że O
+nie O
+jest O
+to O
+obciążeniem O
+dla O
+budżetu O
+użytkownika O
+. O
+
+# sent_id = 559
+Niby O
+drobiazg O
+, O
+ale O
+projekty O
+, O
+które O
+najbardziej O
+korzystajÄ… O
+z O
+tego O
+nadmiaru O
+( O
+wszelkie O
+WielkieObliczenia O
+@ O
+home O
+albo O
+torrenty O
+) O
+polegajÄ… O
+głównie O
+na O
+ilości O
+i O
+każde O
+jej O
+zmniejszenie O
+będzie O
+bolesne O
+. O
+
+# sent_id = 560
+2 O
+. O
+
+# sent_id = 561
+Opłacalność O
+w O
+porównaniu O
+z O
+innymi O
+formami O
+organizacji O
+i O
+ochrony O
+praw O
+własności O
+( O
+rynek O
+, O
+firma O
+) O
+. O
+
+# sent_id = 562
+W O
+przypadku O
+gdy O
+Å‚atwo O
+znaleźć O
+dochody O
+z O
+innych O
+źródeł O
+, O
+budowanie O
+typowej O
+struktury O
+organizacyjnej O
+albo O
+poszukiwanie O
+ochrony O
+( O
+w O
+prawie O
+własności O
+intelektualnej O
+) O
+może O
+być O
+rzeczywiście O
+mało O
+opłacalne O
+w O
+porównaniu O
+z O
+produkcjÄ… O
+partnerskÄ… O
+. O
+
+# sent_id = 563
+Jednak O
+nietrudno O
+sobie O
+wyobrazić O
+, O
+że O
+dla O
+wielu O
+uczestników O
+produkcji O
+partnerskiej O
+ten O
+rachunek O
+wyjdzie O
+zupełnie O
+inaczej O
+w O
+warunkach O
+walki O
+o O
+przetrwanie O
+. O
+
+# sent_id = 564
+Być O
+może O
+jeszcze O
+za O
+wcześnie O
+obstawiać O
+, O
+kiedy O
+Bill B-nam_liv_person
+Gates I-nam_liv_person
+wróci O
+do O
+Microsoftu B-nam_org_company
+, O
+skoro O
+oficjalnie O
+ma O
+odejść O
+dopiero O
+w O
+lipcu O
+. O
+
+# sent_id = 565
+William B-nam_liv_person
+Hill I-nam_liv_person
+z O
+Londynu B-nam_loc_gpe_city
+takich O
+zakładów O
+jeszcze O
+nie O
+przyjmuje O
+. O
+
+# sent_id = 566
+Na O
+razie O
+Gates B-nam_liv_person
+zaliczył O
+ostatnie O
+wystÄ…pienie O
+na O
+CES B-nam_eve_human
+. O
+
+# sent_id = 567
+W O
+ostatnich O
+latach O
+wystÄ…pienia O
+Gatesa B-nam_liv_person
+pozostawały O
+w O
+cieniu O
+przemówień O
+Steve'a B-nam_liv_person
+Jobsa I-nam_liv_person
+. O
+
+# sent_id = 568
+Steve B-nam_liv_person
+wystÄ…pi O
+dopiero O
+za O
+tydzień O
+( O
+15 O
+stycznia O
+) O
+, O
+ale O
+nawet O
+jeżeli O
+ogłosi O
+, O
+że O
+odchodzi O
+, O
+nie O
+będzie O
+to O
+wielka O
+sensacja O
+. O
+
+# sent_id = 569
+Raz O
+już O
+to O
+zrobił O
+. O
+
+# sent_id = 570
+I O
+wrócił O
+. O
+
+# sent_id = 571
+Michael B-nam_liv_person
+Jordan I-nam_liv_person
+też O
+odszedł O
+i O
+wrócił O
+, O
+żeby O
+po O
+raz O
+kolejny O
+upokorzyć O
+konkurencjÄ™ O
+. O
+
+# sent_id = 572
+TrochÄ™ O
+siÄ™ O
+może O
+zapędził O
+em O
+. O
+
+# sent_id = 573
+Gates B-nam_liv_person
+jako O
+Jordan B-nam_liv_person
+oprogramowania O
+? O
+
+# sent_id = 574
+W O
+takim O
+razie O
+kim O
+był O
+by O
+Linus B-nam_liv_person
+Torvalds I-nam_liv_person
+? O
+
+# sent_id = 575
+Karlem B-nam_liv_person
+Malone I-nam_liv_person
+? O
+
+# sent_id = 576
+W O
+tegorocznym O
+wystÄ…pieniu O
+Bill B-nam_liv_person
+Gates I-nam_liv_person
+zaprezentował O
+film O
+ze O
+swojego O
+ostatniego O
+dnia O
+w O
+pracy O
+. O
+
+# sent_id = 577
+Naoglądał O
+siÄ™ O
+chyba O
+za O
+dużo O
+" O
+The B-nam_pro_title
+Office I-nam_pro_title
+" O
+( O
+warto O
+też O
+odwiedzić O
+stronÄ™ O
+firmy O
+) O
+. O
+
+# sent_id = 578
+Nie O
+dziwiÄ™ O
+siÄ™ O
+, O
+ale O
+nie O
+oto O
+chodzi O
+. O
+
+# sent_id = 579
+Bill B-nam_liv_person
+Gates I-nam_liv_person
+zaprezentował O
+typowy O
+film O
+z O
+youtube B-nam_pro_media_web
+, O
+typowy O
+przykład O
+kultury O
+remiksu O
+, O
+typowy O
+mashup O
+. O
+
+# sent_id = 580
+Były O
+wypowiedzi O
+znanych O
+gwiazd O
+, O
+zmontowane O
+fragmenty O
+filmów O
+i O
+trochÄ™ O
+wygłupów O
+własnych O
+. O
+
+# sent_id = 581
+Z O
+tÄ… O
+różnicą O
+, O
+że O
+Gates B-nam_liv_person
+nic O
+nie O
+remiksował O
+ani O
+nie O
+mashupował O
+. O
+
+# sent_id = 582
+Nie O
+spędził O
+kilku O
+godzin O
+szukajÄ…c O
+Baracka B-nam_liv_person
+Obamy I-nam_liv_person
+ani O
+Hillary B-nam_liv_person
+Clinton I-nam_liv_person
+mówiących O
+pasujÄ…ce O
+kwestie O
+. O
+
+# sent_id = 583
+( O
+SwojÄ… O
+drogÄ… O
+, O
+gdyby O
+to O
+był O
+prawdziwy O
+remiks O
+, O
+mógł O
+by O
+próbować O
+zgłosić O
+siÄ™ O
+też O
+do O
+Mitta B-nam_liv_person
+Romneya I-nam_liv_person
+czy O
+Freda B-nam_liv_person
+Thompsona I-nam_liv_person
+) O
+. O
+
+# sent_id = 584
+Nie O
+szukał O
+przypadkowych O
+wycinków O
+dla O
+pozostałych O
+postaci O
+. O
+
+# sent_id = 585
+Paradoksalnie O
+, O
+wiarygodności O
+nie O
+uzyskał O
+dużo O
+większej O
+niż O
+kiepsko O
+podłożony O
+głos O
+do O
+montowanego O
+na O
+siłę O
+ruchu O
+warg O
+, O
+ale O
+może O
+o O
+dramaturgiÄ™ O
+reklamy O
+proszku O
+do O
+prania O
+tu O
+chodziło O
+( O
+wyróżniającą O
+siÄ™ O
+rolÄ™ O
+odegrał O
+jedynie O
+Barack B-nam_liv_person
+Obama I-nam_liv_person
+) O
+. O
+
+# sent_id = 586
+Doskonale O
+podsumował O
+filozofiÄ™ O
+Microsoftu B-nam_org_company
+- O
+zrobimy O
+to O
+samo O
+, O
+co O
+inni O
+robili O
+przed O
+nami O
+, O
+tylko O
+za O
+większe O
+pieniÄ…dze O
+. O
+
+# sent_id = 587
+Można O
+wprawdzie O
+powiedzieć O
+, O
+że O
+zawsze O
+porównanie O
+dwóch O
+krajów O
+trafi O
+na O
+różne O
+problemy O
+, O
+na O
+nieporównywalne O
+elementy O
+. O
+
+# sent_id = 588
+Jednak O
+można O
+pewnie O
+wybrać O
+sobie O
+porównanie O
+lepiej O
+albo O
+gorzej O
+. O
+
+# sent_id = 589
+Irlandia B-nam_loc_gpe_country
+i O
+Finlandia B-nam_loc_gpe_country
+należą O
+do O
+kategorii O
+" O
+zdecydowanie O
+gorzej O
+" O
+. O
+
+# sent_id = 590
+Kilka O
+powodów O
+: O
+Liczba O
+ludności O
+jest O
+niewielka O
+, O
+inna O
+skala O
+wszelkich O
+typowych O
+problemów O
+państwa O
+dobrobytu O
+( O
+emerytury O
+, O
+służba O
+zdrowia O
+) O
+. O
+
+# sent_id = 591
+Nie O
+dość O
+, O
+że O
+ludzi O
+mało O
+, O
+to O
+jeszcze O
+kraje O
+leżą O
+na O
+uboczu O
+, O
+tranzyt O
+ich O
+nie O
+potrzebuje O
+, O
+więc O
+nie O
+trzeba O
+ponosić O
+takich O
+nakładów O
+na O
+infrastrukturÄ™ O
+( O
+drogi O
+, O
+koleje O
+) O
+. O
+
+# sent_id = 592
+Nie O
+było O
+za O
+wiele O
+starego O
+przemysłu O
+( O
+ciężkiego O
+, O
+lekkiego O
+) O
+, O
+więc O
+można O
+oszczędzić O
+na O
+poważnych O
+reformach O
+strukturalnych O
+i O
+skupić O
+siÄ™ O
+na O
+innych O
+polach O
+działania O
+. O
+
+# sent_id = 593
+Irlandia B-nam_loc_gpe_country
+miała O
+szczęście O
+- O
+należała O
+do O
+EWG B-nam_org_organization
+, O
+była O
+biednym O
+krajem O
+, O
+w O
+którym O
+wszyscy O
+mówią O
+w O
+języku O
+zbliżonym O
+do O
+angielskiego O
+, O
+a O
+akurat O
+na O
+fali O
+nowej O
+gospodarki O
+płynęły O
+inwestycje O
+technologiczne O
+( O
+Microsoft B-nam_org_company
+- O
+1985 O
+, O
+Intel B-nam_org_company
+- O
+1989 O
+, O
+Dell B-nam_org_company
+- O
+1990 O
+i O
+już O
+w O
+innych O
+czasach O
+Google B-nam_org_company
+- O
+2003 O
+) O
+. O
+
+# sent_id = 594
+Irlandia B-nam_loc_gpe_country
+szczęściu O
+wprawdzie O
+pomogła O
+, O
+obniżając O
+podatki O
+i O
+utrzymujÄ…c O
+wspólnym O
+wysiłkiem O
+niższe O
+wynagrodzenia O
+( O
+przynajmniej O
+na O
+poczÄ…tku O
+) O
+. O
+
+# sent_id = 595
+Może O
+jednak O
+te O
+inwestycje O
+stracić O
+równie O
+szybko O
+, O
+jak O
+je O
+zyskała O
+. O
+
+# sent_id = 596
+Pytanie O
+, O
+czy O
+jest O
+silna O
+na O
+tyle O
+, O
+żeby O
+poradzić O
+sobie O
+bez O
+nich O
+. O
+
+# sent_id = 597
+I O
+ten O
+proces O
+radzenia O
+sobie O
+bez O
+korporacji O
+, O
+które O
+wytwarzajÄ… O
+większość O
+B O
++ O
+R O
+, O
+sporÄ… O
+część O
+PKB B-nam_oth
+i O
+eksportu O
+, O
+będzie O
+chyba O
+dla O
+Polski B-nam_loc_gpe_country
+najciekawszy O
+. O
+
+# sent_id = 598
+Chociaż O
+na O
+pewno O
+nie O
+uda O
+siÄ™ O
+Polsce B-nam_loc_gpe_country
+zdobyć O
+aż O
+tylu O
+inwestycji O
+- O
+konkurencja O
+jest O
+dość O
+duża O
+- O
+w O
+samej O
+Unii B-nam_org_organization
+z O
+PolskÄ… B-nam_loc_gpe_country
+konkuruje O
+co O
+najmniej O
+8 O
+krajów O
+( O
+Czechy B-nam_loc_gpe_country
+, O
+SÅ‚owacja B-nam_loc_gpe_country
+, O
+Węgry B-nam_loc_gpe_country
+, O
+Bułgaria B-nam_loc_gpe_country
+, O
+Rumunia B-nam_loc_gpe_country
+, O
+Litwa B-nam_loc_gpe_country
+, O
+Łotwa B-nam_loc_gpe_country
+, O
+Estonia B-nam_loc_gpe_country
+) O
+. O
+
+# sent_id = 599
+Finlandia B-nam_loc_gpe_country
+startowała O
+już O
+w O
+latach O
+osiemdziesiÄ…tych O
+z O
+wysokiego O
+pułapu O
+( O
+większy O
+PKB B-nam_oth
+per O
+capita O
+niż O
+w O
+Irlandii B-nam_loc_gpe_country
+w O
+latach O
+dziewięćdziesiątych O
+) O
+, O
+więc O
+miała O
+kapitał O
+niezbędny O
+do O
+inwestycji O
+w O
+edukacjÄ™ O
+i O
+tworzenie O
+własnej O
+gospodarki O
+opartej O
+na O
+wiedzy O
+bez O
+pomocy O
+zagranicznych O
+inwestycji O
+. O
+
+# sent_id = 600
+Ani O
+Irlandia B-nam_loc_gpe_country
+( O
+w O
+1990 O
+) O
+, O
+ani O
+Polska B-nam_loc_gpe_country
+( O
+w O
+2000 O
+) O
+takiego O
+kapitału O
+nie O
+miały O
+. O
+
+# sent_id = 601
+Dlaczego O
+nie O
+porównuje O
+siÄ™ O
+Polski B-nam_loc_gpe_country
+z O
+ArabiÄ… B-nam_loc_gpe_country
+SaudyjskÄ… I-nam_loc_gpe_country
+albo O
+NorwegiÄ… B-nam_loc_gpe_country
+? O
+
+# sent_id = 602
+" O
+Oni O
+ropÄ™ O
+majÄ… O
+" O
+- O
+każdy O
+powie O
+i O
+utnie O
+dyskusjÄ™ O
+. O
+
+# sent_id = 603
+Duży O
+kapitał O
+to O
+równie O
+ważny O
+zasób O
+, O
+ale O
+może O
+trudniejszy O
+do O
+wyobrażenia O
+. O
+
+# sent_id = 604
+No O
+dobrze O
+, O
+ale O
+czy O
+to O
+znaczy O
+, O
+że O
+nie O
+warto O
+siÄ™ O
+starać O
+? O
+
+# sent_id = 605
+Warto O
+. O
+
+# sent_id = 606
+Finlandia B-nam_loc_gpe_country
+powinna O
+być O
+przykładem O
+choćby O
+na O
+to O
+, O
+że O
+lepiej O
+czasem O
+zaryzykować O
+rozwój O
+nowych O
+technologii O
+zamiast O
+ładować O
+fortuny O
+w O
+bezpieczne O
+przetrwalniki O
+( O
+Krauze B-nam_liv_person
+i O
+Kulczyk B-nam_liv_person
+- O
+ropa O
+, O
+Czarnecki B-nam_liv_person
+- O
+nieruchomości O
+) O
+. O
+
+# sent_id = 607
+Jednocześnie O
+jednak O
+, O
+jak O
+widzÄ™ O
+bezrefleksyjne O
+porównywanie O
+wskaźników O
+makro O
+Polski B-nam_loc_gpe_country
+z O
+FinlandiÄ… B-nam_loc_gpe_country
+i O
+IrlandiÄ… B-nam_loc_gpe_country
+, O
+nóż O
+mi O
+siÄ™ O
+w O
+kieszeni O
+otwiera O
+. O
+
+# sent_id = 608
+Bardzo O
+chciała O
+m O
+wziąć O
+udział O
+w O
+" O
+Cytrusowym B-nam_eve_human
+Tygodniu I-nam_eve_human
+" O
+, O
+ale O
+oczywiście O
+, O
+była O
+m O
+nadal O
+tak O
+osłabiona O
+że O
+ledwo O
+siÄ™ O
+mogła O
+m O
+ruszać O
+, O
+o O
+gotowaniu O
+, O
+pieczeniu O
+, O
+i O
+jeszcze O
+mniej O
+o O
+blogowaniu O
+nie O
+było O
+mowy O
+: O
+p O
+Ale O
+przynajmniej O
+jeden O
+przepis O
+na O
+cytrusy O
+podam O
+, O
+mimo O
+że O
+na O
+udział O
+w O
+akcji O
+za O
+późno O
+, O
+to O
+i O
+tak O
+" O
+poakcjowo O
+" O
+bez O
+udziału O
+też O
+można O
+. O
+
+# sent_id = 609
+Ta O
+lemoniada O
+zawsze O
+przypomina O
+mi O
+bajkÄ™ O
+Perraulta B-nam_liv_person
+, O
+nie O
+pamiętam O
+która O
+to O
+była O
+, O
+ale O
+występowały O
+tam O
+krasnoludki O
+które O
+mieszkały O
+pod O
+korzeniami O
+drzew O
+, O
+i O
+tam O
+właśnie O
+pichciły O
+i O
+gotowały O
+, O
+i O
+między O
+innymi O
+robiły O
+pysznÄ… O
+lemoniadÄ™ O
+. O
+
+# sent_id = 610
+I O
+o O
+tych O
+bÄ…belkach O
+w O
+lemoniadzie O
+ja O
+najlepiej O
+zapamiętała O
+m O
+z O
+całej O
+tej O
+bajki O
+: O
+o O
+) O
+( O
+zdjęcia O
+mam O
+tylko O
+gdy O
+mi O
+siÄ™ O
+udaje O
+ucelować O
+w O
+czas O
+i O
+słońce O
+, O
+bez O
+słońca O
+i O
+bez O
+czasu O
+zdjęcia O
+" O
+wychodzÄ… O
+" O
+takie O
+że O
+: O
+p O
+) O
+ZÅ‚ocista O
+lemoniada O
+Składniki O
+( O
+na O
+około O
+1 O
+litr O
+napoju O
+) O
+: O
+1 O
+litr O
+wody O
+mineralnej O
+albo O
+gazowanej O
+( O
+można O
+też O
+normalnÄ… O
+przegotowanÄ… O
+zimnÄ… O
+wodÄ™ O
+) O
+3 O
+- O
+4 O
+duże O
+łyżki O
+stołowe O
+syropu O
+z O
+agawy O
+( O
+albo O
+więcej O
+, O
+do O
+smaku O
+) O
+3 O
+- O
+4 O
+duże O
+łyżki O
+stołowe O
+świeżego O
+soku O
+z O
+cytryny O
+( O
+bez O
+miąższu O
+i O
+pestek O
+) O
+Wyciskamy O
+sok O
+cytrynowy O
+, O
+odcedzamy O
+miąższ O
+i O
+pestki O
+, O
+mieszamy O
+z O
+syropem O
+z O
+agawy O
+, O
+zalewamy O
+wodÄ… O
+mineralnÄ… O
+albo O
+gazowanÄ… O
+. O
+
+# sent_id = 611
+Mieszamy O
+, O
+sprawdzamy O
+czy O
+nam O
+odpowiada O
+, O
+w O
+razie O
+czego O
+dodajemy O
+więcej O
+syropu O
+lub O
+cytryny O
+. O
+
+# sent_id = 612
+Trzyma O
+siÄ™ O
+w O
+lodówce O
+przez O
+około O
+tydzień O
+. O
+
+# sent_id = 613
+Co O
+prawda O
+lemoniada O
+nie O
+brzmi O
+jak O
+przepis O
+na O
+zimÄ™ O
+, O
+ale O
+tak O
+naprawdÄ™ O
+to O
+u O
+nas O
+czasem O
+kaloryfery O
+w O
+zimie O
+sÄ… O
+tak O
+mocno O
+rozgrzane O
+, O
+że O
+jest O
+aż O
+za O
+ciepło O
+. O
+
+# sent_id = 614
+A O
+regulować O
+nie O
+ma O
+jak O
+, O
+najwyżej O
+całkowicie O
+wyłączyć O
+, O
+a O
+to O
+nawet O
+czasem O
+nie O
+pomaga O
+i O
+dalej O
+grzeje O
+: O
+p O
+Więc O
+często O
+zdarza O
+siÄ™ O
+że O
+marzÄ™ O
+o O
+chłodnych O
+napojach O
+, O
+a O
+szczególnie O
+lemoniadzie O
+" O
+jak O
+z O
+bajki O
+" O
+: O
+) O
+
+# sent_id = 615
+16 O
+lat O
+temu O
+Polska B-nam_loc_gpe_country
+wyszła O
+z O
+okresu O
+PRL-u B-nam_loc_gpe_country
+jako O
+państwo O
+odbudowane O
+, O
+ale O
+słabe O
+, O
+dręczone O
+rozłamami O
+społecznymi O
+, O
+które O
+mimo O
+usilnych O
+starań O
+socjalistycznego O
+reżimu O
+, O
+choć O
+nieco O
+przytuszowane O
+, O
+nigdy O
+nie O
+zostały O
+zażegnane O
+… O
+
+# sent_id = 616
+Epoka O
+przemian O
+gospodarczych O
+uderzyła O
+w O
+nasz O
+kraj O
+rozwiewajÄ…c O
+wszelkie O
+miraże O
+. O
+
+# sent_id = 617
+Tu O
+nie O
+było O
+już O
+miejsca O
+na O
+jedynie O
+słuszną O
+politykÄ™ O
+partii O
+, O
+tu O
+realia O
+wzięły O
+górę O
+nad O
+socjalistycznymi O
+mrzonkami O
+, O
+których O
+nigdy O
+zresztÄ… O
+nie O
+zrealizowano O
+. O
+
+# sent_id = 618
+Wszystko O
+to O
+sprawiło O
+, O
+że O
+w O
+Polsce B-nam_loc_gpe_country
+dały O
+o O
+sobie O
+znać O
+dotychczas O
+często O
+ignorowane O
+i O
+marginalizowane O
+zjawiska O
+– O
+bezrobocie O
+, O
+bezdomność O
+, O
+skrajna O
+bieda O
+i O
+ubóstwo O
+. O
+
+# sent_id = 632
+Autorzy O
+miesięcznika O
+. B-nam_pro_media_periodic
+psd I-nam_pro_media_periodic
+Photoshop I-nam_pro_media_periodic
+postanowili O
+uprościć O
+czytelnikom O
+drogÄ™ O
+do O
+nabycia O
+magazynu O
+. O
+
+# sent_id = 633
+Udostępnili O
+oni O
+za O
+darmo O
+magazyn O
+w O
+formacie O
+pdf B-nam_oth_tech
+jak O
+i O
+pliki O
+źródłowe O
+do O
+pobrania O
+w O
+Internecie B-nam_oth_tech
+. O
+
+# sent_id = 634
+Do O
+tej O
+pory O
+można O
+było O
+kupić O
+jedynie O
+wersjÄ™ O
+papierowÄ… O
+z O
+płytą O
+. O
+
+# sent_id = 635
+Warto O
+dodać O
+, O
+że O
+magazyn O
+jest O
+po O
+raz O
+ostatni O
+w O
+sklepach O
+i O
+salonikach O
+prasowych O
+- O
+od O
+czerwca O
+dostępna O
+już O
+będzie O
+jedynie O
+wersja O
+elektroniczna O
+. O
+
+# sent_id = 636
+W O
+niedalekiej O
+przyszłości O
+dostępne O
+będą O
+także O
+archiwa O
+. O
+
+# sent_id = 637
+Czy O
+cały O
+czas O
+za O
+darmo O
+? O
+
+# sent_id = 638
+Tego O
+nie O
+udało O
+siÄ™ O
+ustalić O
+. O
+
+# sent_id = 639
+EmanujÄ…ca O
+pozytywnyi O
+emocjami O
+, O
+ciepłem O
+i O
+optymizmem O
+reklama O
+zachęcająca O
+do O
+odwiedzania O
+Islandii B-nam_loc_gpe_country
+przydała O
+by O
+siÄ™ O
+Polsce B-nam_loc_gpe_country
+. O
+. O
+. O
+
+# sent_id = 640
+Za O
+" O
+x O
+" O
+lat O
+może O
+dogonimy O
+PR-owców O
+z O
+wyspy O
+
+# sent_id = 641
+W O
+swoich O
+recenzjach O
+muzycznych O
+Wojciech B-nam_liv_person
+Mann I-nam_liv_person
+raz O
+po O
+raz O
+opisuje O
+niszowych O
+artystów O
+okołobluesowych O
+ze O
+Stanów B-nam_loc_gpe_city
+, O
+piszÄ…c O
+zawsze O
+coÅ› O
+w O
+stylu O
+" O
+skÄ…d O
+oni O
+siÄ™ O
+tam O
+biorÄ… O
+" O
+. O
+
+# sent_id = 642
+CiÄ…gle O
+nowi O
+i O
+ciÄ…gle O
+dobrzy O
+. O
+
+# sent_id = 643
+Nic O
+tylko O
+powtórzyć O
+za O
+Wojciechem B-nam_liv_person
+: O
+skÄ…d O
+oni O
+siÄ™ O
+tam O
+biorÄ… O
+? O
+! O
+
+# sent_id = 644
+Chuck B-nam_liv_person
+Palahniuk I-nam_liv_person
+nie O
+jest O
+debiutantem O
+, O
+ale O
+skÄ…d O
+oni O
+. O
+. O
+. O
+
+# sent_id = 645
+Znowu O
+cholernie O
+dobra O
+proza O
+zza O
+wielkiej O
+wody O
+. O
+
+# sent_id = 646
+Postindustrialna O
+ballada O
+pełna O
+absurdalnych O
+, O
+arcydziwacznych O
+, O
+choć O
+przecież O
+rzeczywistych O
+, O
+rekwizytów O
+. O
+
+# sent_id = 647
+Melancholia O
+i O
+niespełnienie O
+. O
+
+# sent_id = 648
+Smutek O
+Hoppera B-nam_liv_person
+, O
+inspiracja O
+dla O
+Cunninghama B-nam_liv_person
+. O
+
+# sent_id = 649
+Historia O
+wychowanka O
+radykalnej O
+sekty O
+, O
+który O
+żyje O
+w O
+odosobnieniu O
+, O
+w O
+kolonii O
+współwyznawców O
+. O
+
+# sent_id = 650
+Gdy O
+kończy O
+szkołę O
+, O
+jako O
+niepierworodny O
+syn O
+zostaje O
+wysłany O
+w O
+świat O
+aby O
+zarabiał O
+na O
+sektÄ™ O
+. O
+
+# sent_id = 651
+Pozostali O
+w O
+domach O
+współwyznawcy O
+po O
+jakimÅ› O
+czasie O
+, O
+zgodnie O
+z O
+najwyższym O
+obowiÄ…zkiem O
+swojej O
+religii O
+, O
+popełniają O
+masowe O
+samobójstwo O
+. O
+
+# sent_id = 652
+Jest O
+to O
+automatyczny O
+nakaz O
+dla O
+wszystkich O
+, O
+którzy O
+pracujÄ… O
+poza O
+koloniÄ… O
+, O
+aby O
+czym O
+prędzej O
+dołączyli O
+do O
+nich O
+w O
+zaświatach O
+. O
+
+# sent_id = 653
+Od O
+poczÄ…tku O
+wiadomo O
+, O
+jak O
+siÄ™ O
+skończy O
+ta O
+historia O
+o O
+kimÅ› O
+, O
+kto O
+przez O
+lata O
+opiekował O
+siÄ™ O
+domem O
+i O
+ogrodem O
+obcych O
+ludzi O
+. O
+
+# sent_id = 654
+W O
+ogrodzie O
+sadzał O
+sztuczne O
+kwiaty O
+ukradzione O
+z O
+krypty O
+, O
+spryskiwał O
+je O
+farbÄ… O
+i O
+perfumami O
+. O
+
+# sent_id = 655
+Nikt O
+siÄ™ O
+nigdy O
+nie O
+zorientował O
+. O
+
+# sent_id = 656
+Człowiek O
+ten O
+najbardziej O
+na O
+świecie O
+był O
+przywiÄ…zany O
+do O
+swojej O
+złotej O
+rybki O
+, O
+która O
+nazywała O
+siÄ™ O
+numer O
+sześćset O
+czterdzieści O
+jeden O
+. O
+
+# sent_id = 657
+Skończył O
+jako O
+pasażer O
+lotu O
+dwa B-nam_eve_human
+tysiÄ…ce I-nam_eve_human
+trzydzieści I-nam_eve_human
+dziewięć I-nam_eve_human
+opowiadajÄ…cy O
+czarnej O
+skrzynce O
+historiÄ™ O
+swojego O
+życia O
+. O
+
+# sent_id = 658
+Yochai B-nam_liv_person
+Benkler I-nam_liv_person
+stworzył O
+koncepcjÄ™ O
+commons O
+- O
+based O
+peer O
+production O
+. O
+
+# sent_id = 659
+KorzystajÄ…c O
+ze O
+sposobu O
+rozumowania O
+Ronalda B-nam_liv_person
+Coase'a I-nam_liv_person
+twierdzi O
+on O
+, O
+że O
+w O
+określonych O
+okolicznościach O
+( O
+spowodowanych O
+przez O
+koszty O
+transakcji O
+i O
+prawa O
+własności O
+) O
+powstaje O
+trzecia O
+droga O
+w O
+organizacji O
+produkcja O
+, O
+inna O
+niż O
+rynek O
+i O
+przedsiębiorstwo O
+. O
+
+# sent_id = 660
+Innymi O
+słowy O
+, O
+jeśli O
+opłaca O
+siÄ™ O
+napisać O
+WikipediÄ™ B-nam_pro_media_web
+albo O
+Linuksa B-nam_pro_software
+, O
+bo O
+koszty O
+współpracy O
+sÄ… O
+odpowiednio O
+niskie O
+, O
+a O
+nie O
+sÄ… O
+nam O
+potrzebne O
+prawa O
+własności O
+w O
+tradycyjnym O
+rozumieniu O
+, O
+wkracza O
+peer O
+production O
+, O
+która O
+jako O
+metoda O
+produkcji O
+jest O
+do O
+realizacji O
+tych O
+celów O
+bardziej O
+opłacalna O
+i O
+efektywna O
+. O
+
+# sent_id = 661
+Mam O
+jednak O
+czasem O
+wrażenie O
+, O
+że O
+mówiąc O
+o O
+tym O
+sposobie O
+produkcji O
+, O
+opacznie O
+pojmuje O
+siÄ™ O
+jej O
+oddzielenie O
+od O
+rynku O
+. O
+
+# sent_id = 662
+Działania O
+wewnÄ…trz O
+przedsiębiorstwa O
+( O
+które O
+oddzielone O
+jest O
+od O
+rynku O
+według O
+tej O
+samej O
+metody O
+) O
+sÄ… O
+tak O
+samo O
+pozarynkowe O
+, O
+jak O
+działania O
+w O
+ramach O
+peer O
+production O
+. O
+
+# sent_id = 663
+Jednak O
+na O
+pewnym O
+poziomie O
+te O
+struktury O
+organizacyjne O
+w O
+końcu O
+zastosujÄ… O
+rynkowÄ… O
+metodÄ™ O
+zawierania O
+transakcji O
+( O
+trudno O
+mi O
+sobie O
+wyobrazić O
+, O
+żeby O
+przedsiębiorstwa O
+mogły O
+dzwonić O
+do O
+przypadkowych O
+ludzi O
+i O
+żądać O
+stawienia O
+siÄ™ O
+do O
+pracy O
+) O
+i O
+w O
+ten O
+sposób O
+jednak O
+nie O
+funkcjonujÄ… O
+poza O
+rynkiem O
+. O
+
+# sent_id = 664
+Tymczasem O
+" O
+pozarynkowe O
+" O
+oznacza O
+często O
+" O
+funkcjonujÄ…ce O
+poza O
+jakÄ…kolwiek O
+wymianÄ… O
+rynkowÄ… O
+" O
+, O
+chociaż O
+według O
+Benklera B-nam_liv_person
+powinno O
+oznaczać O
+" O
+zorganizowane O
+na O
+podstawach O
+innych O
+niż O
+mechanizm O
+cenowy O
+" O
+. O
+
+# sent_id = 665
+Peer O
+production O
+Benklera B-nam_liv_person
+to O
+sposób O
+wewnętrznej O
+organizacji O
+, O
+w O
+której O
+o O
+decyzjach O
+i O
+transakcjach O
+nie O
+decydujÄ… O
+ceny O
+. O
+
+# sent_id = 666
+Commons O
+based O
+odnosi O
+siÄ™ O
+do O
+kosztu O
+ustanowienia O
+praw O
+własności O
+i O
+sugeruje O
+, O
+że O
+możliwe O
+jest O
+funkcjonowanie O
+systemów O
+wymiany O
+bez O
+" O
+własności O
+" O
+. O
+
+# sent_id = 667
+Jednak O
+organizacja O
+produkujÄ…ca O
+według O
+reguł O
+commons O
+- O
+based O
+peer O
+production O
+działa O
+na O
+rynku O
+, O
+podobnie O
+jak O
+przedsiębiorstwa O
+. O
+
+# sent_id = 668
+Stosowanie O
+nazwy O
+" O
+pozarynkowa O
+" O
+mogło O
+by O
+sugerować O
+, O
+że O
+nie O
+ma O
+styczności O
+między O
+tworzeniem O
+Linuksa B-nam_pro_software
+i O
+rynkiem O
+, O
+co O
+jest O
+oczywistym O
+nieporozumieniem O
+. O
+
+# sent_id = 669
+Zdarza O
+siÄ™ O
+jednak O
+, O
+że O
+peer O
+production O
+jest O
+traktowane O
+jako O
+zjawisko O
+przeciwstawne O
+rynkowi O
+: O
+jest O
+zły O
+rynek O
+i O
+dobre O
+commons O
+. O
+
+# sent_id = 670
+StÄ…d O
+też O
+częste O
+przyszywanie O
+marksistowskich O
+Å‚atek O
+, O
+nawet O
+bez O
+konieczności O
+wskazywania O
+Stallmana B-nam_liv_person
+i O
+Moglena B-nam_liv_person
+jako O
+źródła O
+. O
+
+# sent_id = 671
+Próba O
+zastÄ…pienia O
+wszystkich O
+sposobów O
+produkcji O
+peer O
+production O
+jest O
+równie O
+absurdalna O
+jak O
+zastÄ…pienie O
+wszystkiego O
+przedsiębiorstwem O
+. O
+
+# sent_id = 672
+Dystansowanie O
+siÄ™ O
+od O
+problemów O
+z O
+funkcjonowaniem O
+rynku O
+to O
+jedno O
+, O
+a O
+wyłączenie O
+siÄ™ O
+z O
+niego O
+to O
+drugie O
+. O
+
+# sent_id = 690
+Małysz B-nam_liv_person
+musi O
+siÄ™ O
+teraz O
+postarać O
+o O
+prawdziwy O
+cud O
+, O
+bo O
+Puchar B-nam_eve_human_sport
+Åšwiata I-nam_eve_human_sport
+to O
+zdecydowanie O
+za O
+mało O
+, O
+żeby O
+przebić O
+wyczyn O
+Roberta B-nam_liv_person
+Kubicy I-nam_liv_person
+. O
+
+# sent_id = 691
+Prędkość O
+na O
+progu O
+miał O
+Małysz B-nam_liv_person
+zawsze O
+niewielkÄ… O
+, O
+a O
+tu O
+jeszcze O
+taki O
+rywal O
+, O
+który O
+wybija O
+siÄ™ O
+majÄ…c O
+na O
+liczniku O
+250 O
+kilometrów O
+na O
+godzinÄ™ O
+. O
+
+# sent_id = 692
+Noty O
+za O
+styl O
+całkiem O
+niezłe O
+, O
+Paulina B-nam_liv_person
+Ligocka I-nam_liv_person
+by O
+siÄ™ O
+między O
+dwiema O
+bandami O
+lepiej O
+nie O
+zachowała O
+. O
+
+# sent_id = 693
+Sokół B-nam_liv_person
+z O
+Krakowa B-nam_loc_gpe_city
+wypadł O
+na O
+ekranie O
+lepiej O
+nawet O
+od O
+Jana B-nam_liv_person
+Mazocha I-nam_liv_person
+i O
+wreszcie O
+przyćmił O
+Lewisa B-nam_liv_person
+Hamiltona I-nam_liv_person
+, O
+którego O
+bez O
+wÄ…tpienia O
+przypadkowe O
+zwycięstwo O
+przeszło O
+niemal O
+bez O
+echa O
+. O
+
+# sent_id = 694
+Niezniszczalny O
+Krakus B-nam_org_nation
+stał O
+siÄ™ O
+prawdziwym O
+bohaterem O
+Formuły B-nam_eve_human_sport
+1 I-nam_eve_human_sport
+, O
+w O
+której O
+robi O
+siÄ™ O
+wszystko O
+, O
+żeby O
+wypadków O
+było O
+jak O
+najmniej O
+, O
+byle O
+jakieÅ› O
+były O
+. O
diff --git a/pyproject.toml b/pyproject.toml
index da51df8..c17c0df 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -3,7 +3,7 @@ requires = ["setuptools"]
 
 [project]
 name = "combo"
-version = "3.2.0"
+version = "3.2.1"
 authors = [
     {name = "Maja Jablonska", email = "maja.jablonska@ipipan.waw.pl"}
 ]
diff --git a/requirements.txt b/requirements.txt
index 10849b3..bd8c176 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -19,5 +19,7 @@ pytest~=7.2.2
 transformers~=4.27.3
 typing_extensions~=4.5.0
 sacremoses~=0.0.53
+seqeval~=1.2.2
 spacy~=3.7.2
-urllib3~=1.26.6
\ No newline at end of file
+urllib3~=1.26.6
+wandb~=0.15.0
\ No newline at end of file
-- 
GitLab