質問

情報検索の学位を取得していなくても、特定のテキスト本文内で単語が出現する頻度をカウントするアルゴリズムが存在するかどうか知りたいと思っています。目標は、一連のテキストコメントを通じて人々が何を言っているかの「全体的な感覚」を把握することです。の線に沿って ワードル.

私が欲しいもの:

  • 冠詞、代名詞など (「a」、「an」、「the」、「him」、「them」など) を無視します。
  • 固有名詞を保存する
  • ソフトタイプを除き、ハイフネーションを無視します

星に手を伸ばせば、それは桃色でしょう:

  • ステミングと複数形の処理 (例:いいね、いいね、いいね、いいねは同じ結果に一致します)
  • 形容詞(副詞など)とその主語(「素晴らしい」、「サービス」ではなく「素晴らしいサービス」)のグループ化

Wordnet を使用していくつかの基本的なことを試みましたが、やみくもに調整して、特定のデータで機能することを期待しているだけです。もっと一般的なものがあれば素晴らしいでしょう。

役に立ちましたか?

解決

次のような優れたアルゴリズムが 1 つではなく、いくつか必要になります。

  • 代名詞の無視は、 ストップリスト.
  • 固有名詞を保存する?つまり、名前付きエンティティを検出するということです。 フーバー ダム そして、「それは 1 つの単語です」または複合名詞を言います。 プログラミング 言語?ヒントを教えます:それは難しいことですが、両方のライブラリが存在します。NER (固有表現認識) と語彙チャンキングを探します。 OpenNLP は両方を行う Java ツールキットです。
  • ハイフンを無視しますか?改行のような意味ですか?正規表現を使用し、辞書検索によって結果の単語を確認します。
  • 複数形/語幹の処理:を調べることができます スノーボールステマー. 。それはうまくいきます。
  • 形容詞を名詞と「グループ化」するのは、通常、 浅い解析. 。ただし、定性的な形容詞 (良い、悪い、ひどい、素晴らしいなど) を特に探している場合は、次のことに興味があるかもしれません。 感情分析. リンパイプ これだけでなく、その他にもさまざまなことができます。

ごめんなさい、キスしたいと言ったのは知っていますが、残念ながら、あなたの要求に応えるのは簡単ではありません。それにもかかわらず、これらすべてを行うためのツールが存在しており、それらを結び付けるだけで、必要に応じて自分でタスクを実行する必要がなくなります。自分でタスクを実行したい場合は、ステミングを検討することをお勧めします。それが最も簡単です。

Java を使用する場合は、組み合わせてください ルシーン とともに OpenNLP ツールキット。Lucene にはすでにステマーが組み込まれており、多くのチュートリアルがあるため、非常に良い結果が得られます。一方、OpenNLP ツールキットは文書化が不十分ですが、それほど多くのことは必要ありません。あなたは下記にもご興味がおありかもしれません NLTK, 、Pythonで書かれています。

最後の要件は浅い解析を必要とし、結果が明らかに悪くなるわけではないため、削除したほうがいいと思います。

ああ、ところで。あなたが探していた文書の正確な用語-用語-頻度-ものの名前は次のとおりです tf-idf. 。これは、用語の文書頻度を調べるためのほぼ最良の方法です。これを適切に行うには、多次元ベクトル行列を使用する必要があります。

...はい、知っています。IRに関するセミナーを受講して、Googleに対する尊敬の念がさらに高まりました。しかし、IRでいくつかのことをした後、彼らに対する私の尊敬は同じくらい急速に下がりました。

他のヒント

NLP の世界へようこそ ^_^

必要なのは、少しの基本的な知識といくつかのツールだけです。

文中の単語が名詞なのか、形容詞なのか、動詞なのかを教えてくれるツールはすでにあります。という 品詞タグ付け. 。通常、平文の英語を入力として受け取り、単語、その基本形、および品詞を出力します。投稿の最初の文にある一般的な UNIX 品詞タガーの出力を次に示します。

$ echo "Without getting a degree in information retrieval, I'd like to know if there exists any algorithms for counting the frequency that words occur in a given body of text." | tree-tagger-english 
# Word  POS     surface form
Without IN  without
getting VVG get
a   DT  a
degree  NN  degree
in  IN  in
information NN  information
retrieval   NN  retrieval
,   ,   ,
I   PP  I
'd  MD  will
like    VV  like
to  TO  to
know    VV  know
if  IN  if
there   EX  there
exists  VVZ exist
any DT  any
algorithms  NNS algorithm
for IN  for
counting    VVG count
the DT  the
frequency   NN  frequency
that    IN/that that
words   NNS word
occur   VVP occur
in  IN  in
a   DT  a
given   VVN give
body    NN  body
of  IN  of
text    NN  text
.   SENT    .

ご覧のとおり、「アルゴリズム」が「アルゴリズム」の複数形(nns)と「存在」であると特定され、「存在」の共役(vbz)であると特定されました。また、「a」と「as as "sechiners(dt)」を特定しました。ご覧のとおり、POS タガーは句読点もトークン化しました。

リストの最後の点以外のすべてを行うには、POS タガーでテキストを実行し、興味のないカテゴリー (限定詞、代名詞など) をフィルターで除外し、次の基本形式の頻度をカウントするだけです。言葉。

以下に、一般的な POS タガーをいくつか示します。

ツリータガー (バイナリのみ:Linux、Solaris、OS-X)
ジーニア・タガー (C++:自分自身をコンパイルしてください)
スタンフォード POS タガー (ジャワ)

