在理论学习的基础上,实践项目是提升技能的关键。特别是在自然语言处理(NLP)领域,通过处理特定领域的项目,如语言检测,可以探索广泛的应用场景和问题陈述。本文将引导了解一个令人兴奋的项目——使用自然语言处理构建的语言检测模型,这是一个机器学习应用的实际案例。
使用的是“语言检测数据集”,包含了17种不同语言的文本信息。这些语言包括英语、葡萄牙语、法语、希腊语、荷兰语、西班牙语、日语、俄语、丹麦语、意大利语、土耳其语、瑞典语、阿拉伯语、马拉雅拉姆语、印地语、泰米尔语和泰卢固语。目标是创建一个模型,能够预测给定文本的语言。这种预测系统在人工智能应用和计算语言学中非常广泛,它们被用于手机、笔记本电脑等电子设备中的机器翻译,也用于机器人和多语言文档的跟踪识别。NLP领域仍然是研究者活跃的领域之一。
首先,将导入所有必需的库。
import pandas as pd
import numpy as np
import re
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter("ignore")
接下来,将导入语言检测数据集。
data = pd.read_csv("Language Detection.csv")
print(data.head(10))
如前所述,该数据集包含了17种不同语言的文本信息。让计算每种语言的值计数。
data["Language"].value_counts()
输出结果如下:
English 1385
French 1014
Spanish 819
Portugese 739
Italian 698
Russian 692
Sweedish 676
Malayalam 594
Dutch 546
Arabic 536
Turkish 474
German 470
Tamil 469
Danish 428
Kannada 369
Greek 365
Hindi 63
Name: Language, dtype: int64
现在可以分离依赖和独立变量,这里的文本数据是独立变量,而语言名称是依赖变量。
X = data["Text"]
y = data["Language"]
输出变量——语言名称是一个分类变量。为了训练模型,需要将其转换为数值形式,因此对输出变量进行标签编码。在这个过程中,导入了sklearn中的LabelEncoder。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
这个数据集是通过抓取维基百科创建的,因此它包含许多不需要的符号和数字,这将影响模型的质量。因此,应该执行文本预处理技术。
data_list = []
for text in X:
text = re.sub(r'[!@#$(),n"%^*?:;~`0-9]', ' ', text)
text = re.sub(r'[[]]', ' ', text)
text = text.lower()
data_list.append(text)
众所周知,不仅输出特征,输入特征也应该以数值形式表示。因此,通过创建词袋模型将文本转换为数值形式,使用CountVectorizer。
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
X = cv.fit_transform(data_list).toarray()
已经预处理了输入和输出变量。下一步是创建训练集以训练模型,以及测试集以评估模型。使用train_test_split进行这个过程。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
几乎到了模型创建的部分。使用naive_bayes算法来创建模型。然后使用训练集来训练模型。
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(x_train, y_train)
已经使用训练集训练了模型。现在让预测测试集的输出。
y_pred = model.predict(x_test)
现在可以评估模型。
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
ac = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
打印准确率:
print("Accuracy is :",ac)
模型的准确率为0.97,这是非常好的,模型表现良好。现在让使用seaborn热图绘制混淆矩阵。
plt.figure(figsize=(15,10))
sns.heatmap(cm, annot = True)
plt.show()
现在让使用不同语言的文本测试模型预测。
def predict(text):
x = cv.transform([text]).toarray() # 将文本转换为词袋模型(向量)
lang = model.predict(x) # 预测语言
lang = le.inverse_transform(lang) # 查找与预测值对应的语言
print("The language is in",lang[0]) # 打印语言
如所见,模型所做的预测非常准确。可以使用其他不同语言进行测试。
import pandas as pd
import numpy as np
import re
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.simplefilter("ignore")
# 加载数据集
data = pd.read_csv("Language Detection.csv")
# 每种语言的值计数
data["Language"].value_counts()
# 分离独立和依赖特征
X = data["Text"]
y = data["Language"]
# 将分类变量转换为数值
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y = le.fit_transform(y)
# 创建一个列表,用于追加预处理后的文本
data_list = []
# 遍历所有文本
for text in X:
text = re.sub(r'[!@#$(),n"%^*?:;~`0-9]', ' ', text)
text = re.sub(r'[[]]', ' ', text)
text = text.lower()
data_list.append(text)
# 使用CountVectorizer创建词袋模型
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
X = cv.fit_transform(data_list).toarray()
# 训练测试拆分
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
# 模型创建和预测
from sklearn.naive_bayes import MultinomialNB
model = MultinomialNB()
model.fit(x_train, y_train)
# 预测
y_pred = model.predict(x_test)
# 模型评估
from sklearn.metrics import accuracy_score, confusion_matrix
ac = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)
# 可视化混淆矩阵
plt.figure(figsize=(15,10))
sns.heatmap(cm, annot = True)
plt.show()
# 预测语言的函数
def predict(text):
x = cv.transform([text]).toarray()
lang = model.predict(x)
lang = le.inverse_transform(lang)
print("The language is in",lang[0])