问题标签 [trigram]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
913 浏览

python - sqlalchemy 中的三元组距离操作

我目前正在尝试使用 pg_trgm 操作%<->. 列上的 GIN 索引已经可用,但我找不到与前面提到的运算符等效的 sqlalchemy。

除了编写纯文本查询之外,解决此问题的最佳方法是什么。

一个简单的示例查询是:

上面的查询显然不起作用,选择和过滤字符串只是占位符,用于可视化我打算做什么。

0 投票
1 回答
140 浏览

postgresql - Postgres 相似度函数不恰当地使用三元组索引

我有一个简单的person表,其中有一last_name列我添加了 GIST 索引

根据https://www.postgresql.org/docs/10/pgtrgm.html上的文档,<->操作员应该使用这个索引。但是,当我实际尝试使用此查询使用此差异运算符时:

我得到了这个:

而且看起来并没有使用索引。但是,如果我将%运算符与此命令一起使用:

它似乎使用索引:

我还注意到,如果我将运算符移动到查询的选择部分,索引会再次被忽略:

我是否遗漏了一些关于相似度函数如何使用三元索引的明显内容?

我在 OSX 上使用 Postgres 10.5。

编辑 1

根据 Laurenz 的建议,我尝试设置enable_seqscan = off,但不幸的是,使用<->操作员的查询似乎仍然忽略了索引。

0 投票
1 回答
367 浏览

nlp - 如何在我自己的语料库上训练 ngram 模型

我有一个字符串列表的语料库:

我想在这个语料库上建立一个语言模型(最好使用 nltk),以获得一个单词在一个句子中的概率。所以,我以后的用法是得到

P(“山姆”|“我是”)

在这个语料库中。我找不到 - 最好的方法是什么?如何训练一个 ngram 模型,然后得到这样的概率?

谢谢!

0 投票
1 回答
1860 浏览

python - Python Pandas NLTK 从数据帧“join()参数”错误中的文本字段中提取常用短语(ngram)

我有以下示例数据框:

'problem_definition_stopwords' 字段已经被标记化,去除了停用词。

我想从“problem_definition_stopwords”字段创建 n-gram。具体来说,我想从我的数据中提取 n-gram 并找到具有最高点互信息 (PMI) 的那些。

本质上,我想找到同时出现的单词比我偶然期望的要多得多。

我尝试了以下代码:

我收到的错误是在第三块代码上... TypeError: join() argument must be str or bytes, not 'list'

编辑:DataFrame 的一种更便携的格式:

0 投票
1 回答
36 浏览

sql - 使用 postgresql 进行文本搜索

我有一个用例,我想按公司名称或部门名称搜索公司。如果我在搜索查询中输入部门名称,它应该返回具有该部门的公司的名称。

为了实现这一点,我创建了一个包含公司名称的表和一个包含公司名称的列以及由空格分隔的部门名称。

首先,我尝试在列上进行全文搜索,但在 FTS 查询中,仅当与 ts_vector 函数创建的向量完全匹配时才会返回结果。

然后我尝试使用产生更好结果的三元组进行搜索,但是当我输入带有任何部门名称的公司名称时,我没有得到结果,因为创建的三元组与搜索查询的顺序不同。

我可以做些什么来改善我在桌子上的搜索?

0 投票
1 回答
463 浏览

django - Django trigram_similar 搜索不返回任何结果(带有 Postgresql 10.5 后端的 Django 2.1)

我按照https://docs.djangoproject.com/en/2.1/ref/contrib/postgres/lookups/#std:fieldlookup-trigram_similar上的说明在我的搜索引擎上安装三元组搜索。我在我的 in 中添加'django.contrib.postgres'INSTALLED_APPS在我的PostgreSQL 数据库上settings.py安装了pg_trgm扩展。trigram 搜索没有返回结果,但没有错误,只是在应该有搜索结果的地方出现空白。我的搜索引擎在搜索中运行良好icontain。这是我的搜索引擎的代码trigram_similar

TitleCharField在我的模型中是一个cross_currents

这是我的 Django shell 给我的:

HTML 页面也不返回任何内容。但是,当我这样做时

出现了很多结果。知道为什么我的三元组搜索什么都不返回吗?

0 投票
1 回答
1662 浏览

python - 在python代码中实现n-gram用于多类文本分类

