我从来没有真正处理过 NLP,但对 NER 有一个想法,它不应该起作用,并且在某种情况下做得非常好。我不明白它为什么起作用,为什么不起作用或天气可以延长。
这个想法是通过以下方式提取故事中主要人物的名字:
- 为每个单词构建字典
- 为每个单词填写一个列表,其中包含文本中出现在它旁边的单词
- 为每个单词找到一个与列表相关性最大的单词(意味着这些单词在文本中的使用相似)
- 鉴于故事中一个角色的名字,像它一样使用的词也应该是这样的(假的,那是不应该的,但因为直到今天早上我才开始处理 NLP,所以我开始了天真的一天)
我在Alice in Wonderland上运行了过于简单的代码(附在下面),“Alice”返回:
21 ['鼠标','纬度','威廉','兔子','渡渡鸟','狮鹫','螃蟹','女王','公爵夫人','步兵','黑豹','毛毛虫', '心','国王','比尔','鸽子','猫','帽子','野兔','乌龟','睡鼠']
尽管它会过滤大写单词(并接收“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()