File size: 6,856 Bytes
d8bc695
2c1198d
d8bc695
 
58c0ade
d8bc695
62d3b1e
8579f09
 
 
 
 
 
d8bc695
8579f09
 
d8bc695
8579f09
1574088
8579f09
d8bc695
8579f09
 
1574088
d8bc695
58c0ade
579a34e
58c0ade
 
8579f09
58c0ade
d8bc695
1be00bd
8579f09
 
32f8762
 
8579f09
 
32f8762
 
8579f09
 
32f8762
 
8579f09
 
32f8762
 
8579f09
 
 
 
 
2c1198d
8579f09
1574088
2c1198d
8579f09
 
 
d8bc695
f3452ba
f2bf1fd
 
 
 
 
 
 
f3452ba
f2bf1fd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58c0ade
8579f09
 
 
 
 
 
1574088
0bf758f
b236025
 
f3452ba
b236025
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f3452ba
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
import streamlit as st
from transformers import pipeline, AutoTokenizer, AutoModelForTokenClassification, AutoModelForSequenceClassification, AutoModelForCausalLM
import pandas as pd

# Uygulama sayfa ayarları
st.set_page_config(layout="wide")

# Örnek metin listesi
example_list = [
    "Mustafa Kemal Atatürk 1919 yılında Samsun'a çıktı.",
    "Bugün hava çok güzel ve enerjik hissediyorum.",
    "Yapay zeka ve makine öğrenimi hakkında birçok gelişme var."
]

# Uygulama başlığı
st.title("NLP Toolkit")

# Görev seçimi
task_list = ['Metin Sınıflandırma', 'Metin Analizi', 'Duygu Analizi', 'Metin Oluşturma', 'Varlık Tanıma']
task = st.sidebar.selectbox("Görev Seç", task_list)

# Metin giriş yöntemi
st.subheader("Metin Giriş Yöntemi Seç")
input_method = st.radio("", ('Örneklerden Seç', 'Metin Yaz veya Yapıştır'))

# Metin girişine göre seçim
if input_method == 'Örneklerden Seç':
    selected_text = st.selectbox('Metin Seç', example_list)
    input_text = st.text_area("Seçilen Metin", selected_text, height=128)
elif input_method == "Metin Yaz veya Yapıştır":
    input_text = st.text_area('Metin Yaz veya Yapıştır', '', height=128)

@st.cache_resource
def load_pipeline(model_name, task_type):
    if task_type == "Metin Sınıflandırma":
        model = AutoModelForSequenceClassification.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")
        tokenizer = AutoTokenizer.from_pretrained("nlptown/bert-base-multilingual-uncased-sentiment")
        return pipeline('text-classification', model=model, tokenizer=tokenizer)
    elif task_type == "Metin Analizi":
        model = AutoModelForTokenClassification.from_pretrained("dbmdz/bert-base-turkish-cased")
        tokenizer = AutoTokenizer.from_pretrained("dbmdz/bert-base-turkish-cased")
        return pipeline('ner', model=model, tokenizer=tokenizer)
    elif task_type == "Duygu Analizi":
        model = AutoModelForSequenceClassification.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
        tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base-sentiment")
        return pipeline('sentiment-analysis', model=model, tokenizer=tokenizer)
    elif task_type == "Metin Oluşturma":
        model = AutoModelForCausalLM.from_pretrained("gpt2")
        tokenizer = AutoTokenizer.from_pretrained("gpt2")
        return pipeline('text-generation', model=model, tokenizer=tokenizer)

# Görev ve modele göre pipeline yükleme
model_dict = {
    "Metin Sınıflandırma": "nlptown/bert-base-multilingual-uncased-sentiment",
    "Metin Analizi": "dbmdz/bert-base-turkish-cased",
    "Duygu Analizi": "cardiffnlp/twitter-roberta-base-sentiment",
    "Metin Oluşturma": "gpt2",
    "Varlık Tanıma": "dbmdz/bert-base-turkish-cased"
}

pipeline_model = load_pipeline(model_dict[task], task)

def process_entities(entities, text):
    """
    Varlıkları birleştirip anlamlı bir şekilde düzenler.
    """
    processed_entities = []
    current_entity = None
    
    for entity in entities:
        if entity['entity'].startswith('I-'):
            if current_entity and current_entity['label'] == entity['entity']:
                current_entity['word'] += entity['word'].replace('##', '')
                current_entity['end'] = entity['end']
                current_entity['score'] = max(current_entity['score'], entity['score'])
            else:
                if current_entity:
                    processed_entities.append(current_entity)
                current_entity = {
                    'label': entity['entity'],
                    'word': entity['word'].replace('##', ''),
                    'start': entity['start'],
                    'end': entity['end'],
                    'score': entity['score']
                }
        else:
            if current_entity:
                processed_entities.append(current_entity)
                current_entity = None
    if current_entity:
        processed_entities.append(current_entity)
    
    return processed_entities

if st.button("Çalıştır") and input_text:
    if task in ["Metin Sınıflandırma", "Duygu Analizi"]:
        output = pipeline_model(input_text)
        df = pd.DataFrame(output)
        st.subheader(f"{task} Sonuçları")
        st.dataframe(df)
    elif task == "Metin Analizi":
        output = pipeline_model(input_text)
        
        # Çıktıyı gözlemleme
        st.write(output)

        # Varlıkları işlemek için uygun formatı kontrol edin
        if len(output) > 0 and 'entity' in output[0]:
            # Process entities
            processed_entities = []
            for entity in output:
                word = entity['word']
                label = entity['entity']
                score = entity['score']
                start = entity['start']
                end = entity['end']
                processed_entities.append({
                    'word': word,
                    'label': label,
                    'score': score,
                    'start': start,
                    'end': end
                })

            # Aggregate entities
            df = pd.DataFrame(process_entities(processed_entities, input_text))
            st.subheader("Tanımlanan Varlıklar")
            st.dataframe(df)
            
            # Metni formatla
            def format_text(text_data, original_text):
                formatted_text = ""
                last_end = 0
                for item in text_data:
                    if item['start'] > last_end:
                        formatted_text += original_text[last_end:item['start']]
                    word = item['word']
                    label = item['label']
                    score = item['score']
                    if label.startswith('I-PER'):
                        color = 'blue'
                    elif label.startswith('I-MISC'):
                        color = 'green'
                    else:
                        color = 'gray'
                    formatted_text += f"<span style='color:{color}; font-weight: bold;'>{word} ({label}, {score:.2f})</span>"
                    last_end = item['end']
                if last_end < len(original_text):
                    formatted_text += original_text[last_end:]
                return formatted_text

            formatted_text = format_text(process_entities(processed_entities, input_text), input_text)
            st.subheader("Analiz Edilen Metin")
            st.markdown(f"<p>{formatted_text}</p>", unsafe_allow_html=True)
        else:
            st.error("Varlık analizi sonucu beklenen formatta değil.")
    elif task == "Metin Oluşturma":
        output = pipeline_model(input_text, max_length=100, num_return_sequences=1)
        st.subheader("Oluşturulan Metin")
        st.write(output[0]['generated_text'])