<jupyter_start><jupyter_text>lab2 - Lemmatization and full text search (FTS)<jupyter_code>from elasticsearch import Elasticsearch
from elasticsearch.client import IndicesClient
from pathlib import Path
from pprint import pprint<jupyter_output><empty_output><jupyter_text>Tasks1. Install ElasticSearch (ES).2. Install an ES plugin for Polish https://github.com/allegro/elasticsearch-analysis-morfologik<jupyter_code># !cd ../elasticsearch && docker-compose up
es = Elasticsearch()<jupyter_output><empty_output><jupyter_text>3. Define an ES analyzer for Polish texts containing:   1. standard tokenizer   1. synonym filter with the following definitions:      1. kpk - kodeks postępowania karnego      1. kpc - kodeks postępowania cywilnego      1. kk - kodeks karny      1. kc - kodeks cywilny   1. Morfologik-based lemmatizer   1. lowercase filter<jupyter_code>es.indices.create(
    index="przewie",
    body={
        "settings": {
            "analysis": {
              "analyzer": "morfologik",
              "filter": {
                  "kodeks_synonym" : {
                    "type" : "synonym",
                        "synonyms" : [
                            "kpk => kodeks postępowania karnego",
                            "kpc => kodeks postępowania cywilnego",
                            "kk => kodeks karny",
                            "kc => kodeks cywilny",
                        ]
                    }    
                  },
            "tokenizer": "standard",
            }
        },
        "mappings": {
            "act": {
                "properties": {
                    "text": {
                        "type": "text",
                        "analyzer": "morfologik"
                    }
                }
            }
        }
    }
)


def analyze(text):
    return 
es.indices.analyze(
        "przewie",
        {
            "tokenizer": "standard",
             "filter": ["kodeks_synonym", "lowercase", "morfologik_stem"],
            "text": "będę analizować ustawy o kc"
        }
    )<jupyter_output><empty_output><jupyter_text>4. Define an ES index for storing the contents of the legislative acts. 5. Load the data to the ES index.<jupyter_code>for i, f in enumerate([f for f in Path("../data").iterdir() if f.is_file()]):
    text = f.open().read()
    es.create(
        index="przewie",
        doc_type="act",
        id=f,
        body={"text": text}
    )<jupyter_output><empty_output><jupyter_text>1. Determine the number of legislative acts containing the word **ustawa** (in any form).<jupyter_code>es.search(
    index="przewie",
    doc_type="act",
    body={
        "query": {
            "match": {
                "text": {
                    "query": "ustawa"
                }
            }
        }
    }
)["hits"]["total"]<jupyter_output><empty_output><jupyter_text>2. Determine the number of legislative acts containing the words **kodeks postępowania cywilnego** in the specified order, but in an any inflection form.<jupyter_code>es.search(
    index="przewie",
    doc_type="act",
    body={
        "query": {
            "match_phrase": {
                "text": {
                    "query": "kodeks postępowania cywilnego"
                }
            }
        }
    }
)["hits"]["total"]<jupyter_output><empty_output><jupyter_text>3. Determine the number of legislative acts containing the words **wchodzi w życie**    (in any form) allowing for up to 2 additional words in the searched phrase.<jupyter_code>es.search(
    index="przewie",
    doc_type="act",
    body={
        "query": {
            "match_phrase": {
                "text": {
                    "query": "wchodzi w życie",
                    "slop": 2
                }
            }
        }
    }
)["hits"]["total"]<jupyter_output><empty_output><jupyter_text>4. Determine the 10 documents that are the most relevant for the phrase **konstytucja**.<jupyter_code>best_hits = sorted(
    es.search(
        index="przewie",
        doc_type="act",
        body={
            "query": {
                "match": {
                    "text": {
                        "query": "konstytucja",
                    }
                }
            },
            "highlight": {
                "fields": {
                    "text": {}
                },
                "number_of_fragments": 3
            }
        }
    )["hits"]["hits"],
    key= lambda h: -h["_score"]
)[:10]

[h["_id"] for h in best_hits]<jupyter_output><empty_output><jupyter_text>5. Print the excerpts containing the word **konstytucja** (up to three excerpts per document)    from the previous task.<jupyter_code>pprint([h["highlight"] for h in best_hits])<jupyter_output>[{'text': ['umowy międzynarodowej i nie wypełnia przesłanek określonych w art. '
           '89\n'
           '     ust. 1 lub art. 90 <em>Konstytucji</em>',
           'międzynarodowej lub załącznika nie\n'
           '     wypełnia przesłanek określonych w art. 89 ust. 1 lub art. 90 '
           '<em>Konstytucji</em>',
           'co do zasadności wyboru\n'
           '  trybu ratyfikacji umowy międzynarodowej, o którym mowa w art. 89 '
           'ust. 2\n'
           '  <em>Konstytucji</em>']},
 {'text': ['Jeżeli Trybunał Konstytucyjny wyda orzeczenie o sprzeczności celów '
           'partii \n'
           '   politycznej z <em>Konstytucją</em>',
           'Jeżeli Trybunał Konstytucyjny wyda orzeczenie o sprzeczności z '
           '<em>Konstytucją</em>\n'
           '   celów lub działalności',
           'Ciężar udowodnienia niezgodności z <em>Konstytucją</em> spoczywa\n'
           '                na wnioskodawcy, który w tym']},
 {'text': ['Za naruszenie <em>Konstytucji</em>[...]
{'fraction_non_alphanumeric': 0.12027310924369748, 'fraction_numerical': 0.006827731092436975, 'mean_word_length': 1.8073710073710074, 'pattern_counts': {'":': 36, '<': 50, '<?xml version=': 0, '>': 54, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '602853', 'license': 'MIT', 'n_tokens_mistral': 1897, 'n_tokens_neox': 1859, 'n_words': 416, 'path': 'lab2/lab2.ipynb', 'repo_name': 'mprzewie/nlp_course', 'size': '5712'}