这里有没有人有编写自定义FTS3(全文搜索扩展名)标记符的经验?我正在寻找一个会忽略HTML标签的标记器.
谢谢.
我有一个我想要搜索的URL数据库.因为URL并不总是写成相同的(可能有也可能没有www),我正在寻找索引和查询URL的正确方法.我尝试了一些东西,我认为我很接近但不确定为什么它不起作用:
这是我的自定义字段类型:
<fieldType name="customUrlType" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0" preserveOriginal="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)
例如:
http://www.twitter.com/AndersonCooper 在编入索引时,将在不同的位置有以下单词:http,www,twitter,com,andersoncooper
如果我只搜索twitter.com/andersoncooper,我希望这个查询匹配索引的记录,这就是为什么我也使用WDF来分割搜索查询,但搜索查询最终是这样的:
myfield :("twitter com andersoncooper")真的希望它匹配所有包含以下所有单词的记录:twitter com andersoncooper
我应该使用不同的查询过滤器或标记器吗?
如何使Lucene的标准分析器在'.'上进行标记化.炭?例如,在查询"B"时,我需要它返回"ABC"中的B作为结果.我需要按标准分析仪处理它的方式处理数字,因此Simple分析器是不够的.如果我可以指定标准分析器来标记''',那将是完美的.char也是.如果我不得不用这个小扩展编写我自己的标记器,我该怎么办?谢谢,Nacha
我不确定如何为词法分析器标记源代码.现在,我只能想到使用正则表达式将字符串解析为具有给定规则的数组(标识符,符号,如+, - 等).
例如,
begin x:=1;y:=2;
Run Code Online (Sandbox Code Playgroud)
然后我想标记单词,变量(在这种情况下为x,y)和每个符号(:,=,;).
如果你有这个代码:
"......".Split(new String[]{"...", ".."}, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)
生成的数组元素是:
1. ""
2. ""
3. ""
Run Code Online (Sandbox Code Playgroud)
现在,如果你颠倒了分隔符的顺序,
"......".Split(new String[]{"..", "..."}, StringSplitOptions.None);
Run Code Online (Sandbox Code Playgroud)
生成的数组元素是:
1. ""
2. ""
3. ""
4. ""
Run Code Online (Sandbox Code Playgroud)
从这两个例子中,我倾向于得出结论,当从左到右遍历数组的每个元素时,Split方法递归地标记化.
但是,一旦我们将包含字母数字字符的分隔符放入等式中,很明显上述理论是错误的.
"5.x.7".Split(new String[]{".x", "x."}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)
结果是: 1. "5" 2. ".7"
"5.x.7".Split(new String[]{"x.", ".x"}, StringSplitOptions.None)
Run Code Online (Sandbox Code Playgroud)
结果是: 1. "5" 2. ".7"
这次我们获得相同的输出,这意味着基于第一组示例理论化的规则不再适用.(即:如果始终根据数组中分隔符的位置确定分隔符优先级,那么在最后一个示例中,我们将获得"5."&"7"而不是"5"&".7".
至于为什么我浪费时间去猜测.NET标准API是如何工作的,这是因为我想为我的java应用程序实现类似的功能,但是StringTokenizer和org.apache.commons.lang.StringUtils都没有提供拆分的能力.使用多个多字符分隔符的字符串(即使我要找到提供此功能的API,也很难知道它是否始终使用String.Split方法使用的相同算法进行标记.
我正在建立一个学习基本编程的网站,我将使用伪语言,用户可以在其中提交代码,我需要解释它.但是我不确定如何在PHP中构建一个tokenizer.
有一个像这样的片段:
a = 1
b = 2
c = a - b
if(a > b) {
buy(a)
} else {
buy(b)
}
Run Code Online (Sandbox Code Playgroud)
我该如何将这些代码分成令牌?
-
这就是我现在正在尝试的事情:
$tokens = array();
// First token (define string)
$token = strtok($botCode, '=');
$tokens[] = $token;
// Loop
while($token) {
$token = strtok('=');
$tokens[] = $token;
}
Run Code Online (Sandbox Code Playgroud)
然而,我还没有弄清楚如何使用strtok与常规表达式列表...我可以做类似于strtok但是接受数组作为带有substr和strrpos的针但是在我看来它应该是可能的用strtok做的,因为它专为此而设计.任何信息或指向正确的方向将不胜感激
我正在使用Python和nltk.我需要用英语处理一些没有任何空格的文本,但nltk中的word_tokenize函数无法处理这样的问题.那么如何在没有任何空格的情况下标记文本.Python中有任何工具吗?
我有一个索引,如下面的设置和映射;
{
"settings":{
"index":{
"analysis":{
"analyzer":{
"analyzer_keyword":{
"tokenizer":"keyword",
"filter":"lowercase"
}
}
}
}
},
"mappings":{
"product":{
"properties":{
"name":{
"analyzer":"analyzer_keyword",
"type":"string",
"index": "not_analyzed"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在努力为name字段上的通配符搜索实现.我的示例数据是这样的;
[
{"name": "SVF-123"},
{"name": "SVF-234"}
]
Run Code Online (Sandbox Code Playgroud)
当我执行以下查询时;
http://localhost:9200/my_index/product/_search -d '
{
"query": {
"filtered" : {
"query" : {
"query_string" : {
"query": "*SVF-1*"
}
}
}
}
}'
Run Code Online (Sandbox Code Playgroud)
它返回SVF-123,SVF-234.我认为,它仍然是数据的标记.它必须只返回SVF-123.
你能帮忙吗?
提前致谢
可以在Keras中使用n-gram吗?
例如,句子在X_train数据帧中包含"句子"列.
我以下列方式使用Keras的tokenizer:
tokenizer = Tokenizer(lower=True, split=' ')
tokenizer.fit_on_texts(X_train.sentences)
X_train_tokenized = tokenizer.texts_to_sequences(X_train.sentences)
Run Code Online (Sandbox Code Playgroud)
然后我填写句子:
X_train_sequence = sequence.pad_sequences(X_train_tokenized)
Run Code Online (Sandbox Code Playgroud)
我还使用一个简单的LSTM网络:
model = Sequential()
model.add(Embedding(MAX_FEATURES, 128))
model.add(LSTM(32, dropout=0.2, recurrent_dropout=0.2,
activation='tanh', return_sequences=True))
model.add(LSTM(64, dropout=0.2, recurrent_dropout=0.2, activation='tanh'))
model.add(Dense(number_classes, activation='sigmoid'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop',
metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
在这种情况下,tokenizer执行.在Keras docs:https://keras.io/preprocessing/text/ 我看到字符处理是可能的,但这不适合我的情况.
我的主要问题:我可以将n-gram用于NLP任务(不仅仅是情感分析,而是任何NLP任务)
澄清一下:我不仅要考虑单词而且要考虑单词组合.我想尝试看看它是否有助于模拟我的任务.
我想使用spacy的POS标记,NER和依赖项解析,而不使用单词标记化。确实,我的输入是表示一个句子的标记列表,并且我想尊重用户的标记化。使用spacy或任何其他NLP软件包,这是否完全可能?
现在,我正在使用基于spacy的函数以Conll格式放置一个句子(一个unicode字符串):
import spacy
nlp = spacy.load('en')
def toConll(string_doc, nlp):
doc = nlp(string_doc)
block = []
for i, word in enumerate(doc):
if word.head == word:
head_idx = 0
else:
head_idx = word.head.i - doc[0].i + 1
head_idx = str(head_idx)
line = [str(i+1), str(word), word.lemma_, word.tag_,
word.ent_type_, head_idx, word.dep_]
block.append(line)
return block
conll_format = toConll(u"Donald Trump is the new president of the United States of America")
Output:
[['1', 'Donald', u'donald', u'NNP', u'PERSON', '2', u'compound'],
['2', 'Trump', u'trump', u'NNP', u'PERSON', '3', u'nsubj'], …Run Code Online (Sandbox Code Playgroud)