我有一些合理的(没有混淆的)Perl源文件,我需要一个tokenizer,它会将它拆分为令牌,并返回每个令牌的令牌类型,例如脚本
print "Hello, World!\n";
Run Code Online (Sandbox Code Playgroud)
它会返回这样的东西:
哪个是最好的库(最好用Perl编写)呢?它必须是合理正确的,即它应该能够解析语法结构qq{{\}}},但它不必知道像Lingua :: Romana :: Perligata这样的特殊解析器.我知道解析Perl是Turing-complete,并且只有Perl本身才能正确完成,但我不需要绝对的正确性:tokenizer可能会失败或不兼容或在某些非常罕见的极端情况下假设某些默认值,但它应该工作大部分时间都是正确的.它必须比普通文本编辑器中内置的语法高亮更好.
仅供参考我在pygments中尝试了PerlLexer ,这对于大多数构造都是合理的,除了它print在这一个中找不到第二个关键字:
print length(<<"END"); print "\n";
String
END
Run Code Online (Sandbox Code Playgroud) 这里有没有人有编写自定义FTS3(全文搜索扩展名)标记符的经验?我正在寻找一个会忽略HTML标签的标记器.
谢谢.
我不确定如何为词法分析器标记源代码.现在,我只能想到使用正则表达式将字符串解析为具有给定规则的数组(标识符,符号,如+, - 等).
例如,
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方法使用的相同算法进行标记.
我正在开发一个clojure项目,它可以与任何java类互操作,所以我的问题的答案可能是java或clojure.
基本上我需要能够根据给定的分隔符(将超过一个字符)将字符串拆分为组件,但同时保留分隔符.
例如:
splitting "test:test:test" on ":" => [ "test" ":" "test" ":" "test" ]
splitting "::test::test::" on "::" => [ "::" "test" "::" "test" "::" ]
Run Code Online (Sandbox Code Playgroud)
我使用clojure来使用壁橱clojure.string/split,但它实际上并没有返回分隔符.第二个最接近的是使用StringTokenizer,它确实返回分隔符但不接受多字符分隔符.
有没有人知道任何解决方案,然后只是将字符串分成一系列字符并运行奇怪的减少?
我正在使用Python和nltk.我需要用英语处理一些没有任何空格的文本,但nltk中的word_tokenize函数无法处理这样的问题.那么如何在没有任何空格的情况下标记文本.Python中有任何工具吗?
我tokenize在Python中使用该模块,并想知道为什么有2个不同的换行符号:
NEWLINE = 4
NL = 54
Run Code Online (Sandbox Code Playgroud)
任何产生两个令牌的代码示例都将受到赞赏.
我正在使用nltk.word_tokenize对文本进行标记,我还希望将原始原始文本中的索引转换为每个标记的第一个字符,即
import nltk
x = 'hello world'
tokens = nltk.word_tokenize(x)
>>> ['hello', 'world']
Run Code Online (Sandbox Code Playgroud)
我怎样才能得到[0, 7]与令牌的原始索引相对应的数组?
可以在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)