我以前的努力与Python NLTK
类似from nltk.tokenize import RegexpTokenizer
a = "miris ribe na balkanu"
capt1 = RegexpTokenizer('[a-b-c]\w+')
capt1.tokenize(a)
['be', 'balkanu']
这不是我想要的,肋骨被切成了b。这是由Tanzeel建议但没有帮助
>>> capt1
RegexpTokenizer(pattern='\x08[abc]\\w+', gaps=False, discard_empty=True, flags=56)
>>> a
'miris ribe na balkanu'
>>> capt1.tokenize(a)
[]
>>> capt1 = RegexpTokenizer('\b[a-b-c]\w+')
>>> capt1.tokenize(a)
[]
如何改变这一点,只留下最后一句话?
答案 0 :(得分:2)
您可能需要的是正则表达式中的单词边界/users/?location=london
以匹配单词的开头。
将正则表达式更新为\b
应该有效。
<强>更新强>
由于OP无法使用字边界来使用带有NLTK的正则表达式(字边界\b[abc]\w+
是一个有效的正则表达式元字符),我自己下载并使用NLTK测试了正则表达式。
此更新的正则表达式现在可以\b
使用,它会返回您期望的结果(?<=\s)[abc]\w+
。
之前没有使用NLTK所以我无法解释为什么字边界不起作用。
答案 1 :(得分:1)
RegexTokenizer的目的不是从输入中提取所选单词,而是根据您的规则将其分解为标记。要查找以a
,b
或c
开头的所有字词,请使用此字段:
import re
bwords = re.findall(r"\b[abc]\w*", 'miris ribe na balkanu')
我不太确定你的目标是什么,所以如果你的目标实际上是提取字符串中的最后一个单词,请使用:
word = re.findall(r"\b\w+$", 'miris ribe na balkanu')[0]
这匹配单词边界和字符串结尾之间的字母串。
答案 2 :(得分:0)
我认为你正在混淆匹配和标记化的概念。
这一行
capt1 = RegexpTokenizer('[abc]\w+')
(不要[a-b-c]
)说标记器应该查找a
,b
或c
并计算所有内容,直到结束这个词,作为一种象征。
我认为您要做的是标记您的数据,然后丢弃不以a
或b
或c
开头的任何令牌。
这是一个单独的步骤。
>>> capt1 = RegexpTokenizer('\w+')
>>> tokens = capt1.tokenize(a)
# --> ['miris', 'ribe', 'na', 'balkanu']
>>> selection = [t for t in tokens if t.startswith(('a','b','c'))]
# --> ['balkanu']
我在这里使用str.startswith()
因为它很简单,但你也可以使用正则表达式。但与tokenizer使用的不同。