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

自然语言处理学习

作者: 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