テキストの自然蚀語凊理の基本

自然蚀語凊理は珟圚、非垞に保守的なセクタヌを陀いお䜿甚されおいたせん。 ほずんどの技術的゜リュヌションでは、「人間の」蚀語の認識ず凊理が長い間導入されおいたす。そのため、ハヌドコヌドされた応答オプションを備えた通垞のIVRは埐々に過去のものになり、チャットボットはラむブオペレヌタヌの参加なしでより適切に通信し始めおいたす、メヌルフィルタヌは匷打で動䜜したす 録音された音声、぀たりテキストの認識はどうですか むしろ、珟代の認識および凊理技術の基瀎は䜕でしょうか 私たちの今日の適応翻蚳はこれによく反応したす-カットの䞋で、NLPの基本のギャップを埋める長い道のりを芋぀けるでしょう。 玠敵な読曞を



自然蚀語凊理ずは䜕ですか


自然蚀語凊理以䞋NLPず呌びたす-自然蚀語凊理は、コンピュヌタヌが自然人間蚀語を分析する方法に専念するコンピュヌタヌサむ゚ンスずAIのサブセクションです。 NLPでは、テキストず音声に機械孊習アルゎリズムを䜿甚できたす。

たずえば、NLPを䜿甚しお、音声認識、ドキュメントの䞀般化、機械翻蚳、スパム怜出、名前付き゚ンティティの認識、質問ぞの回答、オヌトコンプリヌト、予枬テキスト入力などのシステムを䜜成できたす。

今日、私たちの倚くは音声認識スマヌトフォンを持っおいたす-圌らは私たちの音声を理解するためにNLPを䜿甚しおいたす。 たた、倚くの人々はOSに組み蟌たれた音声認識を備えたラップトップを䜿甚しおいたす。

䟋


コルタナ




Windowsには、音声を認識するCortana仮想アシスタントがありたす。 Cortanaを䜿甚するず、リマむンダヌを䜜成したり、アプリケヌションを開いたり、手玙を送ったり、ゲヌムをしたり、倩気を調べたりするこずができたす。

シリ



SiriはAppleのOSiOS、watchOS、macOS、HomePod、tvOSのアシスタントです。 倚くの機胜は音声制埡でも機胜したす誰かに電話をかけたり、曞いたり、メヌルを送信したり、タむマヌを蚭定したり、写真を撮ったりなど。

Gmail




よく知られおいる電子メヌルサヌビスは、スパムを怜出しお受信トレむの受信トレむに届かないようにする方法を知っおいたす。

Dialogflow



NLPボットを䜜成できるGoogleのプラットフォヌム。 たずえば、泚文を受け入れるために昔ながらのIVRを必芁ずしないピザ泚文ボットを䜜成できたす 。



NLTK Pythonラむブラリ


NLTKNatural Language Toolkitは、PythonでNLPプログラムを䜜成するための䞻芁なプラットフォヌムです。 倚くの蚀語コヌパスの䜿いやすいむンタヌフェむスず、分類、トヌクン化、 ステミング 、 マヌクアップ 、フィルタリング、 セマンティック掚論のためのワヌドプロセッシング甚のラむブラリがありたす。 たあ、これもコミュニティの助けを借りお開発されおいる無料のオヌプン゜ヌスプロゞェクトです。
このツヌルを䜿甚しお、NLPの基本を瀺したす。 以降のすべおの䟋では、NLTKが既にむンポヌトされおいるず想定しおいたす。 これはimport nltk実行できたす

テキストのNLPの基本


この蚘事では、次のトピックに぀いお説明したす。

  1. オファヌによるトヌクン化。
  2. 単語によるトヌクン化。
  3. テキストの補題ずスタンプ 。
  4. ストップワヌド。
  5. 正芏衚珟。
  6. 蚀葉の袋 。
  7. TF-IDF

1.オファヌによるトヌクン化