我是 python 新手,致力于建筑行业合同文件的多类文本分类。我在我的代码中实现 n-gram 时遇到了问题,我通过从不同的在线资源获得帮助来生成表单。我想在我的代码中实现 unigram、bi-gram 和 tri-gram。在这方面的任何帮助将不胜感激。

我在我的代码的 Tfidf 部分中尝试了二元组和三元组,但它正在工作。

文件“C:\Users\fhassan\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py”,第 328 行,在 tokenize(preprocess(self.decode(doc))),stop_words)

文件“C:\Users\fhassan\anaconda3\lib\site-packages\sklearn\feature_extraction\text.py”,第 256 行,返回 lambda x: strip_accents(x.lower())

文件“C:\Users\fhassan\anaconda3\lib\site-packages\scipy\sparse\base.py”,第 686 行,在getattr raise AttributeError(attr + " not found")

AttributeError:未找到下限

0 投票
2 回答
909 浏览

sql - Postgresql 位图堆扫描慢

我的桌子看起来像:

我需要使用ILIKEon搜索表格search_string
同一个请求中可能有许多不同的搜索查询。

我的查询看起来像:

解释无索引搜索

我试图通过创建 GIN 索引使其更快:

解释用索引搜索

为什么我的索引搜索比 seq 扫描慢?
有什么方法可以使这种类型的搜索更快吗?

0 投票
2 回答
1361 浏览

python - 使用 postgres 将 trigram 相似性和全文搜索与 Q ind django 结合时性能不佳

我正在创建一个 Web 应用程序来搜索具有教育、经验等属性的人。我不能对所有字段使用全文搜索,因为有些必须是模糊匹配。(例如:如果我们搜索 biotech,它应该选择 bio tech、biotech 和 bio-tech)。我的数据库在配置文件模型中有大约 200 个条目,这些条目将出现在搜索结果中。

教育和经验等其他模型通过外键连接到个人资料

因此,我决定选择在什么领域使用什么方法。对于学位名称等较短的字段(在教育模型中),我想使用三元相似度。对于教育描述等领域,我使用全文搜索。

但是,由于我必须在多个字段中执行此操作,因此我使用了简单的查找而不是使用搜索向量。

我每次搜索都会得到预期的结果。但是,获得它所需的时间非常缓慢。我不知道如何使它更快。

0 投票
0 回答
38 浏览

elasticsearch - ElasticSearch:我如何影响三元组匹配的“方向性”?

我们使用 elasticsearch 来搜索地址数据,并且为了非精确匹配,我们包含了街道名称的字段变体,它使用 ngram 标记器(具体为三元组)进行分析。我们对该字段的查询使用“3<75%”的最小应该匹配子句,这意味着“如果搜索词中有 3 个或更少的三元组,那么它们都必须匹配。如果超过 3 个,则其中 75% 必须匹配'

通常这可以正常工作,但在某些情况下我们会得到这样的意外结果

我们搜索“Uhland”并找到“Am Maschlandgraben”。据我所知,发生的情况是“Uhland”被拆分为“uhl”、“hla”、“lan”、“and”,这 4 个三元组中的 3 个可以与“Am MascHLANDgraben”的三元组匹配(匹配部分大写)。所以,四分之三是 75% 满足我们的“3<75%”要求,所以它变成了匹配。

所以 75% 的匹配有一个“方向性”(因为没有更好的词)。它只查看/计算搜索词中的词数,并忽略索引文档中有多少三元组不匹配。

有人可能会争辩说,在该示例中不满足 75% 的匹配要求,因为“Am Maschlandgraben”的 13 个三元组中有 10 个与“Uhland”的三元组不匹配。事实上,如果您反转查询并搜索“Am Maschlandgraben”,您将找不到“Uhland”作为匹配项。因为现在“方向性”颠倒了,查询发现13个三元组中只有3个匹配,不符合“3<75%”的要求

我想弄清楚的是如何修改查询,使 75% 的匹配没有“方向性”,并且始终必须在比较的“双方”上匹配。所以继续上面的例子,我既不希望“Uhland”匹配“Am Maschlandgraben”,也不希望“Am Maschlandgraben”匹配“Uhland”

所以我想,用现实生活中的语言来说,而不是“75% 的搜索词三元组需要匹配索引文档”,我希望“75% 的搜索词和索引文档三元组需要匹配”

我希望我能很好地传达我的意图(英语不是我的母语)

这是我们的查询现在看起来如何的示例_