racai-ai / TEPROLIN

This is the TEPROLIN Romanian text processing platform, developed in the ReTeRom project.
http://www.racai.ro/p/reterom
MIT License
4 stars 0 forks source link

Help for script adaptation! #1

Open dix83 opened 1 week ago

dix83 commented 1 week ago
import requests
import json

# URL-ul serverului Teprolin
url = "http://127.0.0.1:5000/process"

# Textul pe care dorim să îl procesăm
text = "Ion și-a cumpărat o mașină de tuns iarba de_la Kaufland."

# Operațiile necesare
operations = [
    "tokenization",
    "pos-tagging",
    "dependency-parsing",
    "chunking",
    "named-entity-recognition",
    "sentence-splitting"  

]

# Construim payload-ul pentru cererea POST
payload = {
    "text": text,
    "exec": ",".join(operations)
}

# Facem cererea POST
response = requests.post(url, data=payload)

# Verificăm dacă cererea a fost procesată cu succes
if response.status_code == 200:
    # Parsăm rezultatul JSON
    data = response.json()
    tokens = data["teprolin-result"]["tokenized"][0]  # Preluăm lista de tokeni din prima propoziție

    # Creăm un dicționar pentru a mapa chunk-urile la cuvintele lor, în ordinea corectă
    chunk_to_words = {}

    # Populăm dicționarul chunk_to_words cu cuvinte pentru fiecare chunk, în ordinea corectă
    for token in tokens:
        chunk_code = token["_chunk"]
        word = token["_wordform"]

        # Dacă chunk_code nu este gol, adăugăm cuvântul în lista corespunzătoare în ordinea apariției
        if chunk_code:
            sub_chunks = chunk_code.split(',')
            for sub_chunk in sub_chunks:
                if sub_chunk not in chunk_to_words:
                    chunk_to_words[sub_chunk] = []
                if word not in chunk_to_words[sub_chunk]:  # Evităm duplicările
                    chunk_to_words[sub_chunk].append(word)

    # Construim structura de tokeni în format JSON, cu chunk-urile completate corect
    tokens_formatted = []
    for token in tokens:
        # Obținem codul chunk-ului
        chunk_code = token["_chunk"]
        # Construim `chunk_det` doar dacă există un chunk_code
        if chunk_code:
            # Folosim un set temporar pentru a evita duplicatele
            seen_words = set()
            words_associated = " ".join(
                word for sub_chunk in chunk_code.split(",") if sub_chunk in chunk_to_words
                for word in chunk_to_words[sub_chunk] if word not in seen_words and not seen_words.add(word)
            )
        else:
            words_associated = ""

        # Structura finală a tokenului
        token_formatted = {
            "_bner": token.get("_bner", ""),
            "_chunk": chunk_code,  # Păstrăm codurile originale ale chunk-urilor
            "chunk_det": words_associated,  # Afișăm lista de cuvinte asociate cu chunk-ul
            "_ctg": token.get("_ctg", ""),
            "_deprel": token.get("_deprel", ""),
            "_expand": token.get("_expand", ""),
            "_head": token.get("_head", ""),
            "_id": token.get("_id", ""),
            "_lemma": token.get("_lemma", ""),
            "_msd": token.get("_msd", ""),
            "_ner": token.get("_ner", ""),
            "_phon": token.get("_phon", ""),
            "_syll": token.get("_syll", ""),
            "_wordform": token.get("_wordform", ""),
            "_upos": token.get("_upos", "")

        }
        tokens_formatted.append(token_formatted)

    # Afișăm rezultatul final în format JSON
    print("Rezultatul procesării textului cu 'chunk' și 'chunk_det' detaliat:")
    print(json.dumps(tokens_formatted, indent=4, ensure_ascii=False))
else:
    print("Eroare la cerere:", response.status_code)
    print(response.text)

The result is: { "_bner": "", "_chunk": "Np#1", "chunk_det": "Ion", "_ctg": "NP", "_deprel": "nsubj", "_expand": "", "_head": 4, "_id": 1, "_lemma": "Ion", "_msd": "Np", "_ner": "PER", "_ner_2": "", "_phon": "", "_syll": "", "_wordform": "Ion", "_upos": "" }, { "_bner": "", "_chunk": "Vp#1", "chunk_det": "și- a cumpărat", "_ctg": "PXD", "_deprel": "expl:poss", "_expand": "", "_head": 4, "_id": 2, "_lemma": "sine", "_msd": "Px3--d--y-----w", "_ner": "", "_ner_2": "", "_phon": "", "_syll": "", "_wordform": "și-", "_upos": "" },

The upos form is always empty, could you suggest the reason?

radu-ion commented 1 week ago

Hello, TEPROLIN does not output the "_upos" field. POS tagging fields are "_ctg" (you can use this one instead of _upos, although it does not contain the UPOS tags for Romanian) and "_msd" which is the detailed version of "_ctg" with many more morphological attributes.

To see how "_ctg" and "_msd" map to UPOS, you can check out the Romanian UD corpus here: https://github.com/UniversalDependencies/UD_Romanian-RRT, file ro_rrt-ud-train.conllu.

If you use the UDPipe NLP app of TEPROLIN (TTL is the default one), I think the '_ctg' field contains the actual UPOS of the token. But you have to install UDPipe first, as instructed in the README.