File size: 9,272 Bytes
5cd70f3
 
 
61308e6
5cd70f3
 
 
 
 
 
61308e6
5cd70f3
61308e6
 
 
 
 
5cd70f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61308e6
5cd70f3
 
 
 
 
8372447
5cd70f3
 
 
 
 
 
 
 
 
 
 
 
 
 
3eb61be
5cd70f3
 
 
 
61308e6
5cd70f3
 
 
 
 
 
 
61308e6
 
 
 
 
5cd70f3
61308e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5cd70f3
 
 
 
61308e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5cd70f3
 
 
 
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
import gradio as gr
import numpy as np
import openai
import time

from sentence_transformers import SentenceTransformer
from langchain.prompts import PromptTemplate
from collections import Counter


def process(caption, category, asr, ocr):
    preference = "兴趣标签"
    if len(category) == 0:
        category = "空"
    if len(asr) == 0:
        asr = "空"

    example = "例如,给定一个视频,它的\"标题\"为\"长安系最便宜的轿车,4W起很多人都看不上它,但我知道车只是代步工具,又需要什么面子呢" \
              "!\",\"类别\"为\"汽车\",\"ocr\"为\"长安系最便宜的一款轿车\",\"asr\"为\"我不否认现在的国产和合资还有一定的差距," \
              "但确实是他们让我们5万开了MP V8万开上了轿车,10万开张了ICV15万开张了大七座。\",\"{}\"生成机器人推断出合理的\"{}\"为\"" \
              "长安轿车报价、最便宜的长安轿车、新款长安轿车\"。".format(preference, preference)

    prompt = PromptTemplate(
        input_variables=["preference", "caption", "ocr", "asr", "category", "example"],
        template="你是一个视频的\"{preference}\"生成机器人,根据输入的视频标题、类别、ocr、asr推理出合理的\"{preference}\",以多个多"
                 "于两字的标签形式进行表达,以顿号隔开。{example}那么,给定一个新的视频,它的\"标题\"为\"{caption}\",\"类别\"为"
                 "\"{category}\",\"ocr\"为\"{ocr}\",\"asr\"为\"{asr}\",请推断出该视频的\"{preference}\":"
    )

    text = prompt.format(preference=preference, caption=caption, category=category, ocr=ocr, asr=asr, example=example)

    try:
        completion = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=[{"role": "user", "content": text}],
            temperature=1.5,
            n=5
        )

        res = []
        for j in range(5):
            ans = completion.choices[j].message["content"].strip()
            ans = ans.replace("\n", "")
            ans = ans.replace("。", "")
            ans = ans.replace(",", "、")
            res += ans.split('、')

        tag_count = Counter(res)
        tag_count = sorted(tag_count.items(), key=lambda x: x[1], reverse=True)[:10]

        tags_embed = np.load('./tag_data/tags_embed.npy')
        tags_dis = np.load('./tag_data/tags_dis.npy')

        candidate_tags = [_[0] for _ in tag_count]
        encoder = SentenceTransformer("hfl/chinese-roberta-wwm-ext-large", device='cuda')
        candidate_tags_embed = encoder.encode(candidate_tags)
        candidate_tags_dis = [np.sqrt(np.dot(_, _.T)) for _ in candidate_tags_embed]

        scores = np.dot(candidate_tags_embed, tags_embed.T)
        f = open('./tag_data/tags.txt', 'r')
        all_tags = []
        for line in f.readlines():
            all_tags.append(line.strip())
        f.close()

        final_ans = []
        for i in range(scores.shape[0]):
            for j in range(scores.shape[1]):
                score = scores[i][j] / (candidate_tags_dis[i] * tags_dis[j])
                if score > 0.9:
                    final_ans.append(all_tags[j])

        final_ans = Counter(final_ans)
        final_ans = sorted(final_ans.items(), key=lambda x: x[1], reverse=True)[:5]
        final_ans = [_[0] for _ in final_ans]

        return "、".join(final_ans)

    except:
        return 'api error'


def connection(api_key):
    openai.api_key = api_key
    time.sleep(5)


