小编use*_*036的帖子

PySpark - 使用爆炸功能后添加行号

我正在做一个 nlp 项目,并且有包含多个句子的评论。我正在使用 Spark-nlp 包,该包输出一列,其中包含每条评论中的句子列表。我正在使用爆炸为每个句子创建一行,但我想添加编号,这样我就知道哪个句子是第一个、第二个等。我不知道如何使用 row_number() 因为我真的没有任何东西可以 orderBy 。

我的数据如下所示:

REVIEW_ID REVIEW_COMMENTS     SENTENCES_LIST           
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]   
    2     Yeah. Ok.           [Yeah., Ok.]  
Run Code Online (Sandbox Code Playgroud)

这就是我想要的样子:

REVIEW_ID REVIEW_COMMENTS     SENTENCES_LIST           SENTENCE  SENT_NUMBER
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Hi.       1
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Sent1.    2
    1     Hi. Sent1. Sent2.   [Hi., Sent1., Sent2.]    Sent2.    3
    2     Yeah. Ok.           [Yeah., Ok.]             Yeah.     1
    2     Yeah. Ok.           [Yeah., Ok.]             Ok.       2
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的代码,但不确定如何使用 row_number(),因为除了它放置在 SENTENCES_LIST 中之外,我没有可用作“orderBy”的列。

df2 = df.withColumn('SENTENCE', F.explode('SENTENCES_LIST')) …
Run Code Online (Sandbox Code Playgroud)

row-number explode apache-spark pyspark

8
推荐指数
1
解决办法
1885
查看次数

如何使用 spacy_langdetect 包中的 LanguageDetector()?

我正在尝试使用 spacy_langdetect 包,我能找到的唯一示例代码是(https://spacy.io/universe/project/spacy-langdetect):

import spacy
from spacy_langdetect import LanguageDetector
nlp = spacy.load("en_core_web_sm")
nlp.add_pipe(LanguageDetector(), name='language_detector', last=True)
text = 'This is an english text.'
doc = nlp(text)
print(doc._.language)
Run Code Online (Sandbox Code Playgroud)

它抛出错误:nlp.add_pipe现在采用已注册组件工厂的字符串名称,而不是可调用组件。

所以我尝试使用下面的添加到我的 nlp 管道

language_detector = LanguageDetector()
nlp.add_pipe("language_detector")
Run Code Online (Sandbox Code Playgroud)

但这会产生错误:找不到语言英语(en)的“language_detector”工厂。当 spaCynlp.create_pipe使用未在当前语言类上注册的自定义组件名称进行调用时,通常会发生这种情况。如果您使用的是 Transformer,请确保安装“spacy-transformers”。如果您使用的是自定义组件,请确保您已经添加了装饰器@Language.component(对于函数组件)或@Language.factory(对于类组件)。可用工厂:attribute_ruler、tok2vec、merge_noun_chunks、merge_entities、merge_subtokens、token_splitter、parser、beam_parser、entity_linker、ner、beam_ner、entity_ruler、lemmatizer、tagger、morphologizer、sender、sentencizer、textcat、en.

我不完全明白如何添加它,因为它不是一个真正的自定义组件。

python spacy

5
推荐指数
2
解决办法
991
查看次数

Spacy Matcher - 只匹配最长的字符串

我正在尝试使用 spacy 模式匹配器创建名词块。例如,如果我有一句话“冰球混战花了几个小时。” 我想返回“冰球混战”和“小时”。我目前有这个:

from spacy.matcher import Matcher
nlp = spacy.load("en_core_web_sm")

matcher = Matcher(nlp.vocab)
matcher.add("NounChunks", None,  [{"POS": "NOUN"}, {"POS": "NOUN", "OP": "*"}, {"POS": "NOUN", "OP": "*"}] )

doc = nlp("The ice hockey scrimmage took hours.")
matches = matcher(doc)

for match_id, start, end in matches:
    string_id = nlp.vocab.strings[match_id] 
    span = doc[start:end]  
    print(match_id, string_id, start, end, span.text)
Run Code Online (Sandbox Code Playgroud)

但它返回的是“冰球混战”的所有版本,而不仅仅是最长的版本。

12482938965902279598 NounChunks 1 2 ice
12482938965902279598 NounChunks 1 3 ice hockey
12482938965902279598 NounChunks 2 3 hockey
12482938965902279598 NounChunks 1 4 ice hockey scrimmage
12482938965902279598 …
Run Code Online (Sandbox Code Playgroud)

python matcher spacy

4
推荐指数
1
解决办法
1417
查看次数

根据列值生成行数 - Pandas/Python

我想根据两列 (index_startindex_end) 中的数值扩展我的数据框。我的 df 看起来像这样:

item  index_start  index_end    
A          1            3
B          4            7
Run Code Online (Sandbox Code Playgroud)

我希望它扩展以创建从 1 到 3 的 A 行和从 4 到 7 的 B 行,就像这样。

item  index_start  index_end    index
A          1            3         1
A          1            3         2
A          1            3         3
B          4            7         4
B          4            7         5
B          4            7         6
B          4            7         7
Run Code Online (Sandbox Code Playgroud)

不确定如何在 Python/pandas 中实现这一点。

python dataframe pandas

4
推荐指数
1
解决办法
77
查看次数

过滤 PySpark 中的任何非字母数字

使用 Pyspark 和 spacy 包并拥有一个带有标记的数据集,我试图过滤掉具有包含符号或非字母数字字符的标记的任何行。

the
house
#
was
in
the)
400s
w-ow
$crazy
Run Code Online (Sandbox Code Playgroud)

应该只返回

the
house
was
in
400s
Run Code Online (Sandbox Code Playgroud)

我尝试使用类似的东西 F.regexp_extract(F.col('TOKEN'), '[^[A-Za-z0-9] ]', 0),但我想搜索整个标记而不仅仅是索引 0。我考虑过使用 contains() 语句,但这似乎我必须做大量不同的 or 语句来捕获我想要的所有不同符号排除

regex contains pyspark spacy

3
推荐指数
1
解决办法
4101
查看次数