介绍
这个项目的名字为SimilarVocabulary,项目本身并不复杂,使用了NLP中的词向量来检索到关联程度较大的单词,项目套用了NLP中一个开源库spacy.该库自带了一个训练好的模型,可以进行英文文本的预测。
项目源码地址:
https://github.com/wotchin/SimilarVocabulary
代码细节
下面,我们以这个简单的demo演示一下spacy库的使用,以及介绍获取相近单词的代码。
加载模型:
nlp = spacy.load('en_core_web_lg')
其中,en_core_web_log 是该库自带的一个训练好的模型,这个模型很大,需要自己下载,在项目中给出了初始化的脚本为:init.sh
获取输入文本
这行代码主要是用于获取输入文本内容,然后将输入的文本(主要是单词)进行预处理,生成token:
while True:
if line != "":
words += line.replace("\n"," ")
line = f.read()
else:
break
nlp = spacy.load('en_core_web_lg')
print("modal loaded.")
tokens = nlp(words)
设定阈值
套用这个库来实现相近单词检索的大致原理是:
通过已经训练好的模型,通过词向量对比给定的两个单词之间的“距离”,我们给定的这个阈值就是这个“距离”的上线,通过设定这个上限值,就可以获取我们想要的输出结果——语义相近的单词。
我们简单看一下设定阈值的过程:
threshold = 0.0
while threshold <= 0.0:
try:
threshold = float(input("input threshold value:"))
except:
threshold = 0.0
length = 3
try:
length = int(input("input result length:"))
except:
length = 3
代码逻辑很简单:
要求输入阈值,需要查询到的相近单词的个数。
实现对比查询
我在这里实现的逻辑是:给一个语料库数据集,数据集里收集了绝大多数的常用英文单词,在这个数据集中寻找与我们事先给定的单词意思相近的结果,然后选择n个比较优的结果返回。这部分的代码是:
while True:
queue = [] #[['dog',0.1],['cat',0.2]...]
i = input("input your word:")
if i != "":
txt = nlp(i)
for token in tokens:
score = token.similarity(txt)
if score >= threshold and family_check(txt.text.strip(),token.text.strip()) < 0:
if len(queue) >= length:
index = 0 # in order to contrast
value = 1.0
for i in range(0,len(queue)):
if queue[i][1] < value:
value = queue[i][1]
index = i if value < score:
queue[index] = [token.text,score]
else:
queue.append([token.text,score])
print(queue)
用途
诸如这样寻找相似的单词的意义是怎样的呢? 譬如某些答题竞猜类APP,如之前非常火爆的在线直播答题类APP进行编题时,如果只有一个选项,需要补充额外三个干扰选项怎么办?可以使用这样的相近单词生成器,生成关联比较近的单词,例如输入单词dog,它可能会为我们返回:pig,cat,cook.
同时,也可以用在搜索引擎这样的联想搜索场景中。当然了,它的更多用途远不止于此,全凭脑洞。
对大数据,机器学习,系统架构等领域感兴趣的,可以看一下这个课程:《spark机器学习实战》