with gr.Blocks() as demo:
    gr.Markdown("<h3><center>TagGPT</center></h3>")
    gr.Markdown(
        """
        This is a demo to the work  [TagGPT: Large Language Models are Zero-shot Multimodal Taggers](https://github.com/TencentARC/TagGPT).<br>
        This space connects TagGPT to provide tagging service based on the tag set (from the Kuaishou data).<br>  
        """
    )
    gr.Markdown(
        """
        Step 1: input openai api key (sk-...) and click "connect" button.
        """
    )

    with gr.Column(variant="panel"):
        with gr.Row(variant="compact"):
            text_api = gr.Textbox(
                label='OpenAI API key',
                placeholder="Paste your OpenAI API key here️",
                type="password"
            ).style(
                container=False,
            )
            btn_api = gr.Button("Connect").style(full_width=False)

    btn_api.click(connection, [text_api])

    gr.Markdown(
        """
        Step 2: fall in the four items (i.e., caption, category, ASR, and OCR) in the appropriate input fields.
        Click any item of the "Examples" to quickly see the tagging results.
        """
    )

    text_caption = gr.Textbox(
        label='标题(Caption)',
        placeholder="Indispensable"
    )
    text_category = gr.Textbox(
        label='类别(Category)',
        placeholder="Dispensable"
    )
    text_asr = gr.Textbox(
        label='ASR',
        placeholder="Dispensable"
    )
    text_ocr = gr.Textbox(
        label='OCR',
        placeholder="Dispensable"
    )

    text_output = gr.Textbox(value='', label='Output')

    btn = gr.Button(value='Submit')
    btn.click(process, inputs=[text_caption, text_category, text_asr, text_ocr], outputs=[text_output])

    examples = [
        [
            '正确解决iCloud储存空间将满的实用技巧',
            '高新数码',
            '你的iCloud一直提示,iCloud储存空间将满,而且还会把你的iPhone iPad Mac等相关连设备都弹一遍,怎么办,烦死了。其实只要用iPho'
            'ne打开设置,点击上方的头像栏,然后点击iCloud,选择管理账户储存空间,进入后,把这里不需要云备份按自己的需要进行删除,然后再回'
            '到上一级页面,把这里的iCloud云备份关闭就可以了。',
            'iCloud储存空间将满实用技巧'
        ],
        [
            '30平米迷你小公寓如何设计?创意设计多出一间房!',
            '房产家居',
            '这是一个30平米的迷你公寓,入户没有鞋柜,没有餐厅,没有书桌位置,咱们可以这样设计,首先吧卫生间墙内推30公分,嵌入鞋柜,'
            '厨房旁边装三联动推拉门,进出舒适,隔绝油烟,把原有沙发该到卧室位置,可以让出一个餐厅位置,沙发前移做一组书柜,内藏隐形'
            '壁床,打开是卧室,收起便是小客厅,对面墙壁,再做一组书柜和书桌,各种需求都满足。',
            '30平迷你公寓怎么设计'
        ],
        [
            '好好钓鱼!千万别算账',
            '生活',
            '一只鱼竿四千多,用它来钓多少鱼才能回本,钓鱼是娱乐而算账却很扎心,这是一根国产标配波爬竿,我的深海标配,主要针对海绵大'
            '型鱼类,比如金枪鱼、gt、鬼头刀等,经济价值最高的算是金枪鱼了,一不小心钓上一条鱼竿就回来了,不小心又钓上一条轮子就回来了'
            '当你发现你的渔具全是渔获换来的,吹起牛来是不是更加有底气。一支鱼竿,一副轮子,又来一套,哈哈。你钓了几套渔具呢?',
            '钓鱼很开心,算账很扎心'
        ],
        [
            '很多朋友再问,为什么蒸出来的花卷葱没变色,今天告诉你',
            '美食',
            '为什么你自己在家做的画卷,蒸出来之后,它的葱总是黄色的呢?而早餐店里面的画卷蒸出来过后它的葱都是绿油油的,那么今天呢,'
            '把方法教给你,那就是我们做花卷的时候呢,再从里面加入少量的泡打粉,拌均匀,这样做出来的画卷呢,蒸熟过后,它的葱也是绿'
            '油油的,大家可以看一下。',
            '为什么你蒸的葱油花卷总会变黄'
        ],
        [
            '豪华七座SUV 比亚迪唐DM-i冠军版带你体验出行新方式',
            '汽车',
            '你听说了吗,2023年冠军版本的唐DM-i已经上市了,上市当天,汉唐总销量已经超过了8000多台,大家觉得这个成绩怎么样,那么,今天'
            '艾琳就带大家全民啊了解一下,2023年冠军版本的唐DM-i,新款的唐DM-i和老款之间的差别并不大,但是我们的新款新增了冰川蓝的颜色'
            '还有啊,你看这个轮毂是不是和我们老款252公里的轮毂一样呢,另外新款多了铝合金底盘,FSD可变主力悬挂,快充也升级到了40千瓦,还'
            '有专门的快充孔,20分钟就可以让他满血复活,2023款唐DM-i一共分为三个配置,尊贵尊荣尊享,不过都是7座,那配置上的差异,艾琳'
            '就把它放在图上了,方便大家对比。想入手的朋友记住了,武汉比亚迪找艾琳,艾琳带你早提车。',
            '豪华标杆SUV,23款唐DM-1冠军版'
        ]
    ]

    gr.Examples(
        examples,
        [text_caption, text_category, text_asr, text_ocr],
        text_output,
        process
    )


if __name__ == "__main__":
    demo.launch()