我正在尝试使用Gensim(https://radimrehurek.com/gensim/corpora/dictionary.html)中的filter_extremes函数按令牌的频率过滤掉令牌。具体来说,我有兴趣过滤掉“频率低于no_below文档”和“频率高于no_above文档”中出现的单词。
id2word_ = corpora.Dictionary(texts)
print(len(id2word_))
id2word_.filter_extremes(no_above = 0.600)
print(len(id2word_))
第一个打印语句给出11918,第二个打印语句给出3567。但是,如果我执行以下操作:
id2word_ = corpora.Dictionary(texts)
print(len(id2word_))
id2word_.filter_extremes(no_below = 0.599)
print(len(id2word_))
第一个打印语句给出了11918(按预期),第二个打印语句给出了11406。id2word_.filter_extremes(no_below = 0.599)
和id2word_.filter_extremes(no_above = 0.600)
是否不应该总计单词总数?但是,11406 + 3567> 11918,那么这个总和为什么超过了语料库中的单词数呢?这没有意义,因为基于文档中的解释,过滤器应覆盖不重叠的单词。
如果您有任何想法,我将非常感谢您的投入!谢谢!
答案 0 :(得分:1)
关于Gensim中的filter_extremes,“ no_above”和“ no_below”参数的单位实际上是不同的。老实说,这有点奇怪。
对于“ no_above”,您要在其中放置一个介于0和1之间的数字(浮点)。它应该是一个百分比,代表一个单词在整个语料库中所占的比例。
对于“ no_below”,您想要一个整数。它应该是单词在语料库中出现的次数。这是一个阈值。
希望它可以澄清您的问题。
答案 1 :(得分:0)
根据定义:
@main.route('/search_results', methods=['GET', 'POST'])
@login_required
def search_results():
""" Here we make the search request and then display the results. We bring in
the params via the url, then use whooshalchemy to search fields we marked
with __searchable__ in the model. If advanced search is selected, we then filter
the results before we display. Note that there are two separate searches for the
separate data types. """
subject = request.args.get('subject')
search_type = request.args.get('search_type')
acct_no = request.args.get('acct_no')
id_ = request.args.get('id_')
rep = request.args.get('rep')
ops = request.args.get('ops')
compliance = request.args.get('compliance')
results = []
...
else:
results = db.session.query(Envelope)
if subject is not None and subject is not '':
results = results.filter(Envelope.subject.like('%'+subject+'%'))
if acct_no is not None and acct_no is not '':
results = results.filter_by(acct_no=acct_no)
if id_ is not None and id_ is not None:
id_ = int(id_)
results = results.filter_by(envelope_id=id_)
if rep is not None and rep is not '' :
results = results.filter_by(initiator=rep)
if ops is not None and ops is not '':
ops_name = external_db.get_fullname_from_username(ops)
for result in results:
if db.session.query(Envelope_recipient).filter_by(envelope_id=result.envelope_id,role='Operations',name=ops_name).first() == None:
results = results.filter(Envelope.envelope_id != result.envelope_id)
if compliance is not None and compliance is not '':
compliance_name = external_db.get_fullname_from_username(ops)
for result in results:
if db.session.query(Envelope_recipient).filter_by(envelope_id=result.envelope_id,role='Compliance',name=compliance_name).first() == None:
results = results.filter(Envelope.envelope_id != result.envelope_id)
#results.all() is a list of all esignature.models.Envelope or .Process_item objects
results = results.all()
return render_template('search_results.html', subject=subject,
search_type=search_type, acct_no=acct_no,
id_=id_, rep=rep, ops=ops,
compliance=compliance, results=results)
no_below是一个整数,它表示一个阈值,该阈值过滤掉了一定数量以上的文档中令牌出现的数量。例如使用no_below过滤掉出现次数少于10次的单词。
相反,no_above不是int而是代表总语料库大小派系的浮点数。例如使用no_above过滤掉出现在所有文档中超过10%的单词。
no_below和no_above不代表相同的单位,因此造成混淆,这有点奇怪。
希望这能回答您的问题。
答案 2 :(得分:0)
我将其写为其他用户答案的扩展。是的,这两个参数不同,并且控制不同种类的令牌频率。另外请注意以下错误:filter_extremes将默认值分配给no_above和no_below,因此,如果您编写:
id2word_.filter_extremes(no_below = 0.599)
有效
id2word_.filter_extremes(no_below = 0.599, no_above=0.5)
答案 3 :(得分:0)
希望您找到了答复的答案。我一直在研究gensim库,发现这两个参数'no_below'和'no_above'可能最好一起使用。 TS所说的 no_below 很简单,如果频率不小于参数,则返回令牌。
一些代码示例,我不确定是否有最佳实践,但是我通常会从1(或语料库的100%)开始修改 no_above ,这使得过滤不包括整个语料库
# filter if frequency not less than 2
# and tokens contained not more than 90% of corpus
dictionary.filter_extremes(no_below=2, no_above=0.9)
print(len(dictionary))
# filter if frequency not less than 3
# and tokens contained not more than 100% of corpus
dictionary.filter_extremes(no_below=3, no_above=1)
print(len(dictionary))
通常,从 no_above 语料库100%开始,然后进行调整。