训练分词器并在句子中过滤停用词
介绍
在 NLP 中,将文本分割成句子是一个非常关键的预处理任务。分词是将文本语料库分解成单个句子的过程。在 NLTK 中,默认的分词器可以很好地完成文本分词任务,但是当文本包含非标准的标点符号、符号等时,它就会失效。在这种情况下,我们需要训练一个分词器。
在本文中,让我们探讨分词器的训练,并了解过滤词或停用词的使用。
NLP 中的句子分词
NLTK 中的默认分词器可用于以下给出的文本示例。
Ram - 上周日去哪里了?
Mohan - 我去看了泰姬陵。
Ram - 泰姬陵在哪里?
Mohan - 它位于阿格拉。它被认为是世界七大奇迹之一。
import nltk nltk.download('punkt') from nltk.tokenize import sent_tokenize textual_data = """ Ram : Where have gone last Sunday? Mohan : I went to see the Taj Mahal. Ram: Where is the Taj Mahal located Mohan: It is located in Agra.It is considered to be one of the wornders of the world. """ sentences = sent_tokenize(textual_data) print(sentences[0]) print("\n",sentences)
输出
Ram : Where have gone last Sunday? ['\nRam : Where have gone last Sunday?', 'Mohan : I went to see the Taj Mahal.', 'Ram: Where is the Taj Mahal located \n\n\nMohan: It is located in Agra.It is considered to be one of the wonders of the world.']
最后一句的输出看起来不正确,因为分词器未能对文本进行分词,因为文本没有遵循正常的段落结构。
这是一种可以训练分词器的情况。
data.txt 链接:https://drive.google.com/file/d/1bs2eBbSxTSeaAuDlpoDqGB89Ej9HAqPz/view?usp=sharing。
训练分词器
在本例中,我们将使用 Punkt 句子分词器。
import nltk nltk.download('webtext') from nltk.tokenize import PunktSentenceTokenizer from nltk.corpus import webtext data = webtext.raw('/content/data.txt') tokenizer_sentence = PunktSentenceTokenizer(data) sentences = tokenizer_sentence.tokenize(data) print(sentences[0]) print("\n",sentences)
输出
Ram : Where have gone last Sunday? ['Ram : Where have gone last Sunday?', 'Mohan : I went to see the Taj Mahal.', 'Ram: Where is the Taj Mahal located?', 'Mohan: It is located in Agra.It is considered to be one of the wonders of the world.']
在句子中过滤停用词
在文本语料库中,那些不为特定句子增添意义的词称为停用词。在预处理过程中,它们通常会被从原始文本中删除,因为它们对 NLP 任务并不重要。NLTK 库是对应于不同语言的停用词集合。
让我们通过代码示例了解过滤停用词的过程。
示例句子:“每一代都会诞生一位新的演员,并受到许多粉丝的崇拜”
import nltk nltk.download('stopwords') from nltk.corpus import stopwords as sw from nltk.tokenize import word_tokenize sentence = "A new actor is born every generation and is worshipped by many fans" " stopwords_en = set(sw.words('english')) word_list = word_tokenize(sentence) filtered_words = [w for w in word_list if w not in stopwords_en] print ("Words present in the sentence initially : ",word_list) print ("\nWords after stopword removal process : ",filtered_words)
输出
Words presents in the sentence initially : ['A', 'new', 'actor', 'is', 'born', 'every', 'generation', 'and', 'is', 'worshipped', 'by', 'many', 'fans'] Words after stopword removal process : ['A', 'new', 'actor', 'born', 'every', 'generation', 'worshipped', 'many', 'fans']
不同类型的分词
TFIDF 分词
TF-IDF 代表词频-逆文档频率。它是一种算法,利用词语出现的频率来确定和权衡词语在特定文档中的重要性。它有两个术语 TF(词频)和 IDF(逆文档频率)。
TF 表示词语在特定文档中出现的频率,计算公式如下:
TF = t 在 d 中的频率 / d 中的总词数 = tf(t,d)
IDF 衡量的是在语料库中的多少个文档 D 中出现了特定术语 t,表示为:
IDF = 语料库中文档的总数 N / 包含术语 t 的文档数 = idf(t,D)
TF-IDF 是 TF 和 IDF 项的乘积
TF-IDF=tf(t,d) *idf(t,D)
使用 Scikit-learn 库的 TFIDF 向量化器的示例
from sklearn.feature_extraction.text import TfidfVectorizer vectorizer = TfidfVectorizer() corpus = ["Hello how are you","You have called me","How are you"] data = vectorizer.fit_transform(corpus) tokens = vectorizer.get_feature_names_out() print(tokens) print(data.shape)
输出
['are' 'called' 'have' 'hello' 'how' 'me' 'you'] (3, 7)
频率计数
此方法用于计算语料库中文档或文本中每个词的频率。
例如,在给定的文本中
狐狸在丛林里走着。然后它看到一只老虎朝它走来。狐狸看到老虎后吓坏了。”
词频可以发现为
coming: 1
it.The: 1
jungle: 1
seeing: 1
terrified: 1
then: 1
tiger: 2
towards: 1
walking: 1
import nltk from nltk.corpus import webtext from nltk.tokenize import word_tokenize from nltk.probability import FreqDist import nltk nltk.download('punkt') text_data = "The fox was walking in the jungle. It then saw a tiger coming towards it.The fox was terrified on seeing the tiger." words = word_tokenize(text_data) print(words) word_freq = nltk.FreqDist(words) words_filtered = dict([(i, j) for i, j in word_freq.items() if len(i) > 3]) for k in sorted(words_filtered): print("%s: %s" % (k, words_filtered[k]))
输出
['The', 'fox', 'was', 'walking', 'in', 'the', 'jungle', '.', 'It', 'then', 'saw', 'a', 'tiger', 'coming', 'towards', 'it.The', 'fox', 'was', 'terrified', 'on', 'seeing', 'the', 'tiger', '.'] coming: 1 it.The: 1 jungle: 1 seeing: 1 terrified: 1 then: 1 tiger: 2 towards: 1 walking: 1
基于规则的分词
基于规则的分词器使用一些预定义规则将文本分解成标记。这些规则可以是正则表达式过滤器或语法约束。
例如,可以使用规则通过空格或逗号分割文本。
此外,一些分词器适用于推文,它们具有特殊的规则来分割单词并保留特殊字符,如表情符号等。
下面是一个基于正则表达式规则的分词器的代码示例。
from nltk.tokenize import regexp_tokenize data_text = "Jack and Jill went up the hill." print(regexp_tokenize(data_text, "[\w']+"))
输出
['Jack', 'and', 'Jill', 'went', 'up', 'the', 'hill']
停用词过滤器
停用词是在 NLP 和文本处理的上下文中不会为句子的含义增加任何特殊意义的常用词,并且通常会被大多数分词器忽略。
from nltk.corpus import stopwords from nltk.tokenize import word_tokenize import nltk nltk.download('stopwords') text_data = "Hello how are you.You have called me. How are you" data = word_tokenize(text_data) filtered_words = [w for w in data if w not in stopwords.words('english')] print(filtered_words)
输出
['Hello', '.', 'You', 'called', '.', 'How']
结论
句子分词和停用词去除是两种非常常见且重要的 NLP 文本预处理步骤。对于简单的语料库结构,可以使用默认的句子分词器,但是对于不遵循常规段落结构的文本,甚至可以训练分词器。停用词不会对句子的含义做出贡献,因此在文本预处理期间会被过滤掉。