文のトヌクン化堎合によっおはセグメンテヌションは、蚘述蚀語をコンポヌネント文に分割するプロセスです。 アむデアは非垞にシンプルに芋えたす。 英語や他のいく぀かの蚀語では、特定の句読点、぀たりピリオドを芋぀けるたびに文を分離できたす。

しかし、英語でも、このタスクは略語でも䜿甚されるため、このタスクは簡単ではありたせん。 略語衚は、ワヌドプロセッシング䞭に文の境界を誀っお配眮しないようにするのに非垞に圹立ちたす。 ほずんどの堎合、これにはラむブラリが䜿甚されるため、実装の詳现を心配する必芁はありたせん。

䟋

バックギャモンボヌドゲヌムに぀いおの短いテキストを受け取りたす。

 Backgammon is one of the oldest known board games. Its history can be traced back nearly 5,000 years to archeological discoveries in the Middle East. It is a two player game where each player has fifteen checkers which move between twenty-four points according to the roll of two dice. 

NLTKを䜿甚しおトヌクン化を提䟛するには、 nltk.sent_tokenizeメ゜ッドを䜿甚できたす

text = "Backgammon is one of the oldest known board games. Its history can be traced back nearly 5,000 years to archeological discoveries in the Middle East. It is a two player game where each player has fifteen checkers which move between twenty-four points according to the roll of two dice."
sentences = nltk.sent_tokenize(text)
for sentence in sentences:
print(sentence)
print()

出口で、3぀の個別の文を取埗したす。

 Backgammon is one of the oldest known board games. Its history can be traced back nearly 5,000 years to archeological discoveries in the Middle East. It is a two player game where each player has fifteen checkers which move between twenty-four points according to the roll of two dice. 

2.蚀葉によるトヌクン化


単語によるトヌクン化堎合によっおはセグメンテヌションは、文を構成芁玠の単語に分割するプロセスです。 特定のバヌゞョンのラテンアルファベットを䜿甚する英語および他の倚くの蚀語では、スペヌスが適切な単語区切り文字です。

ただし、スペヌスのみを䜿甚するず問題が発生する可胜性がありたす。英語では、耇合名詞は異なる方法で蚘述され、堎合によっおはスペヌスで区切られたす。 ここでも、ラむブラリが圹立ちたす。

䟋

前の䟋の文を取り、 nltk.word_tokenizeメ゜ッドをそれらに適甚しおみたしょう

for sentence in sentences:
words = nltk.word_tokenize(sentence)
print(words)
print()
view raw word tokenization.py hosted with ❀ by GitHub

結論

 ['Backgammon', 'is', 'one', 'of', 'the', 'oldest', 'known', 'board', 'games', '.'] ['Its', 'history', 'can', 'be', 'traced', 'back', 'nearly', '5,000', 'years', 'to', 'archeological', 'discoveries', 'in', 'the', 'Middle', 'East', '.'] ['It', 'is', 'a', 'two', 'player', 'game', 'where', 'each', 'player', 'has', 'fifteen', 'checkers', 'which', 'move', 'between', 'twenty-four', 'points', 'according', 'to', 'the', 'roll', 'of', 'two', 'dice', '.'] 

3.テキストの補題ずスタンプ


通垞、テキストには同じ単語の異なる文法圢匏が含たれおおり、ルヌト語が1぀ある堎合もありたす。 語圙化ずステミングは、出䌚うすべおの単語圢匏を単䞀の通垞の語圙圢匏にするこずを目的ずしおいたす。

䟋

さたざたな単語圢匏を1぀にたずめる

 dog, dogs, dog's, dogs' => dog 

同じですが、文党䜓を参照したす

 the boy's dogs are different sizes => the boy dog be differ size 

補題ずステミングは、正芏化の特殊なケヌスであり、異なりたす。

ステミングは、単語の語根から「過剰」をカットする粗いヒュヌリスティックなプロセスであり、倚くの堎合、これは単語構築接尟蟞の損倱に぀ながりたす。

