不思議の国のアリスによる自然言語処理の探求


プログラミングオタクと文学オタクとして🤓 私は最近、2つを結びつけるためにより多くの方法を見つけようとしていました.私は、現在夏に夏を過ごしていますRecurse Center 自分の自主的な学習をするので、このVennダイアグラムの重なりを調べるのに素晴らしい時間のように思えました.
このウサギの穴を下に行くと、私はこのadjacency matrix of characters in Les Misérables そして、私がコードで私のお気に入りの本について調べることができるかもしれない他のものを疑問に思ってください.
私は本を通して働いているNatural Language Processing in Python そして、ちょうど彼の傾向を含む言語のキャロルの使用を愛してくださいinvent words とコンテキストに依存してsound symbolism それらを理解する.
それを念頭に、私はどのようにテキスト内の珍しいまたは発明の単語を識別する方法について考えていた.
それで、不思議の国のアリスのテキストで武装して、私は私の探求(pedantic注)を始めました:「Jabberwocky」は実際に見えるガラスを通して現れます.
この本は、このようなことをするべき機能を十分に提供しています.
def unusual_words(text):
  text_vocab = set(w.lower() for w in text if w.isalpha())
  english_vocab = set(w.lower() for w in nltk.corpus.words.words())
  unusual = text_vocab.difference(english_vocab)
  return sorted(unusual)
それで、私はそれを接続して、それを試みました.私は戻って582の単語のリストを得た.それはひどいたくさんのようだったので、私はそれらのいくつかをスキャンしました.彼らの多くは、かなり一般的であるようでした:卵、鼠は、起こりました.
ので、多分これは私が思っていたよりも難しくなるだろう.私は少し欲求不満を取得し、いくつかの他の死体を使用してみました.しかし、このコーパスは、それには、これらの信じられないほど一般的な言葉を持っている必要があります4分の1百万の言葉を持っていた?それから、私は言葉について何かに気がつきました.名詞のほとんどは複数(例えば卵)であり、動詞は共役(例えば提示)された.
私は、彼らの最も「基本的な」形に単語を得たかったです.名詞の場合は単数、不定詞は動詞の場合.このために、私はNodeBox English Linguistics Library . ここにカップルがあった.例えば、is_verb? はすべての共役動詞とsingular 予期しない結果があったので、私はすべての不定詞と単数形のメソッドを実行し、それらが返された場合、それらは戻って出発単語とは異なる空の結果を返した.

このメソッドは、元のメソッドでは、単純なセットの違いよりもはるかに遅いので、私は2番目のパスとして実装されてのみ、最初の拡散で発見されなかった単語に使用するunusual_words 次のようになります.
def unusual_words(text):
  text_vocab = set(w.lower() for w in text if w.isalpha())
  english_vocab = set(w.lower() for w in nltk.corpus.words.words())
  unusual = text_vocab.difference(english_vocab)
  basic_forms = set(basic_word_form(w) for w in unusual)
  return sorted(basic_forms.difference(english_vocab))
そして新しい方法を書いたbasic_word_form , nodeboxメソッドを使用します.
def basic_word_form(word):
   word = word.lower()
   singular = en.noun.singular(word)
   if singular !=  word:
       return singular
   else:
      infinitive = en.verb.infinitive(word)
      return infinitive if len(infinitive) > 0 else word
これは私の92単語のリストを得た.あまり悪くない.いくつかのローマ数字、いくつかの適切な名詞(フランス、ロンドン、シェークスピア)、他の合法的に異常または発明(seography、グリフォン).最も小さくて、より大きくて、最も好きである―比較論と超能力のように、まだ存在していなかったいくつかがありました.私は、これらのベースの形容詞または副詞にこれらを減らすのを助けるかもしれないNodeBoxで何も見ませんでした.また、夢のようにいくつかの動詞があったが、それらは不正確な形に正しく変換されていなかった.
私は、自然言語ツールキット(NLTK)にツールがあることに気がつきました.get the base (or "stem") 語の形.
私は、2つの異なる「stemmers」をためしました.
def unusual_words_porter(text):
  text_vocab = set(w.lower() for w in text if w.isalpha())
  english_vocab = set(w.lower() for w in nltk.corpus.words.words())
  unusual = text_vocab.difference(english_vocab)
  basic_forms = set(basic_word_form_porter(w) for w in unusual)
  return sorted(basic_forms.difference(english_vocab))

def basic_word_form_porter(word):
   word = word.lower()
   stemmer = nltk.PorterStemmer()
   return stemmer.stem(word)

def unusual_words_snowball(text):
  text_vocab = set(w.lower() for w in text if w.isalpha())
  english_vocab = set(w.lower() for w in nltk.corpus.words.words())
  unusual = text_vocab.difference(english_vocab)
  basic_forms = set(basic_word_form_snowball(w) for w in unusual)
  return sorted(basic_forms.difference(english_vocab))

def basic_word_form_snowball(word):
   word = word.lower()
   stemmer = nltk.SnowballStemmer('english')
   return stemmer.stem(word)
これらは187と188の単語のリストを返しました.ステマーは私が必要としていたものを正確にしているようには見えませんでした.彼らはしばしば抱合や不規則な複数形を略奪して、残ったものは英語の言葉ではありませんでした.いくつかの出力:trembl、turtl、difficulti.
私はもう一つのツールを見つけたlemmatizer . それは彼らの言葉を減らすためのものですlemma ,単語の正準、辞書または引用形式.「約束するね.
>>> lemmatizer = WordNetLemmatizer()
>>> lemmatizer.lemmatize('hedgehogs')
u'hedgehog'
>>> lemmatizer.lemmatize('says')
u'say'
私は、あなたがオプションの第2の引数を通して語のスピーチの部分を指定するならば、それが非常によりよく働くと気がつきました.
>>> lemmatizer.lemmatize('prettier')
'prettier'
>>> lemmatizer.lemmatize('smallest')
'smallest'
>>> lemmatizer.lemmatize('smallest', pos='a')
u'small'
>>> lemmatizer.lemmatize('prettier', pos='a')
u'pretty'
問題は、言葉の部分が何であるかを知りませんでした、そして、いくつかは文脈によって異なるものであるかもしれません.それで、私はスピーチの一部なしで、それから形容詞、動詞と名詞として各々を試みて、出発語に合わなかった最初のものを返しました.🤷
def basic_word_form(word):
  word = word.lower()
  lemmatized_forms = [lemmatizer.lemmatize(word), lemmatizer.lemmatize(word, pos='a'), lemmatizer.lemmatize(word, pos='v'), lemmatizer.lemmatize(word, pos='n')]
  for form in lemmatized_forms:
    if form != word:
      return form
  return word
これは、最短のリストをまだ71の言葉で生産.主な偽陽性は、英国のスペル、スケルトン、隣人、Cardsey、ローマ数字、および本当の言葉不可解には、元のコーパス、子供、誇らしげに欠落しているように見えた.しかし、言葉の多くは本当に珍しいようでした.
私は、1つの最後の実験をすることに決めました.私は、「Jabberwocky」から有名なVorpal、Uffish、BriggとSlithyを含むより多くの発明された語を見つけると思っていました
このテキストはデフォルトでNLTKに含まれていなかったので、私はそれをつかんだProject Gutenberg .
私がそれを走らせたとき、私はブリグ、キャラウェイ、Callooh、Furumiousなどを含む87の珍しい語を得ました.😂
これは自然言語処理ツールへの私の最初の進出でした.これは明らかにこれを行う最も効率的な方法ではないので、他の可能なアプローチを見つけることができます.私はあなたが何を考えて知っている場合は、質問やアイデアがある!