自然语言处理学习

来自态灵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

语义角色标注和语义解析

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,875评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,569评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,475评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,459评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,537评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,563评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,580评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,326评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,773评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,086评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,252评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,921评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,566评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,190评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,435评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,129评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,125评论 2 352

推荐阅读更多精彩内容