自然语言处理(Natural Language Processing,简称NLP)是人工智能领域中的一个重要分支,主要研究如何使计算机能够理解、理解和生成自然语言。在现代社会中,NLP已经广泛应用于各种领域,如机器翻译、情感分析、信息检索等。在NLP面试中,常见的知识点包括文本预处理、词向量表示、文本分类、文本生成等。

文本预处理

文本预处理是NLP的第一步,用于将原始文本数据转换为适合机器学习模型处理的形式。常见的文本预处理步骤包括分词、去停用词、词干提取等。下面是一个简单的分词示例代码:

import jieba

text = "自然语言处理是人工智能领域中的一个重要分支。"
seg_list = jieba.cut(text, cut_all=False)
print("分词结果:", " ".join(seg_list))

词向量表示

词向量表示是将词语映射到向量空间的过程,这样可以更好地表示词语之间的语义关系。Word2Vec是一种常用的词向量表示方法,通过训练神经网络模型来学习词向量。下面是一个简单的Word2Vec模型示例代码:

from gensim.models import Word2Vec

sentences = [["自然", "语言", "处理"], ["人工智能", "领域"], ["重要", "分支"]]
model = Word2Vec(sentences, min_count=1)
print("词向量表示:", model.wv['自然'])

文本分类

文本分类是将文本数据分为不同的类别的任务,常用于垃圾邮件过滤、情感分析等场景。朴素贝叶斯是一种常用的文本分类算法,基于贝叶斯定理和特征条件独立假设。下面是一个朴素贝叶斯分类器示例代码:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

X_train = ["这是一个好消息", "这是一个坏消息", "这是一个中立消息"]
y_train = [1, 0, 2]

vectorizer = CountVectorizer()
X_train_counts = vectorizer.fit_transform(X_train)

clf = MultinomialNB()
clf.fit(X_train_counts, y_train)

X_test = ["这是一个好消息"]
X_test_counts = vectorizer.transform(X_test)
print("预测结果:", clf.predict(X_test_counts))

文本生成

文本生成是通过模型学习语言规律,生成新的文本数据。循环神经网络(RNN)是常用于文本生成的模型,通过记忆之前的信息来生成新的文本序列。下面是一个简单的RNN文本生成示例代码:

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

text = "自然语言处理是人工智能领域中的一个重要分支。"
chars = sorted(list(set(text)))
char_indices = dict((c, i) for i, c in enumerate(chars))

X = np.zeros((len(text) - 40, 40, len(chars)), dtype=np.bool)
y = np.zeros((len(text) - 40, len(chars)), dtype=np.bool)
for i in range(len(text) - 40):
    for t, char in enumerate(text[i:i + 40]):
        X[i, t, char_indices[char]] = 1
    y[i, char_indices[text[i + 40]]] = 1

model = Sequential()
model.add(LSTM(128, input_shape=(40, len(chars))))
model.add(Dense(len(chars), activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(X, y, epochs=100)

start_index = 0
generated_text = ""
for _ in range(400):
    sampled = np.zeros((1, 40, len(chars)))
    for t, char in enumerate(generated_text):
        sampled[0, t, char_indices[char]] = 1
    preds = model.predict(sampled, verbose=0)[0]
    next_index = np.argmax(preds)