标签: n-gram

蟒蛇n克,四,五,六克?

我正在寻找一种将文本分成n-gram的方法.通常我会做类似的事情:

import nltk
from nltk import bigrams
string = "I really like python, it's pretty awesome."
string_bigrams = bigrams(string)
print string_bigrams
Run Code Online (Sandbox Code Playgroud)

我知道nltk只提供bigrams和trigrams,但有没有办法将我的文本分成4克,5克甚至100克?

谢谢!

python string nltk n-gram

115
推荐指数
7
解决办法
12万
查看次数

在Python中简单实现N-Gram,tf-idf和余弦相似性

我需要比较存储在数据库中的文档,并得出0到1之间的相似性得分.

我需要使用的方法必须非常简单.实现n-gram的vanilla版本(可以定义要使用的克数),以及tf-idf和余弦相似度的简单实现.

有没有可以做到这一点的程序?或者我应该从头开始写这个?

python document tf-idf n-gram vsm

52
推荐指数
3
解决办法
4万
查看次数

Elasticsearch:查找子字符串匹配

我想要执行精确的单词匹配和部分单词/子串匹配.例如,如果我搜索"男士剃须刀",那么我应该能够在结果中找到"男士剃须刀".但是在我搜索"en的剃须刀"的情况下,我也应该能够在结果中找到"男士剃须刀".我使用以下设置和映射:

索引设置:

