去除文本中标点符号的java程序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了去除文本中标点符号的java程序相关的知识,希望对你有一定的参考价值。

去除中文文本中的所有标点符号,包括中文标点。,“”……等等,还有英文标点,."":;'\等等。。。还有英文字母。反正就是最后只剩光秃秃的中文文字。谢谢啦。
input.txt输入,output.txt输出。
麻烦大侠们了,帮忙编一下这个程序~~~

我不晓得怎么用代码编写
应该是用字符的对比吧
这样反正不是字符的就是符号
不过我还晓得一个笨办法
把java用记事本打开
然后“编辑”——“查找”
输入“;”号,点击“查找下一个”,这样一个一个的数,就知道有多少个“;”号了,其他符号一样
参考技术A 我不晓得怎么用代码编写
应该是用字符的对比吧
这样反正不是字符的就是符号
不过我还晓得一个笨办法
把java用记事本打开
然后“编辑”——“查找”
输入“;”号,点击“查找下一个”,这样一个一个的数,就知道有多少个“;”号了,其他符号一样
参考技术B //不知道output.txt和input.txt是什么方法就用控制台输入,System.out.println()输出了
public class Chinese

public static void main(String[] args)

String str=new String();
if(args.length==0)
System.out.println("写入你的字符串");
else
str=(args[0].replaceAll("[^\\u4e00-\\u9fa5]", ""));
System.out.println(str);


参考技术C class Test

public static void main(String[] args)
InputStreamReader dis = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(dis);
String str = "";
try
str = reader.readLine();
catch (IOException ex)
Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);

char[] chs = str.toCharArray();
ArrayList<Character> list = new ArrayList<Character>();
for (int i = 0; i < chs.length; i++)
if (Character.getType(chs[i]) == 5)
list.add(chs[i]);


char[] newchs = new char[list.size()];
for (int i = 0; i < newchs.length; i++)
newchs[i] = list.get(i);

System.out.println(new String(newchs));


测试的字符不包含全角输入的状态啊,你多弄点怪异符号看下可以的不,普通符号都可以过滤。本回答被提问者和网友采纳
参考技术D package com.test;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Test
private static final String REGULARS = "[\u4400-\u9fa5]*";
private static final String REGULAR = "[\u4400-\u9fa5]";

public static void main(String[] args) throws IOException
Test t=new Test();
ArrayList<StringBuffer> ss=t.loadFromFile("c:/54.txt");
t.Save(ss, "c:/6.txt");

/**
* 去除文件中的其它字符
*
* @param temp
* : 文件中未检查过的字符串
* */
public StringBuffer checkString(String temp)
StringBuffer sb = new StringBuffer();
if (temp.matches(REGULARS))
sb.append(temp);
else
for (int i = 0; i < temp.length(); i++)
char tem = temp.charAt(i);
if ((tem + "").matches(REGULAR))
sb.append(tem);



return sb;


/**
* 从文件 srcFile 读入文本
*
* @param srcFile
* : 未格式化的原文本文件
* */
public ArrayList<StringBuffer> loadFromFile(String srcFile)
throws IOException
File src = new File(srcFile);
BufferedReader reader = new BufferedReader(new FileReader(src));
String tmp;
ArrayList<StringBuffer> lines = new ArrayList<StringBuffer>();
while ((tmp = reader.readLine()) != null)
tmp = tmp.trim();
lines.add(checkString(tmp));

reader.close();
return lines;


/**
*
* @param data
* :格式化过的文件内容
* @param destFile
* :目标文件
* */

public boolean Save(ArrayList<StringBuffer> data, String destFile) throws IOException
File src = new File(destFile);
BufferedWriter writer = new BufferedWriter(new FileWriter(src));
for(int i=0;i<data.size();i++)
System.out.println(data.get(i).toString());
writer.write(data.get(i).toString());
if(!data.get(i).toString().equals(""))
writer.newLine();


writer.flush();
writer.close();
return true;



//给答案的人好多哦...凑个热闹

如何使用 NLTK 分词器去除标点符号?

【中文标题】如何使用 NLTK 分词器去除标点符号?【英文标题】:How to get rid of punctuation using NLTK tokenizer? 【发布时间】:2013-03-10 22:56:34 【问题描述】:

我刚开始使用 NLTK,我不太明白如何从文本中获取单词列表。如果我使用nltk.word_tokenize(),我会得到一个单词和标点符号列表。我只需要单词。我怎样才能摆脱标点符号? word_tokenize 也不适用于多个句子:在最后一个单词中添加点。

【问题讨论】:

为什么不自己删除标点符号呢? nltk.word_tokenize(the_text.translate(None, string.punctuation)) 应该可以在 python2 中使用,而在 python3 中你可以使用 nltk.work_tokenize(the_text.translate(dict.fromkeys(string.punctuation))) 这不起作用。文本没有任何反应。 NLTK 假设的工作流程是您首先将其标记为句子,然后将每个句子转换为单词。这就是为什么word_tokenize() 不能处理多个句子的原因。要去掉标点符号,可以使用正则表达式或python的isalnum()函数。 确实工作:&gt;&gt;&gt; 'with dot.'.translate(None, string.punctuation) 'with dot'(注意结果末尾没有点)如果你有类似'end of sentence.No space'的东西可能会导致问题,在这种情况下做改为:the_text.translate(string.maketrans(string.punctuation, ' '*len(string.punctuation))) 用空格替换所有标点符号。 顺便说一下,isalnum() 方法适用于 Unicode。 【参考方案1】:

正如在 cmets 中注意到的,以 sent_tokenize() 开头,因为 word_tokenize() 仅适用于单个句子。您可以使用 filter() 过滤掉标点符号。如果你有一个 unicode 字符串,请确保它是一个 unicode 对象(不是一个用一些编码如 'utf-8' 编码的 'str')。

from nltk.tokenize import word_tokenize, sent_tokenize

text = '''It is a blue, small, and extraordinary ball. Like no other'''
tokens = [word for sent in sent_tokenize(text) for word in word_tokenize(sent)]
print filter(lambda word: word not in ',-', tokens)

【讨论】:

Penn Treebank 分词器所涉及的大部分复杂性都与正确处理标点符号有关。如果您只想去除标点符号,为什么还要使用昂贵的标记器来很好地处理标点符号? word_tokenize 是一个返回 [token for sent in sent_tokenize(text, language) for token in _treebank_word_tokenize(sent)] 的函数。所以我认为你的答案是在做 nltk 已经做的事情:在使用 word_tokenize() 之前使用 sent_tokenize()。至少这是针对 nltk3 的。 @rmalouf 因为你不需要标点符号?所以你想要didn't 而不是.【参考方案2】:

看看 nltk 提供的其他标记化选项here。例如,您可以定义一个分词器,它挑选出字母数字字符序列作为令牌并丢弃其他所有内容:

from nltk.tokenize import RegexpTokenizer

tokenizer = RegexpTokenizer(r'\w+')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

输出:

['Eighty', 'seven', 'miles', 'to', 'go', 'yet', 'Onward']

【讨论】:

请注意,如果您使用此选项,您将失去 word_tokenize 特有的自然语言功能,例如拆分缩略词。您可以天真地拆分正则表达式 \w+,而不需要任何 NLTK。 为了说明@sffc 评论,您可能会丢失诸如“先生”之类的词 将 'n't' 替换为 't' 如何摆脱这种情况?【参考方案3】:

我刚刚使用了以下代码,删除了所有标点符号:

tokens = nltk.wordpunct_tokenize(raw)

type(tokens)

text = nltk.Text(tokens)

type(text)  

words = [w.lower() for w in text if w.isalpha()]

【讨论】:

为什么要将标记转换为文本?【参考方案4】:

我使用此代码删除标点符号:

import nltk
def getTerms(sentences):
    tokens = nltk.word_tokenize(sentences)
    words = [w.lower() for w in tokens if w.isalnum()]
    print tokens
    print words

getTerms("hh, hh3h. wo shi 2 4 A . fdffdf. A&&B ")

如果你想检查一个token是否是一个有效的英文单词,你可能需要PyEnchant

教程:

 import enchant
 d = enchant.Dict("en_US")
 d.check("Hello")
 d.check("Helo")
 d.suggest("Helo")

【讨论】:

请注意,此解决方案会杀死宫缩。那是因为word_tokenize 使用标准标记器TreebankWordTokenizer,它将收缩拆分(例如can't 到(can't)。但是n't 不是字母数字,并且在此过程中会丢失。跨度> 【参考方案5】:

您实际上并不需要 NLTK 来删除标点符号。您可以使用简单的 python 将其删除。对于字符串:

import string
s = '... some string with punctuation ...'
s = s.translate(None, string.punctuation)

或者对于 unicode:

import string
translate_table = dict((ord(char), None) for char in string.punctuation)   
s.translate(translate_table)

然后在你的分词器中使用这个字符串。

P.S. 字符串模块还有一些其他可以删除的元素集(如数字)。

【讨论】:

使用同样有效的列表表达式删除所有标点符号。 a = "*fa,fd.1lk#$" print("".join([w for w in a if w not in string.punctuation])) 这种方法在 python >= 3.1 中没有任何作用,因为translate 方法只需要一个参数。如果您仍想使用translate 方法,请参考this question。【参考方案6】:

我认为您需要某种正则表达式匹配(以下代码在 Python 3 中):

import string
import re
import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time."
l = nltk.word_tokenize(s)
ll = [x for x in l if not re.fullmatch('[' + string.punctuation + ']+', x)]
print(l)
print(ll)

输出:

