美文网首页
自然语言处理学习

自然语言处理学习

作者: 30而立人 | 来源:发表于2023-06-12 17:24 被阅读0次

来自态灵ai :  chatai.taigoodai.com

首先,我们需要了解自然语言处理的基本概念和应用场景。自然语言处理,简称NLP,是指计算机对人类语言进行处理和理解的一系列技术和方法。NLP在语音识别、文本分类、机器翻译、搜索引擎等众多领域都有广泛应用。

下面是我们的学习路径和大纲:

第一部分:自然语言处理基础

- 词汇和句子处理

- 语言模型和概率统计

- 文本分类和聚类

第二部分:自然语言处理进阶

- 文本生成模型

- 序列标注模型

- 机器翻译和跨语言处理

- 语义角色标注和语义解析

第三部分:自然语言处理应用

- 问答系统和智能客服

- 情感分析和情感识别

- 自然语言生成和聊天机器人

让我们开始学习第一部分,自然语言处理基础。

词汇和句子处理

对于自然语言处理,处理最基本的单位是单词和句子。因此,我们首先需要掌握如何对词汇和句子进行处理。

对于词汇处理,我们常用的方法包括分词、词性标注和命名实体识别。其中,分词是将一句话中的词语划分开来,词性标注则是将每个词语的词性标注出来,比如名词、动词等。命名实体识别则是识别出文本中的人名、地名、机构名等实体名称。

代码示例:

import jieba

import jieba.posseg as pseg

sentence = "我喜欢自然语言处理"

words = jieba.cut(sentence)

print("分词结果:", "/".join(words))

# 带词性标注的分词

words = pseg.cut(sentence)

for word, flag in words:

    print(word, flag)

概率统计和语言模型

在自然语言处理中,概率统计和语言建模是非常重要的基础工作。语言模型是对语言的概率分布建模,基于这个模型,我们可以进行文本生成、文本分类、机器翻译等任务。

代码示例:

import jieba

import jieba.posseg as pseg

from collections import defaultdict

data = "我喜欢自然语言处理,也喜欢机器学习"

words = list(jieba.cut(data))

word_count = defaultdict(int)

for word in words:

    word_count[word] += 1

print("词频统计:", dict(word_count))

# 二元语法模型

bigram_count = defaultdict(int)

for i in range(len(words)-1):

    bigram = tuple(words[i:i+2])

    bigram_count[bigram] += 1

print("二元语法统计:", dict(bigram_count))

文本分类和聚类

文本分类是将文本划分到不同的预先定义好的类中,常见的应用场景包括文本分类、情感分类等。文本聚类则是将文本按照它们的相似性划分到不同的组中。

代码示例:

from sklearn.datasets import fetch_20newsgroups

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

from sklearn.naive_bayes import MultinomialNB

from sklearn.pipeline import Pipeline

# 加载数据

news_train = fetch_20newsgroups(subset='train', shuffle=True)

news_test = fetch_20newsgroups(subset='test', shuffle=True)

X_train = news_train.data

y_train = news_train.target

X_test = news_test.data

y_test = news_test.target

# 文本特征提取

text_clf = Pipeline([

    ('vect', CountVectorizer()),

    ('tfidf', TfidfTransformer()),

    ('clf', MultinomialNB())

])

# 训练和预测

text_clf.fit(X_train, y_train)

print("Naive Bayes:", text_clf.score(X_test, y_test))

好的,这就是第一部分自然语言处理基础的全部内容。在掌握了这些基础知识后,我们可以进一步深入学习自然语言处理进阶,应用自然语言处理技术解决更复杂的问题。

好的,接下来我们继续学习自然语言处理进阶。

文本生成模型

文本生成模型是一类利用语言模型生成新的文本的模型。其中,最著名的是基于循环神经网络的模型,如LSTM、GRU等。

代码示例:

import numpy as np

import tensorflow as tf

from tensorflow.keras.layers import LSTM, Dense, Embedding

from tensorflow.keras.models import Sequential

# 加载数据

with open("file.txt", "r", encoding="utf-8") as f:

    data = f.read()

vocab = sorted(list(set(data)))

char2int = {c:i for i, c in enumerate(vocab)}

int2char = {i:c for i, c in enumerate(vocab)}

data = [char2int[c] for c in data]

# 创建训练数据

seq_length = 100

train_X = []

train_y = []

for i in range(len(data)-seq_length-1):

    train_X.append(data[i:i+seq_length])

    train_y.append(data[i+seq_length])

train_X = np.array(train_X)

train_y = np.array(train_y)

# 创建LSTM模型

model = Sequential([

    Embedding(len(vocab), 50, input_length=seq_length),

    LSTM(256, return_sequences=True),

    LSTM(256),

    Dense(len(vocab), activation='softmax')

])

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam')

model.fit(train_X, train_y, batch_size=128, epochs=50)

# 生成新的文本

start = np.random.randint(0, len(data)-seq_length-1)

seed = data[start:start+seq_length]

print("Seed:", ''.join([int2char[s] for s in seed]))

for i in range(100):

    x = np.reshape(seed, (1, len(seed)))

    prediction = model.predict(x, verbose=0)

    idx = np.argmax(prediction)

    result = int2char[idx]

    print(result, end='')

    seed.append(idx)

    seed = seed[1:]

序列标注模型

序列标注模型是指对序列中的每一个位置进行标注,常用的包括命名实体识别和词性标注等。

代码示例:

import tensorflow as tf

Apologies for the disruption, let's continue with the examples of sequence labeling models.

Sequence Labeling Models

在序列标注模型方面,我们主要关注两个任务:词性标注和命名实体识别。

(1)词性标注

词性标注是将文本中每个单词标注为相应的词性,例如名词、动词、形容词等。我们一般使用HMM、CRF等方法进行词性标注。

代码示例:

import nltk

from nltk.corpus import brown

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn_crfsuite import CRF

from sklearn_crfsuite.metrics import flat_classification_report

# 加载数据

nltk.download("brown")

data = brown.tagged_sents(tagset="universal")

# 创建特征

def word2features(sent, i):

    word = sent[i][0]

    features = {

        'bias': 1.0,

        'word.lower()': word.lower(),

        'word[-3:]': word[-3:],

        'word[-2:]': word[-2:],

        'word.isupper()': word.isupper(),

        'word.istitle()': word.istitle(),

        'word.isdigit()': word.isdigit(),

        'postag': sent[i][1],

        'postag[:2]': sent[i][1][:2],

    }

    if i > 0:

        word1 = sent[i-1][0]

        features.update({

            '-1:word.lower()': word1.lower(),

            '-1:word.istitle()': word1.istitle(),

            '-1:word.isupper()': word1.isupper(),

            '-1:postag': sent[i-1][1],

            '-1:postag[:2]': sent[i-1][1][:2],

        })

    else:

        features['BOS'] = True

    if i < len(sent)-1:

        word1 = sent[i+1][0]

        features.update({

            '+1:word.lower()': word1.lower(),

            '+1:word.istitle()': word1.istitle(),

            '+1:word.isupper()': word1.isupper(),

            '+1:postag': sent[i+1][1],

            '+1:postag[:2]': sent[i+1][1][:2],

        })

    else:

        features['EOS'] = True

    return features

def sent2features(sent):

    return [word2features(sent, i) for i in range(len(sent))]

def sent2labels(sent):

    return [label for word, label in sent]

X = [sent2features(s) for s in data]

y = [sent2labels(s) for s in data]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# 训练和预测

crf = CRF(algorithm='lbfgs', c1=0.1, c2=0.1, max_iterations=100, all_possible_transitions=False)

crf.fit(X_train, y_train)

y_pred = crf.predict(X_test)

report = flat_classification_report(y_test, y_pred)

print(report)

(2)命名实体识别

命名实体识别是指识别文本中的人名、地名、机构名等实体。常见的方法包括HMM、CRF等。结合深度学习,也可以使用BiLSTM-CRF模型进行命名实体识别。

代码示例:

import numpy as np

import tensorflow as tf

from tensorflow.keras.layers import Input, Embedding, Bidirectional, LSTM, Dense, Dropout, TimeDistributed, Conv1D

from tensorflow.keras.models import Model

from tensorflow.keras.preprocessing.sequence import pad_sequences

from tensorflow.keras.utils import to_categorical

# 加载数据

with open("file.txt", "r", encoding="utf-8") as f:

    data = f.read()

data = data.split("\n")

texts = []

entities = []

for d in data:

    temp = d.split("\t")

    if len(temp) == 2:

        texts.append(temp[0])

        entities.append(temp[1])

tags = sorted(list(set([tag for doc in entities for tag in doc.split()])))

# 创建数据集

MAX_LEN = max([len(t.split()) for t in texts])

print("最大长度:", MAX_LEN)

tag2idx = {t:i+1 for i, t in enumerate(tags)}

tag2idx["PAD"] = 0

