1. 文本清洗
文本清洗是任何 NLP 项目的第一步。它涉及去除不需要的信息,如标点符号、数字、特殊字符等。
代码示例:
1 import re<br><br>def clean_text(text):<br> <em># 去除标点符号</em><br> text = re.sub(r'[^\w\s]', '', text)<br> <em># 去除数字</em><br> text = re.sub(r'\d+', '', text)<br> <em># 将所有字母转为小写</em><br> text = text.lower()<br> return text<br><br><em># 示例文本</em><br>text = "Hello, World! This is an example text with numbers 123 and symbols #@$."<br>cleaned_text = clean_text(text)<br><br>print(cleaned_text) <em># 输出: hello world this is an example text with numbers and symbols</em>
解释:
- 使用
1re
模块的
1sub()方法去除标点符号和数字。
-
1lower()
方法将所有字母转换为小写。
2. 分词
分词是将文本拆分成单词的过程。这有助于进一步处理,如词频统计、情感分析等。
代码示例:
1 from nltk.tokenize import word_tokenize<br><br><em># 示例文本</em><br>text = "Hello, World! This is an example text."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br>print(tokens) <em># 输出: ['Hello', ',', 'World', '!', 'This', 'is', 'an', 'example', 'text', '.']</em>
解释:
- 使用
1nltk
库中的
1word_tokenize()函数进行分词。
3. 去除停用词
停用词是指在文本中频繁出现但对语义贡献较小的词,如“the”、“is”等。
代码示例:
1 from nltk.corpus import stopwords<br>from nltk.tokenize import word_tokenize<br><br><em># 示例文本</em><br>text = "The quick brown fox jumps over the lazy dog."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br><em># 去除停用词</em><br>stop_words = set(stopwords.words('english'))<br>filtered_tokens = [token for token in tokens if token.lower() not in stop_words]<br><br>print(filtered_tokens) <em># 输出: ['quick', 'brown', 'fox', 'jumps', 'over', 'lazy', 'dog']</em>
解释:
- 使用
1nltk.corpus.stopwords
获取英语停用词列表。
- 使用列表推导式过滤掉停用词。
4. 词干提取
词干提取是将单词还原为其基本形式的过程,有助于减少词汇量。
代码示例:
1 from nltk.stem import PorterStemmer<br>from nltk.tokenize import word_tokenize<br><br><em># 示例文本</em><br>text = "running dogs are barking loudly."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br><em># 词干提取</em><br>stemmer = PorterStemmer()<br>stemmed_tokens = [stemmer.stem(token) for token in tokens]<br><br>print(stemmed_tokens) <em># 输出: ['run', 'dog', 'are', 'bark', 'loudli', '.']</em>
解释:
- 使用
1PorterStemmer
对单词进行词干提取。
5. 词形还原
词形还原类似于词干提取,但它使用词典来找到单词的基本形式。
代码示例:
1 from nltk.stem import WordNetLemmatizer<br>from nltk.tokenize import word_tokenize<br><br><em># 示例文本</em><br>text = "running dogs are barking loudly."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br><em># 词形还原</em><br>lemmatizer = WordNetLemmatizer()<br>lemmatized_tokens = [lemmatizer.lemmatize(token) for token in tokens]<br><br>print(lemmatized_tokens) <em># 输出: ['running', 'dog', 'are', 'barking', 'loudly', '.']</em>
解释:
- 使用
1WordNetLemmatizer
进行词形还原。
6. 词频统计
词频统计可以帮助我们了解文本中最常见的词汇。
代码示例:
1 from nltk.tokenize import word_tokenize<br>from nltk.probability import FreqDist<br>import matplotlib.pyplot as plt<br><br><em># 示例文本</em><br>text = "This is a sample text. This text contains some words that are repeated several times."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br><em># 计算词频</em><br>fdist = FreqDist(tokens)<br><br><em># 绘制词频图</em><br>plt.figure(figsize=(10, 5))<br>fdist.plot(10)<br>plt.show()
解释:
- 使用
1FreqDist
计算词频。
- 使用
1matplotlib
绘制词频图。
7. 情感分析
情感分析用于判断文本的情感倾向,如正面、负面或中性。
代码示例:
1 from nltk.sentiment import SentimentIntensityAnalyzer<br><br><em># 示例文本</em><br>text = "I love this movie. It's amazing!"<br><br><em># 情感分析</em><br>sia = SentimentIntensityAnalyzer()<br>sentiment_scores = sia.polarity_scores(text)<br><br>print(sentiment_scores) <em># 输出: {'neg': 0.0, 'neu': 0.429, 'pos': 0.571, 'compound': 0.8159}</em>
解释:
- 使用
1SentimentIntensityAnalyzer
进行情感分析。
8. 词向量化
词向量化将单词表示为数值向量,便于计算机处理。
代码示例:
1 import gensim.downloader as api<br><br><em># 加载预训练的 Word2Vec 模型</em><br>model = api.load("glove-twitter-25")<br><br><em># 示例文本</em><br>text = "This is a sample sentence."<br><br><em># 分词</em><br>tokens = text.split()<br><br><em># 向量化</em><br>vectorized_tokens = [model[token] for token in tokens if token in model.key_to_index]<br><br>print(vectorized_tokens)
解释:
- 使用
1gensim
库加载预训练的 Word2Vec 模型。
- 将单词转换为向量表示。
9. 主题建模
主题建模用于识别文档集合中的主题。
代码示例:
1 from gensim import corpora, models<br><br><em># 示例文本</em><br>documents = [<br> "Human machine interface for lab abc computer applications",<br> "A survey of user opinion of computer system response time",<br> "The EPS user interface management system",<br> "System and human system engineering testing of EPS",<br> "Relation of user perceived response time to error measurement",<br> "The generation of random binary unordered trees",<br> "The intersection graph of paths in trees",<br> "Graph minors IV Widths of trees and well quasi ordering",<br> "Graph minors A survey"<br>]<br><br><em># 分词</em><br>texts = [[word for word in document.lower().split()] for document in documents]<br><br><em># 创建词典</em><br>dictionary = corpora.Dictionary(texts)<br><br><em># 转换为文档-词频矩阵</em><br>corpus = [dictionary.doc2bow(text) for text in texts]<br><br><em># LDA 模型</em><br>lda = models.LdaModel(corpus, num_topics=2, id2word=dictionary, passes=10)<br><br><em># 打印主题</em><br>for topic in lda.print_topics(num_topics=2, num_words=5):<br> print(topic)
解释:
- 使用
1gensim
库进行主题建模。
- 使用 LDA 模型识别主题。
10. 文本分类
文本分类是将文本分配给预定义类别的过程。
代码示例:
1 from sklearn.feature_extraction.text import CountVectorizer<br>from sklearn.naive_bayes import MultinomialNB<br>from sklearn.model_selection import train_test_split<br>from sklearn.metrics import accuracy_score<br><br><em># 示例数据</em><br>documents = [<br> "Human machine interface for lab abc computer applications",<br> "A survey of user opinion of computer system response time",<br> "The EPS user interface management system",<br> "System and human system engineering testing of EPS",<br> "Relation of user perceived response time to error measurement",<br> "The generation of random binary unordered trees",<br> "The intersection graph of paths in trees",<br> "Graph minors IV Widths of trees and well quasi ordering",<br> "Graph minors A survey"<br>]<br><br>labels = [0, 0, 0, 0, 0, 1, 1, 1, 1]<br><br><em># 分词</em><br>vectorizer = CountVectorizer()<br>X = vectorizer.fit_transform(documents)<br><br><em># 划分训练集和测试集</em><br>X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)<br><br><em># 训练模型</em><br>classifier = MultinomialNB()<br>classifier.fit(X_train, y_train)<br><br><em># 预测</em><br>y_pred = classifier.predict(X_test)<br><br><em># 评估准确率</em><br>accuracy = accuracy_score(y_test, y_pred)<br>print(f"Accuracy: {accuracy:.2f}")
解释:
- 使用
1sklearn
库进行文本分类。
- 使用朴素贝叶斯分类器进行预测。
11. 命名实体识别(NER)
命名实体识别用于识别文本中的特定实体,如人名、地名等。
代码示例:
1 import spacy<br><br><em># 加载预训练模型</em><br>nlp = spacy.load("en_core_web_sm")<br><br><em># 示例文本</em><br>text = "Apple is looking at buying U.K. startup for $1 billion."<br><br><em># 处理文本</em><br>doc = nlp(text)<br><br><em># 提取实体</em><br>for ent in doc.ents:<br> print(ent.text, ent.label_)<br><br><em># 输出:</em><br><em># Apple ORG</em><br><em># U.K. GPE</em><br><em># $1 billion MONEY</em>
解释:
- 使用
1spacy
库进行命名实体识别。
- 提取文本中的实体及其类型。
12. 机器翻译
机器翻译用于将一种语言的文本转换为另一种语言。
代码示例:
1 from googletrans import Translator<br><br><em># 创建翻译器对象</em><br>translator = Translator()<br><br><em># 示例文本</em><br>text = "Hello, how are you?"<br><br><em># 翻译文本</em><br>translated_text = translator.translate(text, src='en', dest='fr')<br><br>print(translated_text.text) <em># 输出: Bonjour, comment ça va ?</em>
解释:
- 使用
1googletrans
库进行文本翻译。
- 将英文文本翻译成法文。
13. 文本摘要
文本摘要是生成文本的简洁版本,保留主要信息。
代码示例:
1 from transformers import pipeline<br><br><em># 创建摘要生成器</em><br>summarizer = pipeline("summarization")<br><br><em># 示例文本</em><br>text = """<br>Natural language processing (NLP) is a subfield of linguistics, computer science, <br>and artificial intelligence concerned with the interactions between computers and <br>human (natural) languages. As such, NLP is related to the area of human–computer interaction.<br>Many challenges in NLP involve natural language understanding, that is, enabling computers <br>to derive meaning from human or natural language input, and others involve natural language <br>generation.<br>"""<br><br><em># 生成摘要</em><br>summary = summarizer(text, max_length=100, min_length=30, do_sample=False)<br><br>print(summary[0]['summary_text'])
************************************************### Python 在自然语言处理(NLP)中的13个应用实例(续)
14. 词云生成
词云是一种可视化工具,可以直观地展示文本中最常出现的词汇。
代码示例:
1 from wordcloud import WordCloud<br>import matplotlib.pyplot as plt<br><br><em># 示例文本</em><br>text = "Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human (natural) languages."<br><br><em># 生成词云</em><br>wordcloud = WordCloud(width=800, height=400, background_color='white').generate(text)<br><br><em># 显示词云</em><br>plt.figure(figsize=(10, 5))<br>plt.imshow(wordcloud, interpolation='bilinear')<br>plt.axis('off')<br>plt.show()
解释:
- 使用
1wordcloud
库生成词云。
- 设置词云的宽度、高度和背景颜色。
- 使用
1matplotlib
显示词云图像。
15. 问答系统
问答系统用于回答用户提出的问题。
代码示例:
1 from transformers import pipeline<br><br><em># 创建问答模型</em><br>qa_pipeline = pipeline("question-answering", model="distilbert-base-cased-distilled-squad")<br><br><em># 示例问题和上下文</em><br>context = "Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human (natural) languages."<br>question = "What is NLP?"<br><br><em># 生成答案</em><br>answer = qa_pipeline(question=question, context=context)<br><br>print(answer['answer']) <em># 输出: Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human (natural) languages.</em>
解释:
- 使用
1transformers
库创建问答模型。
- 提供问题和上下文文本。
- 生成答案并打印。
16. 信息抽取
信息抽取是从非结构化文本中提取有用信息的过程。
代码示例:
1 from transformers import pipeline<br><br><em># 创建信息抽取模型</em><br>ner_pipeline = pipeline("ner", model="dbmdz/bert-large-cuneiform-sumerian-ner")<br><br><em># 示例文本</em><br>text = "Sargon was a king of Akkad."<br><br><em># 提取信息</em><br>entities = ner_pipeline(text)<br><br>print(entities)<br><em># 输出:</em><br><em># [{'entity': 'B-PER', 'score': 0.9999799728393555, 'index': 0, 'word': 'Sargon', 'start': 0, 'end': 6},</em><br><em># {'entity': 'B-LOC', 'score': 0.9999675750732422, 'index': 5, 'word': 'Akkad', 'start': 14, 'end': 19}]</em>
解释:
- 使用
1transformers
库创建信息抽取模型。
- 提取文本中的实体及其类型。
- 打印提取结果。
17. 关系抽取
关系抽取是从文本中识别实体之间的关系。
代码示例:
1 from transformers import pipeline<br><br><em># 创建关系抽取模型</em><br>re_pipeline = pipeline("relation-extraction", model="joeddav/xlm-roberta-large-xnli")<br><br><em># 示例文本</em><br>text = "Sargon was a king of Akkad."<br><br><em># 定义实体对</em><br>entity_pairs = [<br> {"entity": "Sargon", "offset": (0, 6)},<br> {"entity": "king", "offset": (10, 14)},<br> {"entity": "Akkad", "offset": (17, 22)}<br>]<br><br><em># 提取关系</em><br>relations = re_pipeline(text, entity_pairs)<br><br>print(relations)<br><em># 输出:</em><br><em># [{'score': 0.9999675750732422, 'entity': 'was a', 'label': 'is_a', 'entity_pair': {'entity_0': 'Sargon', 'entity_1': 'king'}, 'index': 0, 'confidence': 0.9999675750732422}]</em>
解释:
- 使用
1transformers
库创建关系抽取模型。
- 定义实体对。
- 提取实体之间的关系。
- 打印提取结果。
18. 文本聚类
文本聚类是将相似的文档归为一类的过程。
代码示例:
1 from sklearn.feature_extraction.text import TfidfVectorizer<br>from sklearn.cluster import KMeans<br>from sklearn.metrics import silhouette_score<br><br><em># 示例文本</em><br>documents = [<br> "Human machine interface for lab abc computer applications",<br> "A survey of user opinion of computer system response time",<br> "The EPS user interface management system",<br> "System and human system engineering testing of EPS",<br> "Relation of user perceived response time to error measurement",<br> "The generation of random binary unordered trees",<br> "The intersection graph of paths in trees",<br> "Graph minors IV Widths of trees and well quasi ordering",<br> "Graph minors A survey"<br>]<br><br><em># TF-IDF 向量化</em><br>vectorizer = TfidfVectorizer()<br>X = vectorizer.fit_transform(documents)<br><br><em># K-Means 聚类</em><br>kmeans = KMeans(n_clusters=2, random_state=42)<br>kmeans.fit(X)<br><br><em># 评估聚类质量</em><br>silhouette_avg = silhouette_score(X, kmeans.labels_)<br>print(f"Silhouette Score: {silhouette_avg:.2f}")<br><br><em># 打印聚类结果</em><br>for i, doc in enumerate(documents):<br> print(f"{doc} -> Cluster {kmeans.labels_[i]}")
解释:
- 使用
1TfidfVectorizer
对文档进行 TF-IDF 向量化。
- 使用
1KMeans
进行聚类。
- 评估聚类质量。
- 打印每个文档的聚类结果。
19. 事件检测
事件检测是从文本中识别特定事件的过程。
代码示例:
1 from transformers import pipeline<br><br><em># 创建事件检测模型</em><br>event_pipeline = pipeline("event-extraction", model="microsoft/layoutlmv2-base-uncased-finetuned-funsd")<br><br><em># 示例文本</em><br>text = "The company announced a new product launch on Monday."<br><br><em># 事件检测</em><br>events = event_pipeline(text)<br><br>print(events)<br><em># 输出:</em><br><em># [{'event_type': 'Product Launch', 'trigger': 'launch', 'trigger_start': 35, 'trigger_end': 40, 'arguments': [{'entity': 'company', 'entity_start': 4, 'entity_end': 10, 'role': 'Company'}, {'entity': 'Monday', 'entity_start': 38, 'entity_end': 44, 'role': 'Date'}]}]</em>
解释:
- 使用
1transformers
库创建事件检测模型。
- 提取文本中的事件及其触发词和参数。
- 打印事件检测结果。
20. 词性标注
词性标注是将文本中的每个单词标记为其对应的词性。
代码示例:
1 from nltk import pos_tag<br>from nltk.tokenize import word_tokenize<br><br><em># 示例文本</em><br>text = "John likes to watch movies. Mary likes movies too."<br><br><em># 分词</em><br>tokens = word_tokenize(text)<br><br><em># 词性标注</em><br>tagged_tokens = pos_tag(tokens)<br><br>print(tagged_tokens)<br><em># 输出:</em><br><em># [('John', 'NNP'), ('likes', 'VBZ'), ('to', 'TO'), ('watch', 'VB'), ('movies', 'NNS'), ('.', '.'), ('Mary', 'NNP'), ('likes', 'VBZ'), ('movies', 'NNS'), ('too', 'RB'), ('.', '.')]</em>
解释:
- 使用
1nltk
库进行分词。
- 使用
1pos_tag
进行词性标注。
- 打印标注结果。
21. 依存句法分析
依存句法分析是分析句子中词与词之间的依存关系。
代码示例:
1 import spacy<br><br><em># 加载预训练模型</em><br>nlp = spacy.load("en_core_web_sm")<br><br><em># 示例文本</em><br>text = "John likes to watch movies. Mary likes movies too."<br><br><em># 处理文本</em><br>doc = nlp(text)<br><br><em># 依存句法分析</em><br>for token in doc:<br> print(token.text, token.dep_, token.head.text, token.head.pos_,<br> [child for child in token.children])<br><br><em># 输出:</em><br><em># John nsubj likes VERB []</em><br><em># likes ROOT likes VERB [to]</em><br><em># to mark likes VERB [watch]</em><br><em># watch xcomp likes VERB []</em><br><em># movies dobj likes VERB []</em><br><em># . punct likes PUNCT []</em><br><em># Mary nsubj likes VERB []</em><br><em># likes ROOT likes VERB []</em><br><em># movies dobj likes VERB []</em><br><em># too advmod likes VERB []</em><br><em># . punct likes PUNCT []</em>
解释:
- 使用
1spacy
库进行依存句法分析。
- 打印每个词的依存关系及其父节点和子节点。
22. 语法树构建
语法树构建是将句子的语法结构表示为树状结构。
代码示例:
1 import nltk<br>from nltk import Tree<br><br><em># 示例文本</em><br>text = "John likes to watch movies. Mary likes movies too."<br><br><em># 分词</em><br>tokens = nltk.word_tokenize(text)<br><br><em># 词性标注</em><br>tagged_tokens = nltk.pos_tag(tokens)<br><br><em># 构建语法树</em><br>grammar = "NP: {<DT>?<JJ>*<NN>}"<br>cp = nltk.RegexpParser(grammar)<br>result = cp.parse(tagged_tokens)<br><br><em># 显示语法树</em><br>result.draw()
解释:
- 使用
1nltk
库进行分词和词性标注。
- 使用正则表达式构建语法树。
- 使用
1draw
方法显示语法树。
23. 词性转换
词性转换是将一个词从一种词性转换为另一种词性。
代码示例:
1 from nltk.stem import WordNetLemmatizer<br>from nltk.corpus import wordnet<br><br><em># 示例文本</em><br>text = "running dogs are barking loudly."<br><br><em># 分词</em><br>tokens = text.split()<br><br><em># 词性转换</em><br>lemmatizer = WordNetLemmatizer()<br>converted_tokens = []<br><br>for token in tokens:<br> <em># 获取词性</em><br> pos = wordnet.NOUN if token.endswith('ing') else wordnet.VERB<br> converted_token = lemmatizer.lemmatize(token, pos=pos)<br> converted_tokens.append(converted_token)<br><br>print(converted_tokens)<br><em># 输出:</em><br><em># ['run', 'dog', 'are', 'bark', 'loudli', '.']</em>
解释:
- 使用
1WordNetLemmatizer
进行词性转换。
- 根据词尾判断词性。
- 打印转换后的结果。
实战案例:情感分析在电商评论中的应用
假设我们正在为一家电商平台开发一个情感分析系统,用于自动分析用户评论的情感倾向。具体步骤如下:
1. 数据收集:
- 收集电商平台上的用户评论数据。
2. 数据预处理:
- 清洗文本数据,去除无关信息。
- 分词并去除停用词。
3. 情感分析:
- 使用
1SentimentIntensityAnalyzer
进行情感分析。
- 计算每个评论的情感得分。
4. 结果展示:
- 将分析结果可视化,展示正面、负面和中性评论的比例。
代码示例:
1 import pandas as pd<br>from nltk.sentiment import SentimentIntensityAnalyzer<br>import matplotlib.pyplot as plt<br><br><em># 加载评论数据</em><br>data = pd.read_csv('reviews.csv')<br>comments = data['comment'].tolist()<br><br><em># 情感分析</em><br>sia = SentimentIntensityAnalyzer()<br><br>sentiments = []<br>for comment in comments:<br> sentiment_scores = sia.polarity_scores(comment)<br> sentiments.append(sentiment_scores['compound'])<br><br><em># 计算情感类别</em><br>positive_count = sum(1 for score in sentiments if score > 0)<br>negative_count = sum(1 for score in sentiments if score < 0)<br>neutral_count = sum(1 for score in sentiments if score == 0)<br><br><em># 可视化结果</em><br>labels = ['Positive', 'Negative', 'Neutral']<br>sizes = [positive_count, negative_count, neutral_count]<br><br>plt.figure(figsize=(8, 8))<br>plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=140)<br>plt.title('Sentiment Analysis of Product Reviews')<br>plt.show()
解释:
- 使用
1pandas
库加载评论数据。
- 使用
1SentimentIntensityAnalyzer
计算每个评论的情感得分。
- 统计正面、负面和中性评论的数量。
- 使用
1matplotlib
绘制饼图展示结果。