1. 词元化是一个关键的预处理步骤,它因语言而异。尝试找到另外三种常用的词元化文本的方法。
词元化(Tokenization)是自然语言处理(NLP)中的一个关键步骤,其目的是将文本分解成更小的单位(如单词、短语或符号),以便进行进一步的分析和处理。根据语言和应用的不同,词元化的方法也有所不同。以下是三种常用的词元化方法:
-
基于规则的词元化:
- 这种方法使用预定义的规则或正则表达式来分割文本。
- 例如,英文文本中可以使用空格和标点符号来分割单词。
- 优点:简单且适用于规则明确的语言,如英文。
- 缺点:对于形态丰富或缺乏明显分隔符的语言(如中文或日文),效果不佳。
- 例子:对于句子“Hello, world! How are you?”,基于规则的词元化可以分割为“Hello”, “world”, “How”, “are”, “you”。
-
基于统计的词元化:
- 这种方法利用统计信息,如词频或n-gram(常见的词序列),来确定词元的边界。
- 通常应用于没有明显单词边界的语言,如中文或泰文。
- 优点:能够处理形态复杂的语言,并可以发现新词。
- 缺点:需要大量的训练数据和计算资源。
- 例子:使用Bi-gram模型对中文句子“我喜欢自然语言处理”进行词元化,可能得到“我/喜欢/自然/语言/处理”。
-
基于深度学习的词元化:
- 使用神经网络模型,如LSTM或Transformer,对文本进行词元化。
- 这种方法能够捕捉上下文信息,并适用于多种语言。
- 优点:对多语言、多领域具有较好的泛化能力,能够处理复杂的语言结构。
- 缺点:需要大量标注数据进行训练,计算成本高。
- 例子:BERT模型可以对句子进行词元化,并生成上下文敏感的词元嵌入。例如,对句子“The quick brown fox”进行词元化,BERT可能生成“[CLS] The quick brown fox [SEP]”这样的词元序列。
这些方法各有优缺点,选择适当的词元化方法通常依赖于具体的应用场景和语言特性。在实际应用中,可能需要结合多种方法以获得更好的词元化效果。
2. 在本节的实验中,将文本词元为单词和更改 Vocab
实例的 min_freq
参数。这对词表大小有何影响?
dash_line = '=' * 40
# vocab = Vocab(tokens)
vocab = Vocab(tokens, min_freq=0)
print(len(vocab))
print(list(vocab.token_to_idx.items())[:10])
print(list(vocab.token_to_idx.items())[-10:])
# print(dash_line)
# print(vocab.token_freqs)
freqs_count = {}
for token, freq in vocab.token_freqs:
freqs_count[freq] = freqs_count[freq] + 1 if freq in freqs_count else 1
# if freq not in freqs_count:
# freqs_count[freq] = 1
# else:
# freqs_count[freq] += 1
print(dash_line)
print(freqs_count)
freqs_count = sorted(freqs_count.items(), key=lambda x: x[1], reverse=True)
print(dash_line)
print(freqs_count)
4580
[('<unk>', 0), ('the', 1), ('i', 2), ('and', 3), ('of', 4), ('a', 5), ('to', 6), ('was', 7), ('in', 8), ('that', 9)]
[('manhood', 4570), ('fragmentary', 4571), ('discord', 4572), ('culminating', 4573), ('discussed', 4574), ('cheerlessly', 4575), ('advancement', 4576), ('makers', 4577), ('casual', 4578), ('brittle', 4579)]
========================================
{2261: 1, 1267: 1, 1245: 1, 1155: 1, 816: 1, 695: 1, 552: 1, 541: 1, 443: 1, 440: 1, 437: 1, 354: 1, 281: 1, 270: 1, 243: 1, 221: 1, 216: 1, 204: 1, 200: 1, 158: 1, 152: 1, 137: 2, 134: 1, 129: 1, 127: 1, 123: 1, 122: 3, 120: 1, 118: 1, 114: 2, 113: 2, 112: 1, 106: 1, 105: 1, 103: 1, 94: 1, 93: 1, 92: 2, 91: 1, 89: 1, 88: 1, 87: 1, 86: 1, 85: 3, 84: 2, 82: 1, 79: 1, 77: 1, 75: 1, 74: 3, 73: 1, 72: 1, 71: 1, 70: 3, 69: 1, 66: 1, 62: 1, 61: 1, 60: 1, 59: 2, 57: 3, 55: 1, 54: 2, 53: 1, 52: 1, 51: 1, 50: 1, 49: 6, 48: 2, 47: 2, 46: 4, 45: 2, 44: 1, 43: 3, 42: 2, 41: 1, 40: 4, 39: 1, 38: 2, 37: 5, 36: 6, 35: 5, 34: 6, 33: 3, 32: 5, 31: 3, 30: 3, 29: 2, 28: 6, 27: 5, 26: 7, 25: 4, 24: 5, 23: 6, 22: 11, 21: 9, 20: 13, 19: 11, 18: 5, 17: 9, 16: 18, 15: 12, 14: 14, 13: 25, 12: 17, 11: 32, 10: 38, 9: 39, 8: 63, 7: 84, 6: 94, 5: 145, 4: 219, 3: 376, 2: 763, 1: 2397}
========================================
[(1, 2397), (2, 763), (3, 376), (4, 219), (5, 145), (6, 94), (7, 84), (8, 63), (9, 39), (10, 38), (11, 32), (13, 25), (16, 18), (12, 17), (14, 14), (20, 13), (15, 12), (22, 11), (19, 11), (21, 9), (17, 9), (26, 7), (49, 6), (36, 6), (34, 6), (28, 6), (23, 6), (37, 5), (35, 5), (32, 5), (27, 5), (24, 5), (18, 5), (46, 4), (40, 4), (25, 4), (122, 3), (85, 3), (74, 3), (70, 3), (57, 3), (43, 3), (33, 3), (31, 3), (30, 3), (137, 2), (114, 2), (113, 2), (92, 2), (84, 2), (59, 2), (54, 2), (48, 2), (47, 2), (45, 2), (42, 2), (38, 2), (29, 2), (2261, 1), (1267, 1), (1245, 1), (1155, 1), (816, 1), (695, 1), (552, 1), (541, 1), (443, 1), (440, 1), (437, 1), (354, 1), (281, 1), (270, 1), (243, 1), (221, 1), (216, 1), (204, 1), (200, 1), (158, 1), (152, 1), (134, 1), (129, 1), (127, 1), (123, 1), (120, 1), (118, 1), (112, 1), (106, 1), (105, 1), (103, 1), (94, 1), (93, 1), (91, 1), (89, 1), (88, 1), (87, 1), (86, 1), (82, 1), (79, 1), (77, 1), (75, 1), (73, 1), (72, 1), (71, 1), (69, 1), (66, 1), (62, 1), (61, 1), (60, 1), (55, 1), (53, 1), (52, 1), (51, 1), (50, 1), (44, 1), (41, 1), (39, 1)]
4580 个 token 中,仅出现过一次的 token 有 2397,超过半数,过滤之后就只剩下常用的连接词,信息丢失严重。