nlp - 使用 NLTK 处理复合词(2-grams)

标签 nlp nltk tokenize spacy

我正在尝试通过比较用户个人资料(来自网站)中使用的关键字来识别用户的相似之处。例如,Alice = 披萨、音乐、电影Bob = cooking 、吉他、电影Eve = 针织、运行、健身房。理想情况下,AliceBob 是最相似的。我写了一些简单的代码来计算相似度。为了考虑关键字的可能复数/单数版本,我使用类似的东西:

from nltk.stem import WordNetLemmatizer
from nltk.tokenize import word_tokenize
wnl = WordNetLemmatizer()
w1 = ["movies", "movie"] 
tokens = [token.lower() for token in word_tokenize(" ".join(w1))]
lemmatized_words = [wnl.lemmatize(token) for token in tokens]

因此,lemmatized_words = ["movie", "movie"]。 之后,我使用 spacy 进行一些成对的关键字比较。 ,例如:

import spacy
nlp = spacy.load('en')
t1 = nlp(u"pizza")
t2 = nlp(u"food")
sim = t1.similarity(t2)

现在,当我必须处理复合词时,问题就开始了,例如:人工智能数据科学whole food 等. 通过标记化,我会简单地将这些词分成 2 个(例如 artificialintelligence),但这会影响我的相似性度量。什么是(将是)考虑这些类型的词的最佳方法?

最佳答案

有很多方法可以实现这一点。一种方法是自己创建嵌入(向量)。这将有两个好处:首先,您将能够使用双、三和超越 (n-) 克作为您的标记,其次,您能够定义最适合您需要的空间—— - 维基百科数据是通用的,但是,比如说, child 故事将是一个更小众的数据集(如果你正在解决与 child 和/或故事有关的问题,则更合适/“准确”)。当然有几种方法word2vec是最受欢迎的,并且有几个软件包可以帮助您(例如 gensim )。

但是,我的猜测是您会喜欢已经存在的东西。目前最好的词嵌入是:

  • Numberbatch (“经典”一流合奏);
  • fastText ,由 Facebook Research(在字符级别创建——结果可以“理解”一些词汇之外的单词);
  • sense2vec ,由 Spacy 背后的同一批人(使用词性 (POS) 作为附加信息创建,目的是消除歧义)。

我们有兴趣快速解决您的问题的是 sense2vec .您应该阅读 paper ,但本质上,这些词嵌入是使用带有额外 POS 信息的 Reddit 创建的,并且(因此)能够区分跨越多个词的实体(例如名词)。 This blog post描述 sense2vec很好。下面是一些可帮助您入门的代码(取自之前的链接):

安装:

git clone https://github.com/explosion/sense2vec
pip install -r requirements.txt
pip install -e .
sputnik --name sense2vec --repository-url http://index.spacy.io install reddit_vectors

示例用法:

import sense2vec
model = sense2vec.load()
freq, query_vector = model["onion_rings|NOUN"]
freq2, query_vector2 = model["chicken_nuggets|NOUN"]
print(model.most_similar(query_vector, n=5)[0])
print(model.data.similarity(query_vector, query_vector2))

重要说明,sense2vec 需要 spacy>=0.100,<0.101 ,意思是它将降级您当前的 spacy安装,如果您只加载 en,问题不大模型。此外,这里是使用的 POS 标签:

ADJ ADP ADV AUX CONJ DET INTJ NOUN NUM PART PRON PROPN PUNCT SCONJ SYM VERB X

你可以使用 spacy用于 POS 和依赖标记,然后是 sense2vec以确定结果实体的相似性。或者,根据数据集的频率(不太大),您可以按降序 (n) 顺序获取 n-gram,然后依次检查是否每个都是 sense2vec 中的实体。模型。

希望这对您有所帮助!

关于nlp - 使用 NLTK 处理复合词(2-grams),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49403913/

相关文章:

string - AI - 字符串/文本分类/分类(例如,字符串/文本被分类为公司名称)

python - 使用预训练的词嵌入对 "pools"的词进行分类

full-text-search - 计算形容词频率的技巧

java - 大规模机器学习——Python 还是 Java?

postgresql - NLTK可以在Postgres Python存储过程中使用吗

c++ - 迭代表示为 std::basic_string_view 的正则表达式子匹配

python - 如何提取negspacy中的特定单词

Python:使用 NLTK 时的 "HVZ"标记

bash - Bash 如何对脚本进行标记?

python - 如何使用 NLTK nltk.tokenize.texttiling 将文本拆分为段落?