Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

word2vec_skipgram #818

Open
xialei2821212670 opened this issue Aug 12, 2020 · 20 comments · Fixed by #832
Open

word2vec_skipgram #818

xialei2821212670 opened this issue Aug 12, 2020 · 20 comments · Fixed by #832
Assignees
Labels
nlp Issues of NLP model

Comments

@xialei2821212670
Copy link

image
这边是传啥

@Steffy-zxf
Copy link
Contributor

你好!请使用hub show word2vec_skipgram查看word2vec_skipgram module的版本。请问你想做什么任务呢?

@Steffy-zxf Steffy-zxf self-assigned this Aug 13, 2020
@xialei2821212670
Copy link
Author

你好!请使用hub show word2vec_skipgram查看word2vec_skipgram模块的版本。请问你想做什么任务呢?

我想简单的使用demo里面的sensim.py,尝试使用。用于检测2句话的相似度

@Steffy-zxf
Copy link
Contributor

Steffy-zxf commented Aug 13, 2020

你可以尝试PaddleHub 1.8版本之后支持的文本语义匹配任务,注意请安装word2vec_skipgram (1.1.0版本,hub install word2ec_skipgram==1.1.0
详细教程:
https://aistudio.baidu.com/aistudio/projectdetail/705526
https://aistudio.baidu.com/aistudio/projectdetail/709472

demo:
https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pointwise_text_matching
https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pairwise_text_matching

如果只是想简单体验了下word2vec做两句话的语义相似度,请安装word2vec_skipgram (1.0.0版本,hub install word2ec_skipgram==1.0.0),代码参考:https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.8/docs/tutorial/sentence_sim.md

@Steffy-zxf Steffy-zxf added the nlp Issues of NLP model label Aug 13, 2020
@xialei2821212670
Copy link
Author

你可以尝试PaddleHub 1.8版本之后支持的文本语义匹配任务,注意请安装word2vec_skipgram(1.1.0版本,hub install word2ec_skipgram==1.1.0
详细教程:
https : //aistudio.baidu.com/aistudio/projectdetail/705526
https://aistudio.baidu .com / aistudio / projectdetail / 709472

演示:
https : //github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pointwise_text_matching
https://github.com/PaddlePaddle/PaddleHub/tree/release/v1.8/demo/pairwise_text_matching

如果只是想简单体验了下word2vec做两句话的语义相似度,请安装word2vec_skipgram(1.0.0版本,hub install word2ec_skipgram==1.0.0),代码参考:https : //github.com/PaddlePaddle/PaddleHub/blob/release/v1.8 /docs/tutorial/sentence_sim.md

你好,谢谢。我已经解决了问题,这个预测时间6秒一个,是我没开启gpu?

@Steffy-zxf
Copy link
Contributor

这个预测时间6秒一个,是我没开启gpu?

预测代码是什么样的呢?是如何统计时间的呢?

@xialei2821212670
Copy link
Author

这个预测时间6秒一个,是我没开启gpu吗?

预测代码是某种的呢?是如何统计时间的呢?

执行词法分析很快,但是执行,哪个word2vec_skipgram 模型,比较耗时。时间一直超过5秒的样子。

@Steffy-zxf
Copy link
Contributor

Steffy-zxf commented Aug 18, 2020

执行词法分析很快,但是执行,哪个word2vec_skipgram 模型,比较耗时。时间一直超过5秒的样子。

预测代码是什么样的呢?

@T-baby
Copy link
Contributor

T-baby commented Aug 19, 2020

1.1.0 版本中如果只是想简单的获取词语的向量该怎么获取呢?

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

@Steffy-zxf 我试了之前的 demo,似乎 1.1.0 版本与 1.0.0 版本差异非常大。有 1.1.0 版本的 demo 吗?

@Steffy-zxf
Copy link
Contributor

@T-baby 1.1.0 word2vec获取词向量,参考以下代码:

import paddle.fluid as fluid
import paddlehub as hub

raw_data = ["驾驶违章一次扣12分用两个驾驶证处理可以吗", 
            "一次性扣12分的违章,能用不满十二分的驾驶证扣分吗", 
            "水果放冰箱里储存好吗", "中国银行纪念币网上怎么预约",
            "电脑反应很慢怎么办", "反应速度慢,电脑总是卡是怎么回事"]
max_seq_len = 50

module = hub.Module(name="word2vec_skipgram", version='1.1.0')
inputs, outputs, program = module.context(trainable=False,max_seq_len= max_seq_len)

word_ids = inputs["text"]
embedding = outputs["emb"]

tokenizer = hub.CustomTokenizer(vocab_file=module.get_vocab_path())


place = fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=[word_ids], place=place)

for data in raw_data:
    data_dict = tokenizer.encode(text=data, max_seq_len=max_seq_len)
    text = data_dict['text']
    
    vecs, = exe.run(
        program,
        feed=feeder.feed([[text]]),
        fetch_list=[embedding.name],
        return_numpy=True)
    print("The input text is {}, and the embeddings are ".format(data))
    print(vecs)

NOTE:

  1. 上述module.context接口和tokenizer.encode接口,参数max_seq_len设置请保持一致。
  2. 由于word2vec 1.1.0版本升级为padding方式输入,所以请配合CustomTokenizer使用

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

@T-baby 1.1.0 word2vec获取词向量,参考以下代码:

import paddle.fluid as fluid
import paddlehub as hub

raw_data = ["驾驶违章一次扣12分用两个驾驶证处理可以吗", 
            "一次性扣12分的违章,能用不满十二分的驾驶证扣分吗", 
            "水果放冰箱里储存好吗", "中国银行纪念币网上怎么预约",
            "电脑反应很慢怎么办", "反应速度慢,电脑总是卡是怎么回事"]
max_seq_len = 50

module = hub.Module(name="word2vec_skipgram", version='1.1.0')
inputs, outputs, program = module.context(trainable=False,max_seq_len= max_seq_len)

word_ids = inputs["text"]
embedding = outputs["emb"]

tokenizer = hub.CustomTokenizer(vocab_file=module.get_vocab_path())


place = fluid.CPUPlace()
exe = fluid.Executor(place)
feeder = fluid.DataFeeder(feed_list=[word_ids], place=place)

for data in raw_data:
    data_dict = tokenizer.encode(text=data, max_seq_len=max_seq_len)
    text = data_dict['text']
    
    vecs, = exe.run(
        program,
        feed=feeder.feed([[text]]),
        fetch_list=[embedding.name],
        return_numpy=True)
    print("The input text is {}, and the embeddings are ".format(data))
    print(vecs)

NOTE:

  1. 上述module.context接口和tokenizer.encode接口,参数max_seq_len设置请保持一致。
  2. 由于word2vec 1.1.0版本升级为padding方式输入,所以请配合CustomTokenizer使用

非常感谢

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

tokenizer.encode 有 文档地址吗?

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

非常奇怪的是如果 hub.Module(name="word2vec_skipgram", version="1.1.0") ,指定了版本,似乎每次运行都会重新下载一次模型文件?我电脑上是每次都会出现。

paddlepaddle == 1.8.3
paddlehub == 1.8.0

@Steffy-zxf
Copy link
Contributor

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

还想请问下,max_seq_len 的主要作用是?这个参数很少在 word2vec 中见到。

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

tokenizer.py 第 206 行,重复进行了 convert_tokens_to_ids 操作。有两行一模一样的。

ids = self.convert_tokens_to_ids(tokens)
return self.convert_tokens_to_ids(tokens)

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

还有就是 1.1.0 版本中没有考虑到如果分词中存在 Word Embedding 的未登录词的情况。

@T-baby
Copy link
Contributor

T-baby commented Aug 20, 2020

tokenizer.py 第 125 行,又重复进行了 self._convert_token_to_id(token)。

@Steffy-zxf
Copy link
Contributor

Steffy-zxf commented Aug 20, 2020

max_seq_len 的主要作用?

max_seq_len的作用:将输入的text 切词后单词个数不足max_seq_len,会进行补齐。如果切词后单词个数超过max_seq_len,会进行截断。

tokenizer.py 第 206 行,重复进行了 convert_tokens_to_ids 操作。有两行一模一样的。

感谢反馈问题!可以提pr帮我们修复code重复问题。

还有就是 1.1.0 版本中没有考虑到如果分词中存在 Word Embedding 的未登录词的情况。

tokenizer有考虑未登录词的问题,参考:https://github.com/PaddlePaddle/PaddleHub/blob/release/v1.8/paddlehub/tokenizer/tokenizer.py#L81
查找未登录词时,会返回None。

@Steffy-zxf Steffy-zxf linked a pull request Aug 25, 2020 that will close this issue
@748572179
Copy link

您好,可以将生成好的词向量转换成原始文本嘛?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
nlp Issues of NLP model
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants