「自然言語処理の解説:自然言語処理の基礎と技術を初心者向けに紹介するガイド」
Introduction to Natural Language Processing A beginner's guide to the basics and techniques of natural language processing.
自然言語処理(NLP)は、機械学習の中でも非常に興味深い分野であり、機械が人間の言語を理解し、解釈し、理解し、生成することができるようにする技術です。これは、コンピュータがテキストや音声の形式で人間の言語を読み、理解し、応答することを可能にする技術です。まるで機械に私たちの言語を話し、創造的で矛盾のない文脈に即した応答を生成することを教えるようなものです。この記事では、ChatGPTや現在広まっているさまざまな生成型AIシステムの基礎となる技術の基本用語、用語、および基礎について説明します。
主要な用語は以下の通りです:
ドキュメント
テキストの一部であり、単一の文から完全な書籍までさまざまな範囲に及ぶことがあります。
コーパス
NLPの分析やトレーニングに使用されるドキュメントのコレクション。
corpus = ["これは最初のドキュメントです。", "ここにもう1つのドキュメントがあります。", "そしてもう1つ。"]
語彙
コーパス内のすべてのユニークな単語の集合。
from collections import Countercorpus = ["これは最初のドキュメントです。", "ここにもう1つのドキュメントがあります。", "そしてもう1つ。"]words = ' '.join(corpus).lower().split()vocabulary = set(words)print("語彙:", vocabulary)
語彙: {'document.', 'document', 'first', 'a', 'another', 'and', 'third', 'this', 'here.', 'is', 'the', 'one.'}
セグメンテーション
テキストを意味のあるセグメント(文や段落など)に分割するプロセス。
トークン化
テキストを単語やサブワード(トークン)などのより小さな単位に分割すること。
from nltk.tokenize import word_tokenizetext = "トークン化はNLPにおける重要なステップです。"tokens = word_tokenize(text)print("トークン:", tokens)
トークン: ['トークン化', 'は', 'NLP', 'における', '重要', 'な', 'ステップ', 'です', '。']
ストップワード
NLPの分析では通常除外される一般的に使用される単語(例:「and」、「the」、「is」)。
from nltk.corpus import stopwordsstop_words = set(stopwords.words('english'))print("ストップワード:", stop_words)
ストップワード: {'he', 'once', 'm', 'this', "that'll", 'their', 'the', "she's", "you've", "hadn't", 'mightn', 'down', 'off', 'now', "shouldn't", 't', "isn't", 'that', "didn't", 'wasn', 'do', 'shan', 'yourselves', 'a', 've', 'themselves', 'out', "don't", 'hasn', 'than', 'couldn', "mightn't", "you'd", 'further', 'has', 'having', "wouldn't", 'here', 'him', 'from', 'where', 'your', 'these', 'my', 'up', 'so', 'have', 'hadn', "weren't", 'to', 'hers', 'doesn', 'below', "needn't", 're', "you're", 'when', 'whom', 'all', 'is', 'should', 'not', 'were', 'you', 'until', 'doing', "mustn't", "it's", 'because', 'y', 'her', 'both', 'o', 'weren', 'other', 'on', 'his', "shan't", 'why', 'through', 'between', 'am', 'be', 'she', 'more', 'herself', "couldn't", "doesn't", "aren't", 'which', 'won', 'of', 'don', 'some', 'was', 'under', 'few', 'needn', 'ours', 'theirs', 'it', 'aren', 'and', 'own', 'isn', 'about', 'such', 'again', 'its', 'any', 'by', 'mustn', 'had', 's', 'can', 'haven', 'before', 'over', 'those', 'during', 'while', "wasn't", 'we', 'each', 'being', 'then', 'against', 'me', "should've", 'd', 'after', 'didn', 'as', 'll', "haven't", 'wouldn', 'there', 'an', 'been', 'ourselves', "you'll", 'what', 'if', 'in', 'shouldn', 'for', 'with', 'just', 'how', 'who', 'them', 'are', 'but', 'no', 'ain', 'very', 'ma', 'same', 'above', 'into', 'himself', 'did', 'myself', 'most', 'only', 'will', 'our', 'they', 'nor', 'yours', 'at', 'too', "hasn't", 'itself', 'or', "won't", 'does', 'i', 'yourself'}
ステミング
単語を基本形または語幹形に縮約すること。
from nltk.stem import PorterStemmerstemmer = PorterStemmer()word = "running"stemmed_word = stemmer.stem(word)print("ステミングされた単語:", stemmed_word)
ステミングされた単語: run
レンマ化
文脈を考慮して単語を基本形(レンマ)に縮約すること。
from nltk.stem import WordNetLemmatizerlemmatizer = WordNetLemmatizer()word = "Raqib loves coding and dancing."lemmatized_word = lemmatizer.lemmatize(word)print("レンマ化された単語:", lemmatized_word)
POSタギング(品詞タギング)
文中の各単語に品詞(名詞、動詞、形容詞など)を割り当てること。
from nltk import pos_tagfrom nltk.tokenize import word_tokenizesentence = "The cat is on the mat"tokens = word_tokenize(sentence)pos_tags = pos_tag(tokens)print("POSタグ:", pos_tags)
POSタグ: [('The', 'DT'), ('cat', 'NN'), ('is', 'VBZ'), ('on', 'IN'), ('the', 'DT'), ('mat', 'NN')]
('The', 'DT')
: ‘The’は限定詞(DT)です。('cat', 'NN')
: ‘cat’は名詞(NN)です。('is', 'VBZ')
: ‘is’は動詞、三人称単数現在形(VBZ)です。('on', 'IN')
: ‘on’は前置詞または従属接続詞(IN)です。('the', 'DT')
: ‘the’は限定詞(DT)です。('mat', 'NN')
: ‘mat’は名詞(NN)です。
BoW(Bag of Words)
文書内の単語の頻度を数えることで、文法や単語の順序を無視したテキストの表現方法。
from sklearn.feature_extraction.text import CountVectorizercorpus = ["This is the first document.", "Another document here.", "And a third one."]vectorizer = CountVectorizer()bow_representation = vectorizer.fit_transform(corpus)print("BoW表現:\n", bow_representation.toarray())print("語彙:", vectorizer.get_feature_names())
TF-IDF(Term Frequency-Inverse Document Frequency)
コーパスの頻度に基づいて、文書内の単語の重要性を重み付けする手法。
from sklearn.feature_extraction.text import TfidfVectorizercorpus = ["This is the first document.", "Another document here.", "And a third one."]vectorizer = TfidfVectorizer()tfidf_representation = vectorizer.fit_transform(corpus)print("TF-IDF表現:\n", tfidf_representation.toarray())print("語彙:", vectorizer.get_feature_names())
TF-IDF表現: [[0. 0. 0.35543247 0.46735098 0. 0.46735098 0. 0.46735098 0. 0.46735098] [0. 0.62276601 0.4736296 0. 0.62276601 0. 0. 0. 0. 0. ] [0.57735027 0. 0. 0. 0. 0. 0.57735027 0. 0.57735027 0. ]]語彙: ['and', 'another', 'document', 'first', 'here', 'is', 'one', 'the', 'third', 'this']
テキスト前処理のステップ
基本的なNLPの手法を用いて、テキスト文字列を前処理します。
テキストを小文字に変換します。
sample_text = "NLP is an exciting field! It enables machines to comprehend, interpret, and generate human language. Learn more at https://raqibcodes.com. #NLP #MachineLearning @NLPCommunity 2023303"# テキストを小文字に変換def convert_to_lowercase(text): return text.lower()# 小文字の変換を適用lowercased_text = convert_to_lowercase(sample_text)print("小文字化されたテキスト:", lowercased_text)
小文字化されたテキスト: nlp is an exciting field! it enables machines to comprehend, interpret, and generate human language. learn more at https://raqibcodes.com. #nlp #machinelearning @nlpcommunity 2023303
特殊文字を削除します。
def remove_special_characters(text): # URL、ハッシュタグ、メンション、特殊文字を削除します text = re.sub(r"http\S+|www\S+|@\w+|#\w+", "", text) text = re.sub(r"[^\w\s.]", "", text) return text# 特殊文字を削除したテキストを適用text_no_special_chars = remove_special_characters(lowercased_text)print("特殊文字を削除したテキスト:", text_no_special_chars)
特殊文字を削除したテキスト: 自然言語処理は興味深い分野で、機械が人間の言語を理解、解釈、生成することができます。詳しくはこちらをご覧ください。2023303
数字と桁を削除します。
def remove_numbers(text): # 数字/桁を削除します text = re.sub(r'\d+(\.\d+)?', '', text) return text# 数字/桁を削除したテキストを適用text_no_numbers = remove_numbers(text_no_special_chars)print("数字/桁を削除したテキスト:", text_no_numbers)
数字/桁を削除したテキスト: 自然言語処理は興味深い分野で、機械が人間の言語を理解、解釈、生成することができます。詳しくはこちらをご覧ください。
テキストをトークン化します。
from nltk.tokenize import word_tokenizedef tokenize_text(text): # テキストをトークン化します tokens = word_tokenize(text) return tokens# トークン化を適用tokens = tokenize_text(text_no_numbers)print("トークン:", tokens)
トークン: ['自然言語処理', 'は', '興味深い', '分野', 'で', '、', '機械', 'が', '人間', 'の', '言語', 'を', '理解', '、', '解釈', '、', '生成', 'する', 'こと', 'が', 'できます', '。', '詳しく', 'は', 'こちら', 'を', 'ご覧', 'ください', '。']
ストップワードを削除します。
from nltk.corpus import stopwordsdef remove_stopwords(tokens): # ストップワードを削除します stop_words = set(stopwords.words('english')) tokens = [token for token in tokens if token not in stop_words] return tokens# ストップワードを削除したトークンを適用tokens_no_stopwords = remove_stopwords(tokens)print("ストップワードを削除したトークン:", tokens_no_stopwords)
ストップワードを削除したトークン: ['自然言語処理', '興味深い', '分野', '機械', '人間', '言語', '理解', '解釈', '生成', 'できます', '。', '詳しく', 'こちら', 'ご覧', 'ください', '。']
単語を原形に戻します。
from nltk.stem import WordNetLemmatizerdef lemmatize_words(tokens): # 単語を原形に戻します lemmatizer = WordNetLemmatizer() tokens = [lemmatizer.lemmatize(token) for token in tokens] return tokens# 原形に戻したトークンを適用lemmatized_tokens = lemmatize_words(tokens_no_stopwords)print("原形に戻したトークン:", lemmatized_tokens)
原形に戻したトークン: ['自然言語処理', '興味深い', '分野', '機械', '人間', '言語', '理解', '解釈', '生成', 'できます', '。', '詳しく', 'こちら', 'ご覧', 'ください', '。']
ステミングを適用します。
from nltk.stem import PorterStemmerdef apply_stemming(tokens): # ステミングを適用します stemmer = PorterStemmer() stemmed_tokens = [stemmer.stem(token) for token in tokens] return stemmed_tokens# ステミングを適用したトークンを適用stemmed_tokens = apply_stemming(lemmatized_tokens)print("ステミングを適用したトークン:", stemmed_tokens)
ステミングを適用したトークン: ['自然言語処理', '興味深い', '分野', '機械', '人間', '言語', '理解', '解釈', '生成', 'できます', '。', '詳しく', 'こちら', 'ご覧', 'ください', '。']
トークンを一つの文字列に結合します。
def join_tokens(tokens): # トークンを一つの文字列に結合します return ' '.join(tokens)# トークンを一つの文字列に結合した前処理済みテキストを適用preprocessed_text = join_tokens(lemmatized_tokens)print("前処理済みテキスト:", preprocessed_text)
前処理済みテキスト: 自然言語処理 興味深い 分野 機械 人間 言語 理解 解釈 生成 できます 。 詳しく こちら ご覧 ください 。
POSタグ付けを適用します。
from nltk import pos_tagdef pos_tagging(tokens): # POSタグ付けを実行します pos_tags = pos_tag(tokens) return pos_tags# POSタグ付けを適用pos_tags = pos_tagging(lemmatized_tokens)print("POSタグ:", pos_tags)
POSタグ: [('自然言語処理', 'RB'), ('興味深い', 'JJ'), ('分野', 'NN'), ('機械', 'NNS'), ('人間', 'NN'), ('言語', 'VBP'), ('理解', 'JJ'), ('解釈', 'NN'), ('生成', 'JJ'), ('できます', 'NN'), ('。', '.'), ('詳しく', 'VB'), ('こちら', 'JJ'), ('ご覧', 'NN'), ('ください', 'VB'), ('。', 'NN')]
タグの意味
('nlp', 'RB')
: ‘nlp’ は副詞 (RB) としてタグ付けされています。('exciting', 'JJ')
: ‘exciting’ は形容詞 (JJ) です。('field', 'NN')
: ‘field’ は名詞 (NN) です。('enables', 'NNS')
: ‘enables’ は複数形名詞 (NNS) です。('machine', 'NN')
: ‘machine’ は名詞 (NN) です。('comprehend', 'VBP')
: ‘comprehend’ は動詞の基本形 (VBP) です。('interpret', 'JJ')
: ‘interpret’ は形容詞 (JJ) です。('generate', 'NN')
: ‘generate’ は名詞 (NN) です。('human', 'JJ')
: ‘human’ は形容詞 (JJ) です。('language', 'NN')
: ‘language’ は名詞 (NN) です。('.', '.')
: ‘.’ は句読点 (ピリオド) です。('learn', 'VB')
: ‘learn’ は動詞の基本形 (VB) です。
Bag of Words 表現を適用します。
from sklearn.feature_extraction.text import CountVectorizerdef bag_of_words_representation(text): # CountVectorizer を初期化 vectorizer = CountVectorizer() # テキストを Bag of Words 表現に変換 bow_representation = vectorizer.fit_transform([text]) return bow_representation, vectorizer# Bag of Words 表現を適用しますbow_representation, vectorizer = bag_of_words_representation(preprocessed_text)print("Bag of Words 表現:")print(bow_representation.toarray())print("ボキャブラリー:", vectorizer.get_feature_names())
TF-IDF 表現を適用します。
from sklearn.feature_extraction.text import TfidfVectorizerdef tfidf_representation(text): # TfidfVectorizer を初期化 vectorizer = TfidfVectorizer() # テキストを TF-IDF 表現に変換 tfidf_representation = vectorizer.fit_transform([text]) return tfidf_representation, vectorizer# TF-IDF 表現を適用しますtfidf_representation, tfidf_vectorizer = tfidf_representation(preprocessed_text)print("\nTF-IDF 表現:")print(tfidf_representation.toarray())print("ボキャブラリー:", tfidf_vectorizer.get_feature_names())
Natural Language Processing (NLP) は人間の言語と機械の間の橋です。この記事では、’corpus’、’vocabulary’ のような基本的な用語、および ‘tokenization’、’lemmatization’、’POS tagging’ などのキーとなる技術について説明しました。これらは高度な NLP アプリケーションの構築ブロックであり、AI をより人間らしい相互作用に向けて進化させるものです。
読んでいただきありがとうございます🤓。上記の技術だけでなく、より高度な技術を適用した NLP プロジェクトを私が取り組んだ GitHub リポジトリもご覧いただけます。乾杯!
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles