32

情報検索の学位を取得していないので、特定のテキスト本文で単語が出現する頻度をカウントするアルゴリズムが存在するかどうかを知りたいです。目標は、一連のテキスト コメントに対して人々が言っ​​ていることの「一般的な感触」をつかむことです。Wordleの行に沿って。

私が欲しいもの:

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

星に手を伸ばすと、これらは桃色になります。

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

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

4

8 に答える 8

69

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

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

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

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

最後の要件は浅い構文解析を含み、明らかに結果を損なうことはないため、削除すると思います。

ああ、ところで。そのドキュメントの正確な用語-用語-頻度-あなたが探していたものはtf-idfと呼ばれます。これは、用語のドキュメント頻度を探すための最良の方法です。それを適切に行うために、多次元ベクトル行列を使用することは避けられません。

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

于 2008-09-18T08:04:19.263 に答える
16

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" と "the" を "determiners (DT)" (記事の別の言葉) として識別しました。ご覧のとおり、POS タガーは句読点もトークン化しています。

リストの最後のポイント以外のすべてを行うには、テキストを POS タガーに通して、興味のないカテゴリ (決定詞、代名詞など) を除外し、基本形の頻度を数えるだけです。言葉。

人気のある POS タガーを次に示します。

TreeTagger (バイナリのみ: Linux、Solaris、OS-X)
GENIA Tagger (C++: 自分でコンパイル)
Stanford POS Tagger (Java)

リストの最後に必要なことは、単語レベルの情報だけではありません。開始する簡単な方法は、単語自体ではなく、一連 単語を数えることです。これらはn-gramと呼ばれます。UNIX for Poetsから始めるのがよいでしょう。NLP に関する本に投資する意思がある場合は、Foundations of Statistical Natural Language Processingをお勧めします。

于 2008-09-18T08:17:37.873 に答える
4

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 が Ambrose Bierce の「Devil's Dictionary」のコピーをダウンロードします。次の行では、テキスト内のすべての単語のリストを句読点なしで作成します。次に、ハッシュ テーブルを作成します。これは、この場合、数値に関連付けられた一意の単語のリストのようなものです。for ループは、Bierce ブック内の各単語を調べます。テーブルにその単語のレコードが既に存在する場合、新しい出現ごとに、テーブル内のその単語に関連付けられた値に 1 が追加されます。単語がまだ表示されていない場合は、値が 1 (1 回出現することを意味します) でテーブルに追加されます。あなたが話しているケースでは、大文字の使用など、詳細にもっと注意を払う必要があります。文の途中でのみ固有名詞を識別するのを助けるために、

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

于 2008-09-18T08:26:36.293 に答える
2

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

プレフィックスツリーを使用する場合は、任意の単語を検索するためにO(N)に移動するようにします。ここで、Nはデータセット内の単語の最大長です。この状況でのプレフィックスツリーの利点は、複数形と語幹を検索する場合、その単語でも可能かどうかをO(M + 1)でチェックインできることです。ここで、Mは語幹または複数形を含まない単語の長さです。 (それは一言ですか?hehe)。プレフィックスツリーを作成したら、語幹などについて再分析し、ルートワードが結果を保持するように凝縮します。

検索時に、ルートやステム、またはあなたが持っているものの場合に一致が正になるように、いくつかの簡単なルールを設定することができます。

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

セマンティック分析の別のオプションは、各文を主語、動詞などの関係のツリーとしてモデル化することです(文には主語と動詞があり、主語には名詞と形容詞があります)。このようにすべてのテキストを分割すると、実行して、発生したさまざまな適切なペアリングをすばやくカウントするのはかなり簡単なようです。

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

于 2008-09-18T08:07:19.613 に答える
2

しばらく前に、これを行うための完全なプログラムを作成しました。家に帰ったら、後でデモをアップロードできます。

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

于 2008-09-18T07:48:39.550 に答える
1

先ほど説明したアルゴリズム。「Do it」と言う大きなボタンで箱から出してそれを行うプログラム...わかりません。

しかし、私は建設的にしましょう。私はあなたにこの本Programming Collective Intelligenceをお勧めします。第 3 章と第 4 章には、非常に実用的な例が含まれています (実際には、複雑な理論ではなく、単なる例です)。

于 2008-09-18T07:00:35.860 に答える
0

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

于 2009-09-01T06:03:19.577 に答える
0

あなたがリストしたものはすべて、スペイシーによって適切に処理されます。

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

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

于 2019-01-13T08:22:27.240 に答える