以下は、Python に基づくリレーショナル抽出のリモート監視アルゴリズムのサンプル コードです。このコードは、NLTK および scikit-learn ライブラリに基づいて実装されています。
まず、NLTK ライブラリと scikit-learn ライブラリをダウンロードしてインストールする必要があります。ターミナルで次のコマンドを入力して、次のことを実現できます。
pip install nltk
pip install scikit-learn
次に、必要なライブラリをコードにインポートします。
import nltk
from nltk import word_tokenize, pos_tag
from nltk.corpus import wordnet as wn
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
次に、ナレッジ ベース内のエンティティ関係を抽出し、それを辞書として保存する必要があります。ここでは、例として人の名前と場所の関係を取り上げます。
relationships = {}
with open('people_places.txt', 'r') as f:
for line in f:
line = line.strip().split('\t')
person = line[0]
location = line[1]
if person not in relationships:
relationships[person] = [location]
else:
relationships[person].append(location)
次に、ラベル付けするデータからエンティティ ペアを抽出し、それらが関連しているかどうかを判断するメソッドを定義します。
def extract_entities(text):
entities = []
for sent in nltk.sent_tokenize(text):
for chunk in nltk.ne_chunk(pos_tag(word_tokenize(sent))):
if hasattr(chunk, 'label') and chunk.label() == 'PERSON':
person = ' '.join(c[0] for c in chunk.leaves())
person = WordNetLemmatizer().lemmatize(person, wn.NOUN)
if person in relationships:
for location in relationships[person]:
entities.append((person, location))
return entities
このメソッドは、最初に nltk ライブラリによって提供される名前付きエンティティ認識 (NER) ツールを介して名前エンティティを抽出し、次にそれを名詞形式に変換します。最後に、人物の名前がエンティティ関係ディクショナリに表示される場合、その名前と関連付けられた場所エンティティがエンティティ ペアとして返されます。
次に、抽出されたエンティティ ペアを特徴ベクトルに変換する方法を定義する必要があります。
def get_features(entities, dataset):
vectorizer = CountVectorizer(token_pattern=r'\b\w+\b')
pairs = [' '.join(entity) for entity in entities]
X = vectorizer.fit_transform(dataset)
y = [1 if pair in pairs else 0 for pair in vectorizer.get_feature_names()]
return X, y
このメソッドの入力は、抽出されたエンティティ ペアとラベル付けされるテキスト データセットです。出力は、特徴ベクトルと、テキスト データが変換された対応するラベルです。
最後に、トレーニング済みの分類子を使用して、新しいデータを予測できます。ここでは単純ベイジアン分類器を選択しました。
def predict(text, clf, vectorizer):
entities = extract_entities(text)
X_test, y_test = get_features(entities, [text])
if len(entities) > 0:
y_pred = clf.predict(X_test)
for i in range(len(entities)):
if y_pred[i] == 1:
print(entities[i][0], 'is located in', entities[i][1])
このメソッドの入力は、予測されるテキスト データ、トレーニングされた分類器、および特徴ベクトル コンバーターです。出力は、予測されたエンティティ ペアとそれらの関係です。
最後に、上で定義したメソッドを使用して、分類子をトレーニングし、新しいテキスト データを予測できます。
with open('news.txt', 'r') as f:
news = f.read().splitlines()
entities = []
for text in news:
entities += extract_entities(text)
X_train, y_train = get_features(entities, news)
clf = MultinomialNB()
clf.fit(X_train, y_train)
for text in news:
predict(text, clf, vectorizer)
このコードは単なる例であり、実際の状況に応じて変更および調整する必要がある場合があります。