X = [[c.lower() for c in t.split()] for t in texts]

X = pad_sequences(maxlen=MAX_LEN, sequences=X, padding="post", value="")

y = [[tag2idx[tag] for tag in doc.split()] for doc in entities]

y = pad_sequences(maxlen=MAX_LEN, sequences=y, padding="post", value=tag2idx["PAD"])

y = [to_categorical(i, num_classes=len(tag2idx)) for i in y]

# 构建命名实体识别模型

input_layer = Input(shape=(MAX_LEN,))

embedding_layer = Embedding(input_dim=len(tag2idx), output_dim=128)(input_layer)

bi_lstm = Bidirectional(LSTM(128, return_sequences=True))(embedding_layer)

conv1d = Conv1D(64, kernel_size=3, padding="same", activation="relu")(bi_lstm)

dropout = Dropout(0.5)(conv1d)

output_layer = TimeDistributed(Dense(len(tag2idx), activation="softmax"))(dropout)

model = Model(inputs=input_layer, outputs=output_layer)

model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

model.fit(X, np.array(y), batch_size=128, epochs=10, validation_split=0.2)

# 预测

sentence = "Hello world, it's Tom and Jerry."

doc = [c.lower() for c in sentence.split()]

doc = pad_sequences(maxlen=MAX_LEN, sequences=[doc], padding="post", value="")

prediction = model.predict(np.array(doc))[0]

print(prediction)

import numpy as np

import tensorflow as tf

from tensorflow.keras.layers import Input, Embedding, Bidirectional, LSTM, Dense, Dropout, TimeDistributed, Conv1D

from tensorflow.keras.models import Model

from tensorflow.keras.preprocessing.sequence import pad_sequences

from tensorflow.keras.utils import to_categorical

# 加载数据

with open("file.txt", "r", encoding="utf-8") as f:

    data = f.read()

data = data.split("\n")

texts = []

entities = []

for d in data:

    temp = d.split("\t")

    if len(temp) == 2:

        texts.append(temp[0])

        entities.append(temp[1])

tags = sorted(list(set([tag for doc in entities for tag in doc.split()])))

# 创建数据集

MAX_LEN = max([len(t.split()) for t in texts])

print("最大长度:", MAX_LEN)

tag2idx = {t:i+1 for i, t in enumerate(tags)}

tag2idx["PAD"] = 0

X = [[c.lower() for c in t.split()] for t in texts]

X = pad_sequences(maxlen=MAX_LEN, sequences=X, padding="post", value="")

y = [[tag2idx[tag] for tag in doc.split()] for doc in entities]

y = pad_sequences(maxlen=MAX_LEN, sequences=y, padding="post", value=tag2idx["PAD"])

y = [to_categorical(i, num_classes=len(tag2idx)) for i in y]

# 构建命名实体识别模型

input_layer = Input(shape=(MAX_LEN,))

embedding_layer = Embedding(input_dim=len(tag2idx), output_dim=128)(input_layer)

bi_lstm = Bidirectional(LSTM(128, return_sequences=True))(embedding_layer)

conv1d = Conv1D(64, kernel_size=3, padding="same", activation="relu")(bi_lstm)

dropout = Dropout(0.5)(conv1d)

output_layer = TimeDistributed(Dense(len(tag2idx), activation="softmax"))(dropout)

model = Model(inputs=input_layer, outputs=output_layer)

model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=["accuracy"])

model.fit(X, np.array(y), batch_size=128, epochs=10, validation_split=0.2)

# 预测

sentence = "Hello world, it's Tom and Jerry."

doc = [c.lower() for c in sentence.split()]

doc = pad_sequences(maxlen=MAX_LEN, sequences=[doc], padding="post", value="")

prediction = model.predict(np.array(doc))[0]

print(prediction)

pred_tags = np.argmax(prediction, axis=-1)[0]

print(pred_tags)

for w, t in zip(sentence.split(), pred_tags):

    print(w, ":", tags[t])

机器翻译和跨语言处理

机器翻译是指将一种语言的文本转换成另一种语言的文本。其中,统计机器翻译(SMT)是最早的方法,利用大量平行语料进行训练。近年来,随着神经机器翻译(NMT)的出现,机器翻译质量得到了大幅提升。

代码示例:

TODO

语义角色标注和语义解析

语义角色标注是指对句子中的每个单词标注相应的语义角色,例如主语、宾语等。语义解析则

相关文章

网友评论

      本文标题:自然语言处理学习

      本文链接:https://www.haomeiwen.com/subject/ixsqydtx.html