Views
No views yet
1# for CUDA 12.1
2pip install torch==2.5.1 --index-url https://download.pytorch.org/whl/cu121
3pip install vllm==0.7.2 sudachipy sudachidict-core1import json
2import sudachipy
3from vllm import LLM, SamplingParams
4from vllm.lora.request import LoRARequest
5
6base_model = "google/gemma-2-9b"
7adapter_model = "megagonlabs/prompt-based-parsing-gemma-2-9b-lora-v1"
8input_language = "Japanese"
9input_sentences = ["銀座でランチをご一緒しましょう。", "この時代から、日本列島に人類が住んだ遺跡や遺物が多く発見されている。"]
10
11tokenizer = sudachipy.Dictionary().create(mode=sudachipy.Tokenizer.SplitMode.A)
12
13def tokenize_japanese_space_after(sentence) -> list[str]:
14 tokens = []
15 for m in tokenizer.tokenize(sentence):
16 surface = m.surface()
17 if surface in [" ", " "]:
18 if tokens and tokens[-1][-1] != " ":
19 tokens[-1] += " "
20 else:
21 tokens.append(surface)
22 if tokens and tokens[-1][-1] != " ":
23 tokens[-1] += " "
24 return tokens
25
26def apply_template(language: str, sentence: str, tokens: list[str]) -> list:
27 return """You are an <<<LANGUAGE>>> linguist and specialize in <<<LANGUAGE>>> dependency analysis based on Universal Dependencies.
28We will now perform dependency parsing on <<<LANGUAGE>>> sentence.
29After splitting the input sentence into words as shown below, execute following three tasks:
30
31- Task 1
32
33Create a TSV with three fields: word index from 1 to <<<TOKEN_NUM>>> + word + part of speech.
34
35- Task 2
36Add a field for the dependent word indexes to each row to the output of Task 1.
37However, for the word that is the main predicate of the sentence, the dependent word index should be 0.
38
39- Task 3
40
41Add a field for the Universal Dependencies relation labels to the output of Task 2.
42
43
44input sentence:
45<<<SENTENCE>>>
46
47words:
48<<<TOKENS>>>
49""".replace("<<<LANGUAGE>>>", language).replace("<<<TOKEN_NUM>>>", str(len(tokens))).replace("<<<SENTENCE>>>", sentence).replace("<<<TOKENS>>>", "\n".join(tokens))
50
51input_prompts = [
52 [
53 {
54 "role": "user",
55 "content": apply_template(input_language, s, tokenize_japanese_space_after(s)),
56 }
57 ] for s in input_sentences
58]
59
60llm = LLM(
61 model=base_model,
62 enable_lora=True,
63 tokenizer=adapter_model,
64 dtype="bfloat16",
65 gpu_memory_utilization=0.9,
66 tensor_parallel_size=1,
67 enforce_eager=True,
68)
69sampling_params = SamplingParams(
70 temperature=0.,
71 max_tokens=1024, # <= 8192
72)
73lora_request = LoRARequest("adapter", 1, adapter_model)
74
75results = llm.chat(
76 messages=input_prompts,
77 sampling_params=sampling_params,
78 use_tqdm=False,
79 lora_request=lora_request,
80)
81for sentence, result in zip(input_sentences, results):
82 print("# text =", sentence)
83 print(result.outputs[0].text)# text = 銀座でランチをご一緒しましょう。
- Task 1
1 銀座 PROPN
2 で ADP
3 ランチ NOUN
4 を ADP
5 ご NOUN
6 一緒 NOUN
7 し AUX
8 ましょう AUX
9 。 PUNCT
- Task 2
1 銀座 PROPN 6
2 で ADP 1
3 ランチ NOUN 6
4 を ADP 3
5 ご NOUN 6
6 一緒 NOUN 0
7 し AUX 6
8 ましょう AUX 6
9 。 PUNCT 6
- Task 3
1 銀座 PROPN 6 nmod
2 で ADP 1 case
3 ランチ NOUN 6 obj
4 を ADP 3 case
5 ご NOUN 6 compound
6 一緒 NOUN 0 root
7 し AUX 6 aux
8 ましょう AUX 6 aux
9 。 PUNCT 6 punct
# text = この時代から、日本列島に人類が住んだ遺跡や遺物が多く発見されている。
- Task 1
1 この DET
2 時代 NOUN
3 から ADP
4 、 PUNCT
5 日本 PROPN
6 列島 NOUN
7 に ADP
8 人類 NOUN
9 が ADP
10 住ん VERB
11 だ AUX
12 遺跡 NOUN
13 や ADP
14 遺物 NOUN
15 が ADP
16 多く ADJ
17 発見 VERB
18 さ AUX
19 れ AUX
20 て SCONJ
21 いる VERB
22 。 PUNCT
- Task 2
1 この DET 2
2 時代 NOUN 17
3 から ADP 2
4 、 PUNCT 2
5 日本 PROPN 6
6 列島 NOUN 10
7 に ADP 6
8 人類 NOUN 10
9 が ADP 8
10 住ん VERB 12
11 だ AUX 10
12 遺跡 NOUN 14
13 や ADP 12
14 遺物 NOUN 17
15 が ADP 14
16 多く ADJ 17
17 発見 VERB 0
18 さ AUX 17
19 れ AUX 17
20 て SCONJ 17
21 いる VERB 20
22 。 PUNCT 17
- Task 3
1 この DET 2 det
2 時代 NOUN 17 obl
3 から ADP 2 case
4 、 PUNCT 2 punct
5 日本 PROPN 6 compound
6 列島 NOUN 10 obl
7 に ADP 6 case
8 人類 NOUN 10 nsubj
9 が ADP 8 case
10 住ん VERB 12 acl
11 だ AUX 10 aux
12 遺跡 NOUN 14 nmod
13 や ADP 12 case
14 遺物 NOUN 17 nsubj
15 が ADP 14 case
16 多く ADJ 17 advcl
17 発見 VERB 0 root
18 さ AUX 17 aux
19 れ AUX 17 aux
20 て SCONJ 17 mark
21 いる VERB 20 fixed
22 。 PUNCT 17 punct| dataset | UPOS | UAS | LAS |
|---|---|---|---|
| UD_English-EWT | 0.982 | 0.951 | 0.937 |
| UD_Japanese-GSD | 0.987 | 0.952 | 0.939 |
| UD_Chinese-GSDSimp | 0.972 | 0.889 | 0.862 |
| UD_Korean-GSD | 0.970 | 0.898 | 0.868 |
| UD_French-GSD | 0.981 | 0.956 | 0.943 |
| UD_German-GSD | 0.974 | 0.908 | 0.873 |
| UD_Slovenian-SSJ | 0.989 | 0.954 | 0.939 |
1@article{matsuda-nl263,
2 title={大規模言語モデルによる対話型依存構造解析},
3 author={松田寛},
4 journal={研究報告自然言語処理 (NL)},
5 volume={2025},
6 number={17},
7 pages={1--7},
8 year={2025},
9 publisher={情報処理学会}
10}