PUT /my_index
{
    "settings": {
        "number_of_shards": 1, 
        "analysis": {
            "filter": {
                "autocomplete_filter": { 
                    "type":     "edge_ngram",
                    "min_gram": 1,
                    "max_gram": 20
                }
            },
            "analyzer": {
                "autocomplete": {
                    "type":      "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "autocomplete_filter" 
                    ]
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

映射:

PUT /my_index/my_type/_mapping
{
    "my_type": {
        "properties": {
            "name": {
                "type":            "string",
                "index_analyzer":  "autocomplete", 
                "search_analyzer": "standard" 
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

插入记录:

POST /my_index/my_type/_bulk
{ "index": { "_id": 1            }}
{ "name": "men's shaver" }
{ "index": { "_id": 2 …
Run Code Online (Sandbox Code Playgroud)

substring autocomplete stringtokenizer n-gram elasticsearch

46
推荐指数
2
解决办法
3万
查看次数

Python:减少字典的内存使用量

我正在尝试将几个文件加载到内存中.这些文件具有以下3种格式之一:

  • string TAB int
  • 字符串TAB浮点数
  • int TAB float.

实际上,它们是ngram静态文件,以防这有助于解决方案.例如:

i_love TAB 10
love_you TAB 12
Run Code Online (Sandbox Code Playgroud)

目前,我正在做的伪代码是

loadData(file):
     data = {}
     for line in file:
        first, second = line.split('\t')
        data[first] = int(second) #or float(second)

     return data
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,虽然磁盘中文件的总大小约为21 MB,但当加载到内存中时,该过程需要120 - 180 MB的内存!(整个python应用程序不会将任何其他数据加载到内存中).

只有不到10个文件,大多数文件在大约50-80k行保持稳定,除了一个目前有数百万行的文件.

所以我想要一个技术/数据结构来减少内存消耗:

  • 有关压缩技术的建议吗?
  • 如果我仍然使用dict,有没有办法减少内存?是否可以像Java dict中那样设置"加载因子"?
  • 如果你有其他一些数据结构,我也愿意交换一些速度来减少内存.然而,这是一个时间敏感的应用程序,所以一旦用户输入他们的查询,我认为花费超过几秒钟来返回结果是不太合理的.关于这一点,我仍然惊讶于谷歌如何设法如此快速地进行谷歌翻译:他们必须使用大量技术+大量服务器的力量?

非常感谢你.我期待着你的建议.

python memory compression dictionary n-gram

45
推荐指数
4
解决办法
4万
查看次数

从句子生成N-gram

如何生成一个n-gram的字符串,如:

String Input="This is my car."
Run Code Online (Sandbox Code Playgroud)

我想用这个输入生成n-gram:

Input Ngram size = 3
Run Code Online (Sandbox Code Playgroud)

输出应该是:

This
is
my
car

This is
is my
my car

This is my
is my car
Run Code Online (Sandbox Code Playgroud)

在Java中给出一些想法,如何实现它或者是否有可用的库.

我正在尝试使用这个NGramTokenizer,但它给出了n-gram的字符序列,我想要n-gram的单词序列.

java lucene nlp n-gram

28
推荐指数
3
解决办法
5万
查看次数

使用ElasticSearch搜索文件名

我想使用ElasticSearch搜索文件名(而不是文件的内容).因此,我需要找到文件名的一部分(完全匹配,没有模糊搜索).

示例:
我有以下名称的文件:

My_first_file_created_at_2012.01.13.doc
My_second_file_created_at_2012.01.13.pdf
Another file.txt
And_again_another_file.docx
foo.bar.txt
Run Code Online (Sandbox Code Playgroud)

现在我想搜索2012.01.13获取前两个文件.
搜索fileile应返回除最后一个之外的所有文件名.

我如何使用ElasticSearch实现这一目标?

这是我测试过的,但它总是返回零结果:

curl -X DELETE localhost:9200/files
curl -X PUT    localhost:9200/files -d '
{
  "settings" : {
    "index" : {
      "analysis" : {
        "analyzer" : {
          "filename_analyzer" : {
            "type" : "custom",
            "tokenizer" : "lowercase",
            "filter"    : ["filename_stop", "filename_ngram"]
          }
        },
        "filter" : {
          "filename_stop" : {
            "type" : "stop",
            "stopwords" : ["doc", "pdf", "docx"]
          },
          "filename_ngram" : {
            "type" : "nGram",
            "min_gram" : …
Run Code Online (Sandbox Code Playgroud)

lucene n-gram elasticsearch

28
推荐指数
1
解决办法
1万
查看次数

理解sklearn中CountVectorizer中的`ngram_range`参数

我对如何在Python中的scikit-learn库中使用ngrams感到有点困惑,具体来说,这个ngram_range参数在CountVectorizer中是如何工作的.

运行此代码:

from sklearn.feature_extraction.text import CountVectorizer
vocabulary = ['hi ', 'bye', 'run away']
cv = CountVectorizer(vocabulary=vocabulary, ngram_range=(1, 2))
print cv.vocabulary_
Run Code Online (Sandbox Code Playgroud)

给我:

{'hi ': 0, 'bye': 1, 'run away': 2}
Run Code Online (Sandbox Code Playgroud)

在我明显错误的印象中,我会得到unigrams和bigrams,就像这样:

{'hi ': 0, 'bye': 1, 'run away': 2, 'run': 3, 'away': 4}
Run Code Online (Sandbox Code Playgroud)

我正在使用这里的文档:http: //scikit-learn.org/stable/modules/feature_extraction.html

显然,我对如何使用ngrams的理解存在严重错误.也许这个论点没有效果,或者我对一个真正的二元组有一些概念上的问题!我很难过.如果有人提出建议,我会感激不尽.

更新:
我意识到了我的方式的愚蠢.我的印象是ngram_range会影响词汇,而不是语料库.

python n-gram feature-selection scikit-learn

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

在python nltk中计算n-gram频率

我有以下代码.我知道我可以使用apply_freq_filter函数来过滤掉小于频率计数的搭配.但是,在我决定为过滤设置的频率之前,我不知道如何在文档中获取所有n-gram元组的频率(在我的情况下是bi-gram).如您所见,我正在使用nltk collocations类.

import nltk
from nltk.collocations import *
line = ""
open_file = open('a_text_file','r')
for val in open_file:
    line += val
tokens = line.split()

bigram_measures = nltk.collocations.BigramAssocMeasures()
finder = BigramCollocationFinder.from_words(tokens)
finder.apply_freq_filter(3)
print finder.nbest(bigram_measures.pmi, 100)
Run Code Online (Sandbox Code Playgroud)

python nltk n-gram

24
推荐指数
4
解决办法
4万
查看次数

使用Python计算N Grams

我需要为包含以下文本的文本文件计算Unigrams,BiGrams和Trigrams:

"囊性纤维化仅影响美国3万名儿童和青少年.吸入盐水雾可减少充满囊性纤维化患者呼吸道的脓液和感染,但副作用包括令人讨厌的咳嗽和严酷的味道.这就是结论在本周出版的"新英格兰医学杂志"上发表的两项研究."

我从Python开始并使用以下代码:

#!/usr/bin/env python
# File: n-gram.py
def N_Gram(N,text):
NList = []                      # start with an empty list
if N> 1:
    space = " " * (N-1)         # add N - 1 spaces
    text = space + text + space # add both in front and back
# append the slices [i:i+N] to NList
for i in range( len(text) - (N - 1) ):
    NList.append(text[i:i+N])
return NList                    # return the list
# test code
for i in range(5):
print …
Run Code Online (Sandbox Code Playgroud)

python nlp nltk n-gram

23
推荐指数
4
解决办法
7万
查看次数

"Anagram求解器"基于统计而不是字典/表格?

我的问题在概念上类似于解决字谜,除了我不能只使用字典查找.我试图找到合理的词而不是真实的词.

我已经基于一堆文本中的字母创建了一个N-gram模型(现在,N = 2).现在,给定一个随机的字母序列,我想根据转移概率将它们置于最可能的序列中.我认为在开始时我需要维特比算法,但随着我看起来更深入,维特比算法根据观察到的输出优化了一系列隐藏的随机变量.我正在尝试优化输出序列.

有没有一个众所周知的算法,我可以阅读?或者我是否与Viterbi走在正确的轨道上,我只是没有看到如何应用它?

更新

我已经添加了一笔赏金来要求更深入地了解这个问题.(分析解释为什么不能采用有效的方法,除模拟退火之外的其他启发式/近似等)

algorithm machine-learning mathematical-optimization markov n-gram

20
推荐指数
3
解决办法
2263
查看次数