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']