つまり、「college」と「schoolwork」と「academy」は同じクラスターに属し、単語「essay」、「scholarships」、「money」も同じクラスターに属します。これは ML または NLP の問題ですか?
5 に答える
それは、類似の定義がどれほど厳密であるかによって異なります。
機械学習技術
他の人が指摘しているように、潜在的意味分析や関連する潜在的ディリクレ割り当てなどを使用できます。
意味的類似性とWordNet
指摘されたように、既存のリソースをこのようなものに使用したい場合があります。
多くの研究論文 (例) では、意味的類似性という用語が使用されています。基本的な考え方は、通常、グラフ上の 2 つの単語間の距離を計算することによって計算されます。単語が親の型である場合、その単語は子になります。例: 「songbird」は「bird」の子になります。必要に応じて、クラスターを作成するための距離メトリックとして意味的類似性を使用できます。
実装例
さらに、何らかの意味的類似度の値にしきい値を設定すると、ブール値True
またはを取得できますFalse
。これは私が作成した Gist ( word_similarity.py ) で、NLTK のWordNet用コーパス リーダーを使用しています。うまくいけば、それがあなたを正しい方向に向けさせ、さらにいくつかの検索語を与えてくれます.
def sim(word1, word2, lch_threshold=2.15, verbose=False):
"""Determine if two (already lemmatized) words are similar or not.
Call with verbose=True to print the WordNet senses from each word
that are considered similar.
The documentation for the NLTK WordNet Interface is available here:
http://nltk.googlecode.com/svn/trunk/doc/howto/wordnet.html
"""
from nltk.corpus import wordnet as wn
results = []
for net1 in wn.synsets(word1):
for net2 in wn.synsets(word2):
try:
lch = net1.lch_similarity(net2)
except:
continue
# The value to compare the LCH to was found empirically.
# (The value is very application dependent. Experiment!)
if lch >= lch_threshold:
results.append((net1, net2))
if not results:
return False
if verbose:
for net1, net2 in results:
print net1
print net1.definition
print net2
print net2.definition
print 'path similarity:'
print net1.path_similarity(net2)
print 'lch similarity:'
print net1.lch_similarity(net2)
print 'wup similarity:'
print net1.wup_similarity(net2)
print '-' * 79
return True
出力例
>>> sim('college', 'academy')
True
>>> sim('essay', 'schoolwork')
False
>>> sim('essay', 'schoolwork', lch_threshold=1.5)
True
>>> sim('human', 'man')
True
>>> sim('human', 'car')
False
>>> sim('fare', 'food')
True
>>> sim('fare', 'food', verbose=True)
Synset('fare.n.04')
the food and drink that are regularly served or consumed
Synset('food.n.01')
any substance that can be metabolized by an animal to give energy and build tissue
path similarity:
0.5
lch similarity:
2.94443897917
wup similarity:
0.909090909091
-------------------------------------------------------------------------------
True
>>> sim('bird', 'songbird', verbose=True)
Synset('bird.n.01')
warm-blooded egg-laying vertebrates characterized by feathers and forelimbs modified as wings
Synset('songbird.n.01')
any bird having a musical call
path similarity:
0.25
lch similarity:
2.25129179861
wup similarity:
0.869565217391
-------------------------------------------------------------------------------
True
>>> sim('happen', 'cause', verbose=True)
Synset('happen.v.01')
come to pass
Synset('induce.v.02')
cause to do; cause to act in a specified manner
path similarity:
0.333333333333
lch similarity:
2.15948424935
wup similarity:
0.5
-------------------------------------------------------------------------------
Synset('find.v.01')
come upon, as if by accident; meet with
Synset('induce.v.02')
cause to do; cause to act in a specified manner
path similarity:
0.333333333333
lch similarity:
2.15948424935
wup similarity:
0.5
-------------------------------------------------------------------------------
True
ML と NLP の手法を使用して、このような関連付けの独自のデータベースを構築できると思いますが、WordNetなどの既存のリソースにクエリを実行して作業を完了することも検討してください。
関心のあるトピックに関連するドキュメントのかなりのコレクションがある場合は、Latent Direchlet Allocationを確認することをお勧めします。LDA は、単語をトピックに自動的にクラスター化する、かなり標準的な NLP 手法です。単語間の類似性は、同じドキュメント内のコロケーションによって決定されます (必要に応じて、単一の文をドキュメントとして扱うことができます)。
利用可能な LDA ツールキットが多数あります。別のものを推奨する前に、正確な問題の詳細が必要です。とにかく、私はそのような推奨をするのに十分な専門家ではありませんが、少なくとも LDA を見ることをお勧めします。
あなたの質問に関する有名な引用は、1957 年のジョン ルパート ファースによるものです。
あなたはそれが保持する会社によって単語を知っているでしょう
このトピックを掘り下げるには、このプレゼンテーションを参照してください。