私は実際にNLPを扱ったことはありませんでしたが、NERについて考えていましたが、これは機能しないはずであり、ある場合にはどういうわけか非常にうまく機能します。なぜそれが機能するのか、なぜそれが機能しないのか、またはそれが延長できる天気がわからない。
アイデアは、ストーリーの主人公の名前を次の方法で抽出することでした。
- 単語ごとに辞書を作成する
- 各単語のリストに、テキストのすぐ隣に表示される単語を入力します
- 各単語について、リストの相関が最大の単語を検索します(つまり、単語はテキスト内で同様に使用されます)
- 物語の中のキャラクターの名前の1つを考えると、そのように使用される単語も同様である必要があります(偽物、それは機能しないはずですが、今朝までNLPを扱ったことがなかったので、私は素朴な一日を始めました)
不思議の国のアリスで非常に単純なコード(以下に添付)を実行しました。これは「アリス」に対して次のように返されます。
21 ['マウス'、'緯度'、'ウィリアム'、'ウサギ'、'ドードー'、'グリフォン'、'カニ'、'クイーン'、'公爵夫人'、'フットマン'、'パンサー'、'キャタピラー'、 'Hearts'、'King'、'Bill'、'Pigeon'、'Cat'、'Hatter'、'Hare'、'Turtle'、'Dormouse']
大文字の単語をフィルタリングしますが(そして、クラスター化する単語として「Alice」を受け取ります)、元々は大文字の単語が500個まであり、メインキャラクターに関してはまだかなりの位置にあります。
他のキャラクターや他のストーリーではうまく機能しませんが、興味深い結果が得られます。
このアイデアが使用可能、拡張可能であるかどうか、または「アリス」のこのストーリーでなぜそれがまったく機能するのか、何かアイデアはありますか?
ありがとう!
#English Name recognition
import re
import sys
import random
from string import upper
def mimic_dict(filename):
dict = {}
f = open(filename)
text = f.read()
f.close()
prev = ""
words = text.split()
for word in words:
m = re.search("\w+",word)
if m == None:
continue
word = m.group()
if not prev in dict:
dict[prev] = [word]
else :
dict[prev] = dict[prev] + [word]
prev = word
return dict
def main():
if len(sys.argv) != 2:
print 'usage: ./main.py file-to-read'
sys.exit(1)
dict = mimic_dict(sys.argv[1])
upper = []
for e in dict.keys():
if len(e) > 1 and e[0].isupper():
upper.append(e)
print len(upper),upper
exclude = ["ME","Yes","English","Which","When","WOULD","ONE","THAT","That","Here","and","And","it","It","me"]
exclude = [ x for x in exclude if dict.has_key(x)]
for s in exclude :
del dict[s]
scores = {}
for key1 in dict.keys():
max = 0
for key2 in dict.keys():
if key1 == key2 : continue
a = dict[key1]
k = dict[key2]
diff = []
for ia in a:
if ia in k and ia not in diff:
diff.append( ia)
if len(diff) > max:
max = len(diff)
scores[key1]=(key2,max)
dictscores = {}
names = []
for e in scores.keys():
if scores[e][0]=="Alice" and e[0].isupper():
names.append(e)
print len(names), names
if __name__ == '__main__':
main()