Nlp 使用NLTK处理复合词(2克)

Nlp 使用NLTK处理复合词(2克),nlp,nltk,tokenize,spacy,Nlp,Nltk,Tokenize,Spacy,我试图通过比较用户档案中使用的关键字(来自网站)来识别用户的相似性。例如,Alice=比萨饼、音乐、电影,Bob=烹饪、吉他、电影和Eve=编织、跑步、健身房。理想情况下,Alice和Bob是最相似的。我写了一些简单的代码来计算相似度。为了解释这些关键词可能的复数/单数版本,我使用了如下内容: from nltk.stem import WordNetLemmatizer from nltk.tokenize import word_tokenize wnl = WordNetLemmatize

我试图通过比较用户档案中使用的关键字(来自网站)来识别用户的相似性。例如,
Alice=比萨饼、音乐、电影
Bob=烹饪、吉他、电影
Eve=编织、跑步、健身房
。理想情况下,
Alice
Bob
是最相似的。我写了一些简单的代码来计算相似度。为了解释这些关键词可能的复数/单数版本,我使用了如下内容:

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”]
。 之后,我使用以下方法进行一些成对关键字比较:

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

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

有很多方法可以做到这一点。一种方法是自己创建嵌入(向量)。这将有两个好处:第一,你可以使用双、三和超越(n)克作为你的代币,第二,你可以定义最适合你需要的空间——维基百科的数据是通用的,但是,比如说,儿童故事将是一个更适合你的数据集(而且更合适/准确)如果你在解决与孩子和/或故事有关的问题)。当然,有几种方法,最流行的是
word2vec
,还有几种软件包可以帮助您(例如
gensim

然而,我猜你会喜欢已经存在的东西。目前最好的单词嵌入是:

  • (“经典”一流合奏)
  • ,通过Facebook研究(在人物层面上创建——一些词汇表外的单词可以被“理解”)
  • ,由Spacy(使用词性(POS)作为附加信息创建,目的是消除歧义)背后的同一人创建
我们对快速解决您的问题感兴趣的是
sense2vec
。您应该阅读,但本质上,这些单词嵌入是使用Reddit创建的,带有附加的词性信息,并且(因此)能够区分跨越多个单词的实体(例如名词)。非常好地描述了
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,有使用nltk的方法:

from nltk.tokenize import MWETokenizer

tokenizer = MWETokenizer([("artificial","intelligence"), ("data","science")], separator=' ')

tokens = tokenizer.tokenize("I am really interested in data science and artificial intelligence".split())
print(tokens)
输出如下所示:

['I', 'am', 'really', 'interested', 'in', 'data science', 'and', 'artificial intelligence']

你可以阅读更多参考资料。

据我所知,这是计算语言学中的一个公开问题。非合成短语(即复合词)可以通过n-gram频率异常在大型语料库中检测到(即,人工智能比任何其他包含人工异或智能的双图更频繁地出现,表明其非合成性质)。我对你的问题没有答案,但我确实有一些相关的论文可能会让你感兴趣。请查看以下内容:
['I', 'am', 'really', 'interested', 'in', 'data science', 'and', 'artificial intelligence']