Spacy 中有二元组和三元组功能吗?

Is there a bi gram or tri gram feature in Spacy?

下面的代码将句子分解成单独的标记,输出如下

 "cloud"  "computing"  "is" "benefiting"  " major"  "manufacturing"  "companies"


import en_core_web_sm
nlp = en_core_web_sm.load()

doc = nlp("Cloud computing is benefiting major manufacturing companies")
for token in doc:
    print(token.text)

我最理想的是一起阅读 'cloud computing',因为它在技术上是一个单词。

基本上我在找一个双克。 Spacy 中是否有任何允许 Bi gram 或 Tri gram 的功能?

Spacy 允许检测名词块。因此,要将您的名词短语解析为单个实体,请执行以下操作:

  1. 检测名词块 https://spacy.io/usage/linguistic-features#noun-chunks

  2. 合并名词块

  3. 再次进行依赖解析,现在它会将“云计算”解析为单个实体。

>>> import spacy
>>> nlp = spacy.load('en')
>>> doc = nlp("Cloud computing is benefiting major manufacturing companies")
>>> list(doc.noun_chunks)
[Cloud computing, major manufacturing companies]
>>> for noun_phrase in list(doc.noun_chunks):
...     noun_phrase.merge(noun_phrase.root.tag_, noun_phrase.root.lemma_, noun_phrase.root.ent_type_)
... 
Cloud computing
major manufacturing companies
>>> [(token.text,token.pos_) for token in doc]
[('Cloud computing', 'NOUN'), ('is', 'VERB'), ('benefiting', 'VERB'), ('major manufacturing companies', 'NOUN')]

我有一个类似的问题(二元组,三元组,就像你的“云计算”)。我做了一个简单的 n-gram 列表,word_3gram、word_2grams 等,以克为基本单位 (cloud_computing)。

假设我有一句话“我喜欢云计算,因为它很便宜”。 sentence_2gram 是:“I_like”、“like_cloud”、“cloud_computing”、“computing_because” ...比较你的二元列表只有“cloud_computing" 被识别为有效的二元语法;句子中的所有其他二元组都是人为的。要恢复所有其他单词,您只需使用其他单词的第一部分,

"I_like".split("_")[0] -> I; 
"like_cloud".split("_")[0] -> like
"cloud_computing" -> in bigram list, keep it. 
  skip next bi-gram "computing_because" ("computing" is already used)
"because_it's".split("_")[0]" -> "because" etc.

为了同时捕获句子中的最后一个词(“便宜”),我添加了标记“EOL”。我在 python 中实现了这个,速度还可以(3 分钟内 500k 字),i5 处理器,8G。无论如何,你只需要做一次。我发现这比官方(spacy 风格)块方法更直观。它也适用于非 spacy 框架。

我在官方 tokenization/lemmatization 之前就这样做了,因为你会得到“云计算”作为可能的二元组。但我不确定这是否是 best/right 方法。

如果你有spacydoc,可以传给textacy:

ngrams = list(textacy.extract.basics.ngrams(doc, 2, min_freq=2))

警告:这只是 Zuzana 做出的正确答案的扩展。

我的声誉不允许我发表评论,所以我做这个回答只是为了回答上面 Adit Sanghvi 的问题:当你有一个文件列表时你是怎么做的?

1.-首先您需要创建一个包含文档文本的列表 2.-然后您将文本列表加入到一个文档中 3.-现在您使用 spacy 解析器将文本文档转换为 Spacy 文档 4.-你使用 Zuzana 的答案来创建 de bigrams

这是示例代码:

第 1 步

doc1 = ['all what i want is that you give me back my code because i worked a lot on it. Just give me back my code']
doc2 = ['how are you? i am just showing you an example of how to make bigrams on spacy. We love bigrams on spacy']
doc3 = ['i love to repeat phrases to make bigrams because i love  make bigrams']
listOfDocuments = [doc1,doc2,doc3]
textList = [''.join(textList) for text in listOfDocuments for textList in text]
print(textList)

这将打印此文本:

['all what i want is that you give me back my code because i worked a lot on it. Just give me back my code', 'how are you? i am just showing you an example of how to make bigrams on spacy. We love bigrams on spacy', 'i love to repeat phrases to make bigrams because i love make bigrams']

然后第 2 步和第 3 步:

doc = ' '.join(textList)
spacy_doc = parser(doc)
print(spacy_doc)

并将打印:

我只想要你把我的代码还给我,因为我在上面做了很多工作。把我的代码还给我你好吗?我只是向您展示如何在 spacy 上制作双字母组的示例。我们喜欢 spacy 上的 bigrams 我喜欢重复短语来制作 bigrams 因为我喜欢制作 bigrams

最后是第 4 步(Zuzana 的回答)

ngrams = list(textacy.extract.ngrams(spacy_doc, 2, min_freq=2))
print(ngrams)

将打印此:

[制作双字母,制作双字母,制作双字母]