語圙化は、語圙ず圢態玠解析を䜿甚しお、最終的に単語をその暙準的な圢匏、぀たり補題に導く、より埮劙なプロセスです。

違いは、ステマヌステミングアルゎリズムの特定の実装-翻蚳者コメントがコンテキストを知らなくおも動䜜するため、品詞によっお意味が異なる単語の違いを理解しないこずです。 ただし、ステマヌには独自の利点がありたす。実装が簡単で、動䜜が高速です。 さらに、「粟床」の䜎䞋は堎合によっおは問題になりたせん。

䟋

  1. goodずいう蚀葉は、betterずいう蚀葉の補題です。 ここでは蟞曞を調べる必芁があるため、Stemmerはこの接続を認識したせん。
  2. 蚀葉遊びは蚀葉遊びの基本的な圢です。 ここでは、ステミングず補題の䞡方が察凊したす。
  3. 䌚合ずいう蚀葉は、文脈に応じお、名詞の通垞の圢たたは䌚う動詞の圢のいずれかです。 ステミングずは異なり、補題化はコンテキストに基づいお正しい補題を遞択しようずしたす。

違いがわかったので、䟋を芋おみたしょう。

from nltk.stem import PorterStemmer, WordNetLemmatizer
from nltk.corpus import wordnet
def compare_stemmer_and_lemmatizer(stemmer, lemmatizer, word, pos):
"""
Print the results of stemmind and lemmitization using the passed stemmer, lemmatizer, word and pos (part of speech)
"""
print("Stemmer:", stemmer.stem(word))
print("Lemmatizer:", lemmatizer.lemmatize(word, pos))
print()
lemmatizer = WordNetLemmatizer()
stemmer = PorterStemmer()
compare_stemmer_and_lemmatizer(stemmer, lemmatizer, word = "seen", pos = wordnet.VERB)
compare_stemmer_and_lemmatizer(stemmer, lemmatizer, word = "drove", pos = wordnet.VERB)

結論

 Stemmer: seen Lemmatizer: see Stemmer: drove Lemmatizer: drive 

4.ストップワヌド




ストップワヌドは、テキスト凊理の前埌にテキストからスロヌされるワヌドです。 機械孊習をテキストに適甚するず、そのような単語は倚くのノむズを远加する可胜性があるため、無関係な単語を取り陀く必芁がありたす。

ストップワヌドは通垞、セマンティックロヌドを持たない蚘事、間投詞、共甚䜓などによっお理解されたす。 ストップワヌドの䞀般的なリストはなく、すべお特定のケヌスに䟝存するこずを理解しおください。

NLTKには、ストップワヌドの定矩枈みリストがありたす。 初めお䜿甚する前に、 nltk.download(“stopwords”)をダりンロヌドする必芁がありたす。 ダりンロヌド埌、 stopwordsパッケヌゞをむンポヌトしお、単語自䜓を確認できたす。

from nltk.corpus import stopwords
print(stopwords.words("english"))
view raw stop words.py hosted with ❀ by GitHub

結論

 ['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', "you're", "you've", "you'll", "you'd", 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', "she's", 'her', 'hers', 'herself', 'it', "it's", 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', "that'll", 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', "don't", 'should', "should've", 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', "aren't", 'couldn', "couldn't", 'didn', "didn't", 'doesn', "doesn't", 'hadn', "hadn't", 'hasn', "hasn't", 'haven', "haven't", 'isn', "isn't", 'ma', 'mightn', "mightn't", 'mustn', "mustn't", 'needn', "needn't", 'shan', "shan't", 'shouldn', "shouldn't", 'wasn', "wasn't", 'weren', "weren't", 'won', "won't", 'wouldn', "wouldn't"] 

文からストップワヌドを削陀する方法を怜蚎しおください。

stop_words = set(stopwords.words("english"))
sentence = "Backgammon is one of the oldest known board games."
words = nltk.word_tokenize(sentence)
without_stop_words = [word for word in words if not word in stop_words]
print(without_stop_words)
view raw stop words example 1.py hosted with ❀ by GitHub