リストの最後のことを行うには、単なる単語レベルの情報以上のものが必要です。簡単に始める方法は数えることです シーケンス 言葉 言葉そのものではなく。これらはと呼ばれます Nグラム. 。始めるのに適した場所は、 詩人のためのUNIX. 。NLP に関する本に投資したい場合は、次の本をお勧めします。 統計的自然言語処理の基礎.

これを Python で行う方法の例を次に示します。概念はどの言語でも似ています。

>>> import urllib2, string
>>> devilsdict = urllib2.urlopen('http://www.gutenberg.org/files/972/972.txt').read()
>>> workinglist = devilsdict.split()
>>> cleanlist = [item.strip(string.punctuation) for item in workinglist]
>>> results = {}
>>> skip = {'a':'', 'the':'', 'an':''}
>>> for item in cleanlist:
      if item not in skip:
        try:
          results[item] += 1
        except KeyError:
          results[item] = 1

>>> results
{'': 17, 'writings': 3, 'foul': 1, 'Sugar': 1, 'four': 8, 'Does': 1, "friend's": 1, 'hanging': 4, 'Until': 1, 'marching': 2 ...

最初の行は、問題の一部を解決するライブラリを取得するだけです。2 行目では、urllib2 がアンブローズ ビアスの「悪魔の辞書」のコピーをダウンロードします。次の行は、テキスト内のすべての単語のリストを句読点なしで作成します。次に、ハッシュ テーブルを作成します。この場合、これは数値に関連付けられた一意の単語のリストのようなものです。for ループは、ビアスの本の各単語を調べます。その単語のレコードがテーブル内にすでに存在する場合、新しい単語が出現するたびに、テーブル内のその単語に関連付けられた値に 1 が追加されます。単語がまだ出現していない場合は、値 1 (出現が 1 回であることを意味します) でテーブルに追加されます。ここで話しているケースでは、大文字の使用など、詳細にさらに注意を払う必要があります。文の途中などで固有名詞のみを識別しやすくするため、非常に大まかですが概念を表しています。

ステミングと複数化に取り組み、実験し、その後サードパーティの作品を調べるために、学術的なオープンソース プロジェクトである NLTK の一部を Python で楽しんできました。

私は少し前にこれを行うための完全なプログラムを書きました。後で家に帰ったらデモをアップロードできます。

コードは次のとおりです (asp.net/c#)。http://naspinski.net/post/Findingcounting-Keywords-out-of-a-Text-Document.aspx

あなたの質問の最初の部分はそれほど悪くないようです。基本的に行う必要があるのは、ファイル (またはストリーム付きストリーム) から各単語を読み取ってプレフィックス ツリーに配置することだけです。既存の単語を見つけるたびに、それに関連付けられた値をインクリメントします。もちろん、計算から除外したいすべてのものを無視するリストも作成できます。

プレフィックス ツリーを使用すると、単語の検索が O(N) になることが保証されます。N はデータ セット内の単語の最大長です。この状況での接頭辞ツリーの利点は、複数形と語幹を探したい場合に、その単語でそれが可能かどうかを O(M+1) でチェックできることです。ここで、M は語幹や複数形を除いた単語の長さです。 (それは言葉ですか?ふふ)。接頭辞ツリーを構築したら、幹などを再分析して、ルート単語が結果を保持するように圧縮します。

検索時に、ルートまたはステムなどの場合に一致が肯定的な結果を返すように、いくつかの簡単なルールを設定することができます。

2 番目の部分は非常に難しいようです。私の単純な傾向としては、形容詞と主語のグループ化に対して別々の結果を保持することです。上記と同じ原則を使用しますが、分離しておいてください。

意味分析のもう 1 つのオプションは、各文を主語、動詞などの関係のツリーとしてモデル化することです (文には主語と動詞があり、主語には名詞と形容詞などがあります)。この方法ですべてのテキストを分割すると、テキストを確認して、発生したさまざまな適切な組み合わせを素早く数えることがかなり簡単になるように思えます。

とりとめのない話です。もっと良いアイデアがあると思いますが、私はこのことについて考えるのが大好きです。

先ほど説明したアルゴリズム。「Do it」という大きなボタンを押すだけですぐに実行できるプログラム...わからない。

しかし、建設的な話をさせてください。この本をお勧めします 集合知のプログラミング. 。第 3 章と第 4 章には、非常に実践的な例が含まれています (実際には、複雑な理論はなく、単なる例です)。

ワールドネット辞書を使用して、過去の発言などの質問キーワードの基本情報を取得したり、同義語を抽出したり、文書に対して同じことを行ってインデックスを作成したりすることもできます。そうすれば、キーワードをインデックス ファイルと簡単に照合し、ドキュメントをランク付けできます。それを要約します。

あなたがリストしたものはすべて、 広々とした.

  1. 一部の単語を無視 - ストップワードを使用する
  2. 件名を抽出 - 品詞のタグ付けを使用して件名を識別します (すぐに使用できます)。文が解析された後、文の主要な動詞である「ROOT」を見つけます。による 解析ツリーをナビゲートする この動詞に関連する名詞が見つかります。それが主題になります。
  3. ハイフンを無視します - トークナイザーはほとんどの場合ハイフンを処理します。より特殊なケースを処理するために簡単に拡張できます。

トピックのリストが事前に決定されており、それほど大きくない場合は、さらに先に進むこともできます。トピックを予測する分類モデルを構築します。10 個の科目があるとします。例文やテキストを集めます。それらを別の製品にロードします。 天才. 。優れたインターフェイスを使用すると、主題をサンプルにすばやく割り当てることができます。最後に、分類されたサンプルを使用して、テキストまたは文章の主題を予測するために空間モデルをトレーニングします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top