['I', 'ca', "n't", 'do', 'this', 'now', ',', 'because', 'I', "'m", 'so', 'tired', '.', 'Please', 'give', 'me', 'some', 'time', '.']
['I', 'ca', "n't", 'do', 'this', 'now', 'because', 'I', "'m", 'so', 'tired', 'Please', 'give', 'me', 'some', 'time']

在大多数情况下应该可以很好地工作,因为它删除了标点符号,同时保留了诸如“n't”之类的标记,这些标记无法从诸如 wordpunct_tokenize 之类的正则表达式标记器中获得。

【讨论】:

这还将删除...-- 之类的内容,同时保留s.translate(None, string.punctuation) 不会的缩略词【参考方案7】:

以下代码将删除所有标点符号以及非字母字符。抄自他们的书。

http://www.nltk.org/book/ch01.html

import nltk

s = "I can't do this now, because I'm so tired.  Please give me some time. @ sd  4 232"

words = nltk.word_tokenize(s)

words=[word.lower() for word in words if word.isalpha()]

print(words)

输出

['i', 'ca', 'do', 'this', 'now', 'because', 'i', 'so', 'tired', 'please', 'give', 'me', 'some', 'time', 'sd']

【讨论】:

请注意,使用这种方法你会在“can't”或“don't”这样的情况下丢失“not”这个词,这对于理解和分类句子可能非常重要。最好使用 sentence.translate(string.maketrans("", "", ), chars_to_remove),其中 chars_to_remove 可以是 ".,':;!?" @MikeL 你不能通过在tokanizing之前导入contractions和contractions.fix(sentence_here)来绕过像“can't”和“don't”这样的词。它将“不能”变成“不能”,“不要”变成“不要”。【参考方案8】:

删除标点符号(它将删除 . 以及使用以下代码处理的部分标点符号)

        tbl = dict.fromkeys(i for i in range(sys.maxunicode) if unicodedata.category(chr(i)).startswith('P'))
        text_string = text_string.translate(tbl) #text_string don't have punctuation
        w = word_tokenize(text_string)  #now tokenize the string 

示例输入/输出:

direct flat in oberoi esquire. 3 bhk 2195 saleable 1330 carpet. rate of 14500 final plus 1% floor rise. tax approx 9% only. flat cost with parking 3.89 cr plus taxes plus possession charger. middle floor. north door. arey and oberoi woods facing. 53% paymemt due. 1% transfer charge with buyer. total cost around 4.20 cr approx plus possession charges. rahul soni

['direct', 'flat', 'oberoi', 'esquire', '3', 'bhk', '2195', 'saleable', '1330', 'carpet', 'rate', '14500', 'final', 'plus', '1', 'floor', 'rise', 'tax', 'approx', '9', 'flat', 'cost', 'parking', '389', 'cr', 'plus', 'taxes', 'plus', 'possession', 'charger', 'middle', 'floor', 'north', 'door', 'arey', 'oberoi', 'woods', 'facing', '53', 'paymemt', 'due', '1', 'transfer', 'charge', 'buyer', 'total', 'cost', 'around', '420', 'cr', 'approx', 'plus', 'possession', 'charges', 'rahul', 'soni']

【讨论】:

非常感谢【参考方案9】:

真诚地问一句,什么是词?如果您的假设是一个单词仅由字母字符组成,那么您就错了,因为诸如can't 之类的单词将被分解成碎片(例如cant如果您在标记化之前删除标点符号,这很可能会对您的程序产生负面影响。

因此解决方案是标记然后删除标点符号

import string

from nltk.tokenize import word_tokenize

tokens = word_tokenize("I'm a southern salesman.")
# ['I', "'m", 'a', 'southern', 'salesman', '.']

tokens = list(filter(lambda token: token not in string.punctuation, tokens))
# ['I', "'m", 'a', 'southern', 'salesman']

...然后,如果您愿意,可以将某些标记(例如 'm)替换为 am

【讨论】:

【参考方案10】:

@rmalouf 只是添加到解决方案中,这不会包含任何数字,因为 \w+ 等效于 [a-zA-Z0-9_]

from nltk.tokenize import RegexpTokenizer
tokenizer = RegexpTokenizer(r'[a-zA-Z]')
tokenizer.tokenize('Eighty-seven miles to go, yet.  Onward!')

【讨论】:

这个为每个字母创建一个标记。【参考方案11】:

不用 nltk (python 3.x) 也可以一行完成。

import string
string_text= string_text.translate(str.maketrans('','',string.punctuation))

【讨论】:

以上是关于去除文本中标点符号的java程序的主要内容,如果未能解决你的问题,请参考以下文章

Python使用jieba库分词并去除标点符号

dict_文本解析(去除标点符号)

java中怎么用toString方法去除字符串中的标点,符号和数字?

如何使用 NLTK 分词器去除标点符号?

python中用正则表达式去掉文本中所有的标点符号

java中 去除String中的特殊符号保留字母和数字