結論

 ['Backgammon', 'one', 'oldest', 'known', 'board', 'games', '.'] 

リストの理解に慣れおいない堎合は、 こちらをご芧ください 。 同じ結果を埗る別の方法を次に瀺したす。

stop_words = set(stopwords.words("english"))
sentence = "Backgammon is one of the oldest known board games."
words = nltk.word_tokenize(sentence)
without_stop_words = []
for word in words:
if word not in stop_words:
without_stop_words.append(word)
print(without_stop_words)
view raw stop words example 2.py hosted with ❀ by GitHub

ただし、リストの内包衚蚘は最適化されおいるため高速です。むンタヌプリタヌはルヌプ䞭に予枬パタヌンを明らかにしたす。

リストを倚数に倉換した理由を尋ねるかもしれたせん。 セットは、䞀意の倀を未定矩の順序で栌玍できる抜象デヌタ型です。 耇数の怜玢は、リスト怜玢よりもはるかに高速です。 少数の単語の堎合、これは重芁ではありたせんが、倚数の単語に぀いお話しおいる堎合は、セットを䜿甚するこずを匷くお勧めしたす。 さたざたな操䜜を実行するのにかかる時間に぀いおもう少し知りたい堎合は、 この玠晎らしいチヌトシヌトをご芧ください。

5.正芏衚珟。



正芏衚珟regular、regexp、regexは、怜玢パタヌンを定矩する䞀連の文字です。 䟋


Pythonドキュメントからの抜粋
正芏衚珟では、バックスラッシュ(\)を䜿甚しお、特殊な圢匏を瀺したり、特殊文字の䜿甚を蚱可したりしたす。 これは、Pythonでバックスラッシュを䜿甚するこずに反したす。たずえば、文字通りバックスラッシュを瀺すには、怜玢パタヌンずしお'\\\\'を蚘述する必芁があり'\\\\' 。

解決策は、怜玢パタヌンに生の文字列衚蚘を䜿甚するこずです。 プレフィックス'r'䜿甚した堎合、バックスラッシュは特別に凊理されたせん。 したがっお、 r”\n”は2文字('\' 'n')の文字列であり、 “\n”は1文字改行の文字列です。
正芏衚珟を䜿甚しお、テキストをさらにフィルタリングできたす。 たずえば、単語以倖のすべおの文字を削陀できたす。 倚くの堎合、句読点は䞍芁であり、垞連の助けを借りお簡単に削陀できたす。

Pythonのreモゞュヌルは、正芏衚珟操䜜を衚したす。 re.sub関数を䜿甚しお、怜玢パタヌンに適合するすべおのものを指定された文字列に眮き換えるこずができたす。 したがっお、すべおの非単語をスペヌスに眮き換えるこずができたす。

import re
sentence = "The development of snowboarding was inspired by skateboarding, sledding, surfing and skiing."
pattern = r"[^\w]"
print(re.sub(pattern, " ", sentence))
view raw regex substitute.py hosted with ❀ by GitHub

結論

 'The development of snowboarding was inspired by skateboarding sledding surfing and skiing ' 

レギュラヌは、はるかに耇雑なパタヌンを䜜成するために䜿甚できる匷力なツヌルです。 正芏衚珟に぀いお詳しく知りたい堎合は、これら2぀のWebアプリケヌション、 regex 、 regex101をお勧めしたす。

6.蚀葉の袋



機械孊習アルゎリズムは生のテキストを盎接凊理できないため、テキストを䞀連の数倀ベクトルに倉換する必芁がありたす。 これは特城抜出ず呌ばれたす 。

ワヌドバッグは、テキストを操䜜するずきに䜿甚される䞀般的なシンプルな特城抜出手法です。 テキスト内の各単語の出珟を説明したす。

モデルを䜿甚するには、次のものが必芁です。

  1. 既知の単語トヌクンの蟞曞を定矩したす。
  2. 有名な単語の存圚床を遞択したす。

単語の順序たたは構造に関する情報は無芖されたす。 それが蚀葉のバッグず呌ばれる理由です。 このモデルは、おなじみの単語がドキュメントに珟れるかどうかを理解しようずしたすが、正確にどこで発生するかを知りたせん。

盎感は、 同様のドキュメントが同様の内容を持っおいるこずを瀺唆したす 。 たた、コンテンツのおかげで、ドキュメントの意味に぀いお䜕かを孊ぶこずができたす。

䟋
このモデルを䜜成する手順を怜蚎しおください。 モデルがどのように機胜するかを理解するために、4぀の文のみを䜿甚したす。 実際には、より倚くのデヌタに遭遇したす。

1.デヌタをダりンロヌドする



これがデヌタであり、配列ずしおロヌドするこずを想像しおください。

 I like this movie, it's funny. I hate this movie. This was awesome! I like it. Nice one. I love it. 

これを行うには、ファむルを読み取り、行で分割したす。

with open("simple movie reviews.txt", "r") as file:
documents = file.read().splitlines()
print(documents)

結論

 ["I like this movie, it's funny.", 'I hate this movie.', 'This was awesome! I like it.', 'Nice one. I love it.'] 


2.蟞曞を定矩する



倧文字ず小文字、句読点、1文字のトヌクンを無芖しお、読み蟌たれた4぀の文からすべおの䞀意の単語を収集したす。 これが私たちの蟞曞有名な蚀葉になりたす。

蟞曞を䜜成するには、sklearnラむブラリヌのCountVectorizerクラスを䜿甚できたす。 次のステップに進みたす。

3.ドキュメントベクトルを䜜成する



次に、ドキュメント内の単語を評䟡する必芁がありたす。 このステップでの目暙は、生のテキストを䞀連の数字に倉えるこずです。 その埌、これらのセットを機械孊習モデルぞの入力ずしお䜿甚したす。 最も単玔なスコアリング方法は、単語の存圚に泚意するこずです。぀たり、単語がある堎合は1を、存圚しない堎合は0を入力したす。

これで、前述のCountVectorizerクラスを䜿甚しお単語の袋を䜜成できたす。

# Import the libraries we need
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
# Step 2. Design the Vocabulary
# The default token pattern removes tokens of a single character. That's why we don't have the "I" and "s" tokens in the output
count_vectorizer = CountVectorizer()
# Step 3. Create the Bag-of-Words Model
bag_of_words = count_vectorizer.fit_transform(documents)
# Show the Bag-of-Words Model as a pandas DataFrame
feature_names = count_vectorizer.get_feature_names()
pd.DataFrame(bag_of_words.toarray(), columns = feature_names)

結論


これらは私たちの提案です。 「単語の袋」モデルがどのように機胜するかがわかりたす。


蚀葉の袋に぀いおのいく぀かの蚀葉



このモデルの耇雑さは、蟞曞の決定方法ず単語の出珟回数のカりント方法です。

蟞曞のサむズが倧きくなるず、文曞ベクトルも倧きくなりたす。 䞊蚘の䟋では、ベクトルの長さは既知の単語の数に等しくなりたす。

堎合によっおは、信じられないほど倧量のデヌタを持぀こずができ、ベクトルは数千たたは数癟䞇の芁玠で構成されたす。 さらに、各ドキュメントには、蟞曞の単語のごく䞀郚しか含めるこずができたせん。

結果ずしお、ベクトル衚珟には倚くのれロがありたす。 倚くのれロを持぀ベクトルはスパヌスベクトルず呌ばれ、より倚くのメモリず蚈算リ゜ヌスが必芁です。

ただし、このモデルを䜿甚しおコンピュヌティングリ゜ヌスの芁件を枛らすず、既知の単語の数を枛らすこずができたす。 これを行うには、䞀連の単語を䜜成する前に既に怜蚎したものず同じ手法を䜿甚できたす。


蟞曞を䜜成する別のより耇雑な方法は、グルヌプ化された単語を䜿甚するこずです。 これにより、蟞曞のサむズが倉曎され、単語の袋にドキュメントに関する詳现が远加されたす。 このアプロヌチは「 N-gram 」ず呌ばれたす。

N-gramは、゚ンティティ単語、文字、数字、数字などのシヌケンスです。 蚀語本䜓のコンテキストでは、N-gramは通垞、䞀連の単語ずしお理解されたす。 ナニグラムは1ワヌド、バむグラムは2ワヌドのシヌケンス、トラむグラムは3ワヌドなどです。 数倀Nは、N-gramに含たれるグルヌプ化された単語の数を瀺したす。 考えられるすべおのN-gramがモデルに該圓するわけではなく、ケヌスに衚瀺されるN-gramのみが該圓したす。

䟋

次の文を考慮しおください。

 The office building is open today 

圌のバむグラムは次のずおりです。


ご芧のずおり、バむグラムのバッグは蚀葉のバッグよりも効果的なアプロヌチです。

単語の評䟡スコアリング

蟞曞を䜜成するずき、単語の存圚を評䟡する必芁がありたす。 単玔なバむナリアプロヌチを既に怜蚎しおいたす1-単語があり、0-単語がありたせん。

他の方法がありたす

  1. 数量。 文曞に各単語が出珟する回数が蚈算されたす。
  2. 頻床 テキスト内の各単語の出珟頻床単語の合蚈数に察しおが蚈算されたす。


7. TF-IDF


頻床スコアリングには問題がありたす。頻床が最も高い単語には、それぞれ最高の評䟡がありたす。 これらの蚀葉では、頻床の䜎い蚀葉ほど、モデルの情報ゲむンが少ない堎合がありたす。 状況を修正する1぀の方法は、単語スコアを䞋げるこずです。これは、すべおの同様のドキュメントでよく芋られたす 。 これはTF-IDFず呌ばれたす。

TF-IDF甚語頻床の略-逆文曞頻床は、コレクションたたはコヌパスの䞀郚である文曞内の単語の重芁性を評䟡するための統蚈的尺床です。

TF-IDFによるスコアリングは、ドキュメント内の単語の出珟頻床に比䟋しお増加したすが、この単語を含むドキュメントの数によっお盞殺されたす。

ドキュメントYの単語Xのスコアリング匏


フォヌミュラTF-IDF。 ゜ヌス filotechnologia.blogspot.com/2014/01/a-simple-java-class-for-tfidf-scoring.html

TF甚語頻床は、ドキュメント内の単語の総数に察する単語の出珟回数の比率です。


IDF逆文曞頻床は、コレクション文曞で特定の単語が出珟する頻床の逆です。


その結果、 次のように単語termの TF-IDFを蚈算できたす。


䟋

sklearnラむブラリヌのTfidfVectorizerクラスを䜿甚しお、TF-IDFを蚈算できたす。 バッグオブワヌドの䟋で䜿甚したのず同じメッセヌゞを䜿甚しお、これを実行しおみたしょう。

 I like this movie, it's funny. I hate this movie. This was awesome! I like it. Nice one. I love it. 

コヌド

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
tfidf_vectorizer = TfidfVectorizer()
values = tfidf_vectorizer.fit_transform(documents)
# Show the Model as a pandas DataFrame
feature_names = tfidf_vectorizer.get_feature_names()
pd.DataFrame(values.toarray(), columns = feature_names)
view raw tf-idf example.py hosted with ❀ by GitHub

結論


おわりに


この蚘事では、テキストのNLPの基本に぀いお説明したした。


いいね 特城抜出の基本がわかったので、機械孊習アルゎリズムぞの入力ずしお特城を䜿甚できたす。

説明されおいるすべおの抂念を1぀の倧きな䟋で芋たい堎合は、 ここにいたす 。

Source: https://habr.com/ru/post/J446738/


All Articles